Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Вопрос о принципах ООП. / 19 сообщений из 19, страница 1 из 1
07.08.2010, 17:33:54
    #36780601
deniskodua
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о принципах ООП.
В книге Трея Неша "C# 2010 ускоренный курс для профессионалов" на стр 146 говориться о том, что наследование может разрушить инкапсуляцию.
Цитирую:
Другой важный аспект наследования состоит в том, что оно может быть вредным: наследование может разрушить инкапсуляцию и всегда усиливает связанность.
Наверняка все согласны с тем, что инкапсуляция - наиболее фундаментальная и важная объектно - ориентированная концепция. Если это так, то зачем разрушать её? Если в поддержку инкапсуляции базовый тип содержит защищённые поля, а вы нарушаете целостность оболочки инкапсуляции и открываете внутренности базового класса, то это не может быть хорошо.
Ниже рассматриваются доступные альтернативы, которые позволяют разработать лучший дизайн.
Многие описывают наследование как повторное использование типа "белого ящика".
Лучшая форма повторного использования - это "черный ящик", когда внутренности обета не открываются внешнему миру. Достичь этого можно, применив отношение включения (containment).
Да, это правильно. Вместо наследования нового класса от другого, можно включить экземпляр этого другого класса в создаваемый, тем самым повторно используя класс включенного типа без нарушения инкапсуляции. Недостаток такого приёма связан с тем, что в большинстве языков, включая C#, это потребует чуть больше работы по кодированию, хотя не на много. Зато в результате получится более адаптируемый дизайн.
Конец цитаты.
Так вот мне не понятно КАК НАСЛЕДОВАНИЕ РАЗРУШАЕТ ИНКАПСУЛЯЦИЮ!?!?
Объявляем поля как prived и они не будут доступны в наследнике.
...
Рейтинг: 0 / 0
07.08.2010, 17:47:47
    #36780605
k0rvin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о принципах ООП.
видимо имелась в виду инкапсуляция и наследование в C#
...
Рейтинг: 0 / 0
07.08.2010, 17:56:03
    #36780608
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о принципах ООП.
может неточности перевода?
ведь применяют агрегацию вместо наследования не в целях инкапсуляции.
...
Рейтинг: 0 / 0
07.08.2010, 19:13:14
    #36780640
Denis.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о принципах ООП.
Разрушает по ряду причин
защищенные поля
виртуальные методы, например не заюзал Template method где следует, наследник переопределил метод, поломал класс
добавил в базовый класс метод - он появился во всех дочерних, возможны какие то конфдикты итд

Вообщем смысл в том, что класс уже перестает быть вещью в себе, а часть его внутренностей выносится в другие места. Бывает очень легко запутаться в витиеватой иерархии наследования, и в один прекрасный момент, когда тебе надо поменять нечто в базовом классе, ты начинаешь упорно думать, а не поломаешь ли ты нечто в 10 местах. С другой стороны предпочитая делегацию наследованию таких проблем можно избежать. Вообще делегация и полиморфизм через интерфейсы "наш" метод :-)
ЗЫ. Я не против наследования, это очень мощная вещь, но я всецело согласен с Нешем по данному вопросу.
...
Рейтинг: 0 / 0
09.08.2010, 07:22:51
    #36781401
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о принципах ООП.
Denis.Разрушает по ряду причин
защищенные поля
виртуальные методы, например не заюзал Template method где следует, наследник переопределил метод, поломал класс
добавил в базовый класс метод - он появился во всех дочерних, возможны какие то конфдикты итд

