пятница, 4 июня 2010 г.

О наследовании

Избегайте многоуровневых иерархий наследования. Создание многоуровневых иерархий наследования значительно повышает число ошибок.  Многоуровневые иерархии повышают сложность, что диаметрально противоположно цели наследования. Убедитесь, что используете наследование, чтобы избежать дублирования кода и минимизировать сложность.



Предпочитайте полиморфизм, а не крупномасштабную проверку типов. Наличие в коде большого числа блоков case может указывать на то, что программу лучше было бы спроектировать, используя наследование, хотя это верно не всегда.

Пример кода, который, пожалуй, не следует заменять вызовом полиморфного метода (С++)
switch ( ui.Command() ) {
  case Command_OpenFile:
    OpenFile();
    break;


  case Command_Exit:
    ...
}
В данном случае можно было бы создать базовый класс и унаследовать от него ряд производных классов, выполняющих каждую команду при помощи полиморфного метода DoCommand() (как в  шаблоне Команда). Но в подобной простой ситуации это неуместно: имя метода было бы слишком туманным и неинформативным в сравнении с case-блоками.

Делайте все данные закрытыми, а не защищенными. Выполняя наследование от классы, вы получаете привилегированный доступ к его защищенным методам и данным. Если производному классу на самом деле нужен доступ к атрибутам базового класса, включите а базовый класс защищенные методы доступа.

Множественное наследование полезно главным образом только при создании «примесей» (mixin). Mixin-ы почти всегда являются абстрактными и не поддерживают создания экземпляров независимо от других обьектов. 
...
Похоже, разработчики Java и Visual Basix понимали ценность миксинов, разрешив множественное наследование интерфейсов, но только единичное наследование классов.

Комментариев нет:

Отправить комментарий