Ruby: рассуждения о наследовании
Конечно, классы в Ruby открыты для расширения. Но порядок интерпретации влияет на результат. Пример:
class A
end
class B < A
end
class B
def m
end
end
Так работает. Но если поменять местами два последних определения, то возникает сообщение об ошибке: superclass mismatch for class B (TypeError)
, поскольку указать базовый класс можно только при первоначальном определении класса.
Вообще, возможность добавления методов в существующий класс заставляет переосмыслить роль механизма наследования. На первый взгляд, в Ruby с открытыми определениями классов, динамической типизацией и duck typing наследование не требуется!
Программисты, "думающие" на C++/Java часто используют наследование не по назначению. Обсуждая с коллегой вопрос "зачем нужно наследование?" я наткнулся на быстрый ответ: для переиспользования кода. В этом и есть корень зла -- при отсутствии нормальных механизмов повторного использования кода в этом качестве начинают использовать наследование. Но в Ruby-то такие механизмы есть. Так зачем наследование?
Похоже, что в Ruby и подобных языках наследование вернулось к своему первоначальному назначению -- выразить намерение программиста, что один тип является подтипом другого. Кстати, если вспомнить принцип подстановки Лисков (Liskov substitution principle), то становится понятно, что подтип (subtype) тесно связан с подстановкой (substitution).
Вывод: используйте наследование в первую очередь как способ описания используемой модели, проектного решения. А уж потом реализуйте в классах требуемые методы.»
07.04.2008
Метки: Ruby Рубрики: Разработка, Языки
4 комментария
Ruby: всякая всячина
Продолжаю погружаться в мир Ruby. Для систематического рассказа пока не время, но путевых заметок уже накопилось, пора записывать для памяти.»
25.03.2008
Метки: Ruby Рубрики: Разработка, Языки
Комментариев нет
Первый взгляд на Ruby
Новогодние каникулы оказались подходящим случаем для общего знакомства с Ruby. Особой склонности к языкам с динамической типизацией я не испытываю — применимость их в больших проектах весьма сомнительна. В Ruby же привлекли возможности метапрограммирования и их использование для реализации DSL (Domain Specific Languages). Кроме того, хотелось понять, что позволяет преодолеть недостатки динамической типизации при использовании Ruby в достаточно больших проектах.»
13.01.2008
Метки: Ruby Рубрики: Разработка, Языки
Комментариев нет