Вообщем смысл в том, что класс уже перестает быть вещью в себе, а часть его внутренностей выносится в другие места. Бывает очень легко запутаться в витиеватой иерархии наследования, и в один прекрасный момент, когда тебе надо поменять нечто в базовом классе, ты начинаешь упорно думать, а не поломаешь ли ты нечто в 10 местах. С другой стороны предпочитая делегацию наследованию таких проблем можно избежать. Вообще делегация и полиморфизм через интерфейсы "наш" метод :-)
ЗЫ. Я не против наследования, это очень мощная вещь, но я всецело согласен с Нешем по данному вопросу.
Я думаю что тут ещё возможен случай, когда переопределяется функция, с более широким модификатором доступа, чем в базовом классе. Например было protected, стало public.
...
Рейтинг: 0 / 0
09.08.2010, 10:02:10
    #36781523
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о принципах ООП.
авторНаверняка все согласны с тем, что инкапсуляция - наиболее фундаментальная и важная объектно - ориентированная концепция.
не важная,
не фундаментальная,
и, вообще, не объектно ориентированная концепция.
...
Рейтинг: 0 / 0
09.08.2010, 10:02:49
    #36781524
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о принципах ООП.
а, возможно, и не концепция
...
Рейтинг: 0 / 0
09.08.2010, 10:20:03
    #36781555
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о принципах ООП.
tchingizавторНаверняка все согласны с тем, что инкапсуляция - наиболее фундаментальная и важная объектно - ориентированная концепция.
не важная,
не фундаментальная,
и, вообще, не объектно ориентированная концепция.

на счет того что не важная - не согласен.
программирование - борьба со сложностью, а инкапсуляция здесь помогает.
...
Рейтинг: 0 / 0
09.08.2010, 13:40:27
    #36782061
_мод
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о принципах ООП.
tchingizа, возможно, и не концепция
Конечно нет. Побочный эффект модульности.
...
Рейтинг: 0 / 0
09.08.2010, 15:41:31
    #36782475
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о принципах ООП.
"Да, это правильно. Вместо наследования нового класса от другого, можно включить экземпляр этого другого класса в создаваемый, тем самым повторно используя класс включенного типа без нарушения инкапсуляции." И получить старый VB or VBA, где наследования отродясь не было и приходится изворачиваться именно таким способом.
ИМХО, либо бред и чел сам не понял что написал, либо перевод.
...
Рейтинг: 0 / 0
09.08.2010, 18:03:26
    #36782832
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о принципах ООП.
YUBA"Да, это правильно. Вместо наследования нового класса от другого, можно включить экземпляр этого другого класса в создаваемый, тем самым повторно используя класс включенного типа без нарушения инкапсуляции." И получить старый VB or VBA, где наследования отродясь не было и приходится изворачиваться именно таким способом.
ИМХО, либо бред и чел сам не понял что написал, либо перевод.

читал эту книгу, и с автором согласен, и главное - он не единственный кто такое советует.
также автор советует герметизировать все классы, если только автор класса специально не спроектировал его, как базовый для наследования.
...
Рейтинг: 0 / 0
09.08.2010, 22:31:38
    #36783055
deniskodua
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о принципах ООП.
И даже больше :)
Ещё автор говорит, что "Ещё один не достаток применения наследования заключается в том, что оно не динамично. Наследование статично в силу того факта, что определяется на этапе компиляции. Такое положение дел может оказаться, как минимум, весьма ограничивающим. Применяя включение, вы устраняете это ограничение. Однако чтобы сделать это, также следует заручиться поддержкой со стороны хорошего друга - полиморфизма. При этом включающий тип может быть, скажем, интерфейсным типом. Тогда включаемый объект просто должен поддерживать контракт этого интерфейса, чтобы повторно использоваться контейнером. Более того, этот объект можно изменить во время выполнения. Задумайтесь об этом на минутку. Предположим, что есть объект, представляющий контейнер сортируемых объектов. В этом контейнерном типе предусмотрен алгоритм сортировки по умолчанию. Если вы реализуете этот алгоритм по умолчанию как включаемый тип, который можно подменить вовремя выполнения, тогда, если того требует предметная область, вы всегда сможете заменить его собственным специальным алгоритмом сортировки - до тех пор, пока объект нового алгоритма сортировки реализует необходимый интерфейс, ожидаемый контейнерным типом. Такая техника известна как шаблон проектирования Strategy (Стратегия)"

