|
|
|
Вопрос о принципах ООП.
|
|||
|---|---|---|---|
|
#18+
В книге Трея Неша "C# 2010 ускоренный курс для профессионалов" на стр 146 говориться о том, что наследование может разрушить инкапсуляцию. Цитирую: Другой важный аспект наследования состоит в том, что оно может быть вредным: наследование может разрушить инкапсуляцию и всегда усиливает связанность. Наверняка все согласны с тем, что инкапсуляция - наиболее фундаментальная и важная объектно - ориентированная концепция. Если это так, то зачем разрушать её? Если в поддержку инкапсуляции базовый тип содержит защищённые поля, а вы нарушаете целостность оболочки инкапсуляции и открываете внутренности базового класса, то это не может быть хорошо. Ниже рассматриваются доступные альтернативы, которые позволяют разработать лучший дизайн. Многие описывают наследование как повторное использование типа "белого ящика". Лучшая форма повторного использования - это "черный ящик", когда внутренности обета не открываются внешнему миру. Достичь этого можно, применив отношение включения (containment). Да, это правильно. Вместо наследования нового класса от другого, можно включить экземпляр этого другого класса в создаваемый, тем самым повторно используя класс включенного типа без нарушения инкапсуляции. Недостаток такого приёма связан с тем, что в большинстве языков, включая C#, это потребует чуть больше работы по кодированию, хотя не на много. Зато в результате получится более адаптируемый дизайн. Конец цитаты. Так вот мне не понятно КАК НАСЛЕДОВАНИЕ РАЗРУШАЕТ ИНКАПСУЛЯЦИЮ!?!? Объявляем поля как prived и они не будут доступны в наследнике. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2010, 17:33 |
|
||
|
Вопрос о принципах ООП.
|
|||
|---|---|---|---|
|
#18+
видимо имелась в виду инкапсуляция и наследование в C# ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2010, 17:47 |
|
||
|
Вопрос о принципах ООП.
|
|||
|---|---|---|---|
|
#18+
может неточности перевода? ведь применяют агрегацию вместо наследования не в целях инкапсуляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2010, 17:56 |
|
||
|
Вопрос о принципах ООП.
|
|||
|---|---|---|---|
|
#18+
Разрушает по ряду причин защищенные поля виртуальные методы, например не заюзал Template method где следует, наследник переопределил метод, поломал класс добавил в базовый класс метод - он появился во всех дочерних, возможны какие то конфдикты итд Вообщем смысл в том, что класс уже перестает быть вещью в себе, а часть его внутренностей выносится в другие места. Бывает очень легко запутаться в витиеватой иерархии наследования, и в один прекрасный момент, когда тебе надо поменять нечто в базовом классе, ты начинаешь упорно думать, а не поломаешь ли ты нечто в 10 местах. С другой стороны предпочитая делегацию наследованию таких проблем можно избежать. Вообще делегация и полиморфизм через интерфейсы "наш" метод :-) ЗЫ. Я не против наследования, это очень мощная вещь, но я всецело согласен с Нешем по данному вопросу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2010, 19:13 |
|
||
|
Вопрос о принципах ООП.
|
|||
|---|---|---|---|
|
#18+
Denis.Разрушает по ряду причин защищенные поля виртуальные методы, например не заюзал Template method где следует, наследник переопределил метод, поломал класс добавил в базовый класс метод - он появился во всех дочерних, возможны какие то конфдикты итд Вообщем смысл в том, что класс уже перестает быть вещью в себе, а часть его внутренностей выносится в другие места. Бывает очень легко запутаться в витиеватой иерархии наследования, и в один прекрасный момент, когда тебе надо поменять нечто в базовом классе, ты начинаешь упорно думать, а не поломаешь ли ты нечто в 10 местах. С другой стороны предпочитая делегацию наследованию таких проблем можно избежать. Вообще делегация и полиморфизм через интерфейсы "наш" метод :-) ЗЫ. Я не против наследования, это очень мощная вещь, но я всецело согласен с Нешем по данному вопросу. Я думаю что тут ещё возможен случай, когда переопределяется функция, с более широким модификатором доступа, чем в базовом классе. Например было protected, стало public. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2010, 07:22 |
|
||
|
Вопрос о принципах ООП.
|
|||
|---|---|---|---|
|
#18+
авторНаверняка все согласны с тем, что инкапсуляция - наиболее фундаментальная и важная объектно - ориентированная концепция. не важная, не фундаментальная, и, вообще, не объектно ориентированная концепция. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2010, 10:02 |
|
||
|
Вопрос о принципах ООП.
|
|||
|---|---|---|---|
|
#18+
а, возможно, и не концепция ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2010, 10:02 |
|
||
|
Вопрос о принципах ООП.
|
|||
|---|---|---|---|
|
#18+
tchingizавторНаверняка все согласны с тем, что инкапсуляция - наиболее фундаментальная и важная объектно - ориентированная концепция. не важная, не фундаментальная, и, вообще, не объектно ориентированная концепция. на счет того что не важная - не согласен. программирование - борьба со сложностью, а инкапсуляция здесь помогает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2010, 10:20 |
|
||
|
Вопрос о принципах ООП.
|
|||
|---|---|---|---|
|
#18+
tchingizа, возможно, и не концепция Конечно нет. Побочный эффект модульности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2010, 13:40 |
|
||
|
Вопрос о принципах ООП.
|
|||
|---|---|---|---|
|
#18+
"Да, это правильно. Вместо наследования нового класса от другого, можно включить экземпляр этого другого класса в создаваемый, тем самым повторно используя класс включенного типа без нарушения инкапсуляции." И получить старый VB or VBA, где наследования отродясь не было и приходится изворачиваться именно таким способом. ИМХО, либо бред и чел сам не понял что написал, либо перевод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2010, 15:41 |
|
||
|
Вопрос о принципах ООП.
|
|||
|---|---|---|---|
|
#18+
YUBA"Да, это правильно. Вместо наследования нового класса от другого, можно включить экземпляр этого другого класса в создаваемый, тем самым повторно используя класс включенного типа без нарушения инкапсуляции." И получить старый VB or VBA, где наследования отродясь не было и приходится изворачиваться именно таким способом. ИМХО, либо бред и чел сам не понял что написал, либо перевод. читал эту книгу, и с автором согласен, и главное - он не единственный кто такое советует. также автор советует герметизировать все классы, если только автор класса специально не спроектировал его, как базовый для наследования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2010, 18:03 |
|
||
|
Вопрос о принципах ООП.
|
|||
|---|---|---|---|
|
#18+
И даже больше :) Ещё автор говорит, что "Ещё один не достаток применения наследования заключается в том, что оно не динамично. Наследование статично в силу того факта, что определяется на этапе компиляции. Такое положение дел может оказаться, как минимум, весьма ограничивающим. Применяя включение, вы устраняете это ограничение. Однако чтобы сделать это, также следует заручиться поддержкой со стороны хорошего друга - полиморфизма. При этом включающий тип может быть, скажем, интерфейсным типом. Тогда включаемый объект просто должен поддерживать контракт этого интерфейса, чтобы повторно использоваться контейнером. Более того, этот объект можно изменить во время выполнения. Задумайтесь об этом на минутку. Предположим, что есть объект, представляющий контейнер сортируемых объектов. В этом контейнерном типе предусмотрен алгоритм сортировки по умолчанию. Если вы реализуете этот алгоритм по умолчанию как включаемый тип, который можно подменить вовремя выполнения, тогда, если того требует предметная область, вы всегда сможете заменить его собственным специальным алгоритмом сортировки - до тех пор, пока объект нового алгоритма сортировки реализует необходимый интерфейс, ожидаемый контейнерным типом. Такая техника известна как шаблон проектирования Strategy (Стратегия)" Действительно что ли наследование это не так уж и хорошо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2010, 22:31 |
|
||
|
Вопрос о принципах ООП.
|
|||
|---|---|---|---|
|
#18+
deniskoduaИ даже больше :) Ещё автор говорит, что "Ещё один недостаток применения наследования заключается в том, что оно не динамично. Наследование статично в силу того факта, что определяется на этапе компиляции. Такое положение дел может оказаться, как минимум, весьма ограничивающим. Применяя включение, вы устраняете это ограничение. Однако чтобы сделать это, также следует заручиться поддержкой со стороны хорошего друга - полиморфизма. При этом включающий тип может быть, скажем, интерфейсным типом. Тогда включаемый объект просто должен поддерживать контракт этого интерфейса, чтобы повторно использоваться контейнером. Более того, этот объект можно изменить во время выполнения. Задумайтесь об этом на минутку. Предположим, что есть объект, представляющий контейнер сортируемых объектов. В этом контейнерном типе предусмотрен алгоритм сортировки по умолчанию. Если вы реализуете этот алгоритм по умолчанию как включаемый тип, который можно подменить вовремя выполнения, тогда, если того требует предметная область, вы всегда сможете заменить его собственным специальным алгоритмом сортировки - до тех пор, пока объект нового алгоритма сортировки реализует необходимый интерфейс, ожидаемый контейнерным типом. Такая техника известна как шаблон проектирования Strategy (Стратегия)" Действительно что ли наследование это не так уж и хорошо... он так рано или поздно всё-таки придумает MOP =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2010, 13:34 |
|
||
|
Вопрос о принципах ООП.
|
|||
|---|---|---|---|
|
#18+
deniskoduaИ даже больше :) ...... Действительно что ли наследование это не так уж и хорошо... Наследование оч. хорошо там, где оно действительно нужно. Если Вам нужны из некоего класса какие-то его методы и данные и типа все, то действительно, либо создаешь экземпляр, либо интерфейс, в зависимости от аппетита. Это как с кошками. Вы просто не умеете их готовить. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2010, 17:43 |
|
||
|
Вопрос о принципах ООП.
|
|||
|---|---|---|---|
|
#18+
YUBA"Да, это правильно. Вместо наследования нового класса от другого, можно включить экземпляр этого другого класса в создаваемый, тем самым повторно используя класс включенного типа без нарушения инкапсуляции." И получить старый VB or VBA, где наследования отродясь не было и приходится изворачиваться именно таким способом. ИМХО, либо бред и чел сам не понял что написал, либо перевод. Это нормальный подход, если полиморфизм не требуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2010, 10:25 |
|
||
|
Вопрос о принципах ООП.
|
|||
|---|---|---|---|
|
#18+
k0rvin он так рано или поздно всё-таки придумает MOP =) Вы про какой МОР? Гугл сходу выдал несколько вариантов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2010, 10:39 |
|
||
|
Вопрос о принципах ООП.
|
|||
|---|---|---|---|
|
#18+
XDiaBLok0rvin он так рано или поздно всё-таки придумает MOP =) Вы про какой МОР? Гугл сходу выдал несколько вариантов. наверное лисповский ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2010, 11:35 |
|
||
|
Вопрос о принципах ООП.
|
|||
|---|---|---|---|
|
#18+
Фаулер агрегацию определяет как вид наследования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2010, 16:03 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=36780608&tid=1343526]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
166ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
81ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 516ms |

| 0 / 0 |
