• софт, хард & интERнет

  • Личный опыт укрощения компьютеров

7 апреля 2008

Ruby: рассуждения о наследовании

Рубрики: 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).

Вывод: используйте наследование в первую очередь как способ описания используемой модели, проектного решения. А уж потом реализуйте в классах требуемые методы.

Ответов: 4

25 марта 2008

Ruby: всякая всячина

Рубрики: Ruby, Проблемы, Разработка, Языки

Продолжаю погружаться в мир Ruby. Для систематического рассказа пока не время, но путевых заметок уже накопилось, пора записывать для памяти.

Далее »

Нет ответов

13 января 2008

Первый взгляд на Ruby

Рубрики: Ruby, Разработка, Языки

Новогодние каникулы оказались подходящим случаем для общего знакомства с Ruby. Особой склонности к языкам с динамической типизацией я не испытываю — применимость их в больших проектах весьма сомнительна. В Ruby же привлекли возможности метапрограммирования и их использование для реализации DSL (Domain Specific Languages). Кроме того, хотелось понять, что позволяет преодолеть недостатки динамической типизации при использовании Ruby в достаточно больших проектах.

Далее »

Нет ответов





 

26 queries. 1.400 seconds.