Действительно что ли наследование это не так уж и хорошо...
...
Рейтинг: 0 / 0
10.08.2010, 13:34:03
    #36783924
k0rvin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о принципах ООП.
deniskoduaИ даже больше :)
Ещё автор говорит, что "Ещё один недостаток применения наследования заключается в том, что оно не динамично. Наследование статично в силу того факта, что определяется на этапе компиляции. Такое положение дел может оказаться, как минимум, весьма ограничивающим. Применяя включение, вы устраняете это ограничение. Однако чтобы сделать это, также следует заручиться поддержкой со стороны хорошего друга - полиморфизма. При этом включающий тип может быть, скажем, интерфейсным типом. Тогда включаемый объект просто должен поддерживать контракт этого интерфейса, чтобы повторно использоваться контейнером. Более того, этот объект можно изменить во время выполнения. Задумайтесь об этом на минутку. Предположим, что есть объект, представляющий контейнер сортируемых объектов. В этом контейнерном типе предусмотрен алгоритм сортировки по умолчанию. Если вы реализуете этот алгоритм по умолчанию как включаемый тип, который можно подменить вовремя выполнения, тогда, если того требует предметная область, вы всегда сможете заменить его собственным специальным алгоритмом сортировки - до тех пор, пока объект нового алгоритма сортировки реализует необходимый интерфейс, ожидаемый контейнерным типом. Такая техника известна как шаблон проектирования Strategy (Стратегия)"

Действительно что ли наследование это не так уж и хорошо...

он так рано или поздно всё-таки придумает MOP =)
...
Рейтинг: 0 / 0
10.08.2010, 17:43:59
    #36784593
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о принципах ООП.
deniskoduaИ даже больше :) ......
Действительно что ли наследование это не так уж и хорошо... Наследование оч. хорошо там, где оно действительно нужно.
Если Вам нужны из некоего класса какие-то его методы и данные и типа все, то действительно, либо создаешь экземпляр, либо интерфейс, в зависимости от аппетита.
Это как с кошками. Вы просто не умеете их готовить. :)
...
Рейтинг: 0 / 0
12.08.2010, 10:25:45
    #36787592
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о принципах ООП.
YUBA"Да, это правильно. Вместо наследования нового класса от другого, можно включить экземпляр этого другого класса в создаваемый, тем самым повторно используя класс включенного типа без нарушения инкапсуляции." И получить старый VB or VBA, где наследования отродясь не было и приходится изворачиваться именно таким способом.
ИМХО, либо бред и чел сам не понял что написал, либо перевод.
Это нормальный подход, если полиморфизм не требуется.
...
Рейтинг: 0 / 0
12.08.2010, 10:39:36
    #36787640
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о принципах ООП.
k0rvin

он так рано или поздно всё-таки придумает MOP =)
Вы про какой МОР? Гугл сходу выдал несколько вариантов.
...
Рейтинг: 0 / 0
12.08.2010, 11:35:11
    #36787827
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о принципах ООП.
XDiaBLok0rvin

он так рано или поздно всё-таки придумает MOP =)
Вы про какой МОР? Гугл сходу выдал несколько вариантов.
наверное лисповский
...
Рейтинг: 0 / 0
12.08.2010, 16:03:37
    #36788796
distinger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о принципах ООП.
Фаулер агрегацию определяет как вид наследования.
...
Рейтинг: 0 / 0
12.08.2010, 20:13:06
    #36789458
k0rvin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о принципах ООП.
ZyK_BotaN
наверное лисповский
ну MOP он сам по себе, например SmallTalk поддерживает MOP, в Ruby вроде элементы есть (а может и полноценный)
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Вопрос о принципах ООП. / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]