---
title: "Миксины vs Наследование"
description: "Пишу данный пост чтобы избавиться от давно мучавшей проблемы: \"Почему в Rails используется наследова..."
author: "2kost"
published: "2010-01-17T05:17:42+00:00"
modified: "2010-01-17T05:17:42+00:00"
locale: "ru"
canonical_url: "https://yvision.kz/post/miksiny-vs-nasledovanie-27466"
markdown_url: "https://yvision.kz/post/miksiny-vs-nasledovanie-27466/markdown"
site_name: "Yvision.kz"
---

# Миксины vs Наследование

> Пишу данный пост чтобы избавиться от давно мучавшей проблемы: "Почему в Rails используется наследова...

Пишу данный пост чтобы избавиться от давно мучавшей проблемы: "Почему в Rails используется наследование, а не миксины". Вообще, задумался об этом давно, точнее мне об этом рассказал Дейв Томас в своем видеоролике(хз как это назвать, может быть скринкаст).

Чтобы было понятнее, я сделал несколько скриншотов.

Для начала объясню, зачем вообще нужны наследование и прочие объектно-ориентированые штуки.

Рис. 1 Тру говнокод

[!\[Pics.kz\](http://pics.kz/s5/7d/27/3f/f2/7d273ff28378551e0b75571bf337284d_preview.jpg)](http://pics.kz/viewfull846244)

Как видно(если кликнуть на картинку), код дублируется. А зачем?

Warning!!!

Внимательно посмотрите, на методы find! Разве они должны принадлежать объекту? НЕТ! Поэтому быстро переписываем чтобы дальше было ясно, что нам надо разделять методы объектов и класса.

Рис.2 Чуть-чуть пофиксеный говнокод

[!\[Pics.kz\](http://pics.kz/s4/4c/dd/9b/a7/4cdd9ba7218a037b234c57a704ca386f_preview.jpg)](http://pics.kz/viewfull846245)

Ну от одной ошибки уже избавились.(Да, там и сейчас полная фигня. Возвращаются строки и прочий треш, но давайте сделаем вид, что так и надо. Главное что видим селект например. Короче делаем вид, что всё работает)

Итак, приступаем к написанию родительского класса. Я назвал его ActiveRecord. Да, именно так.

Рис. 3 Родительский класс.

[!\[Pics.kz\](http://pics.kz/s2/c4/3e/04/11/c43e04117f182f5da3fe36311abec45d_preview.jpg)](http://pics.kz/viewfull846246)

Немного руби магии и наш говнокод всё-ещё работает!

Мы вынесли весь ДБ треш из классов и теперь можем спокойно создавать и выбирать объекты из бд(^.^ да, я немного преувеличил). И никакого кода внутри классов User и Comment! О нас позаботился родительский класс.

Но сколько может быть родительских классов? Почему мы можем наследовать только от одного класса. Может я хочу наследовать деньги от Рокфеллеров, а внешность от парочки Питт-Джоли. Хм, сейчас мы сделаем первый шаг навстречу светлому будущему!!!

Рис. 4 Итак, миксины!!

[!\[Pics.kz\](http://pics.kz/s5/1d/71/4b/c9/1d714bc9df638e386b2da4c18ef4418b_preview.jpg)](http://pics.kz/viewfull846247)

Уже лучше. Немного руби магии и мы можем использовать методы уровня объекта и уровня класса. Только неохото писать везде extend=( Что ж, и тут мы можем немного облегчить себе жизнь и не запоминать, что надо include, а что extend.

Рис.5 Больше никто не забудет написать extend.

[!\[Pics.kz\](http://pics.kz/s1/fc/d2/29/b5/fcd229b5272970967045aa5770a7f422_preview.jpg)](http://pics.kz/viewfull846248)

ОО, наш код стал идеальным(хи хи хи)

И пара скринов, зачем мы писали всё предыдущее надругательство над Rails

Допустим, у нас есть классы юзер и коммент. Нам надо их хранить и получать их БД. Благодаря модулю Persistable, эта фигулина у нас работает. Теперь представим, что у нас добавился класс Person(да, я хочу чтобы он не хранился в БД. Такой дурачок, который работает только чтобы показать свой возраст и т.п.). Допустим, он чем-то схож с User. Вычленяем это в Humanized и вуаля!

Рис 6 (1,2) }{уманайзед!

[!\[Pics.kz\](http://pics.kz/s4/c8/0b/00/5f/c80b005f68926575c05b1ceee24b901c_preview.jpg)](http://pics.kz/viewfull846251)

[!\[Pics.kz\](http://pics.kz/s5/ec/8e/e9/17/ec8ee9177dc358285110cef2bc3a63f1_preview.jpg)](http://pics.kz/viewfull846252)

Хорошо, Вы скажите, а зачем вообще всё это? Да по - любому Person хранится в БД. Значит он с User один и тот же класс, только у User есть дата регистрации и пароль. Делаем суперкласс HumanInDB и все! Но тогда у нас отлетает Comments же! Ладно, скажете Вы, пусть так. Делаем суперкласс StuffFromDB, от него HumanInDB и Comments наследуем например.

ОК, Вы меня победили. FUUUUCCKKKK!!!

---

Source: [https://yvision.kz/post/miksiny-vs-nasledovanie-27466](https://yvision.kz/post/miksiny-vs-nasledovanie-27466)