Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование 
:(
    Опции темы
Domestic Cat
Дата 11.5.2006, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  11.5.2006,  12:40 Найти цитируемый пост)
Какой-то неподходящий пример. Здесь иллюстрируется только ошибочность решения наследовать компанию из контакта, т. к. в нем есть малоподходящие компании атрибуты (MonthlyHits, IP). Но пусть это неотъемлемые атрибуты любой компании, при чем здесь наследование? Подобную ошибку с таким же успехом можно допустить где угодно: можно создать метод, принимающий в качестве параметров массив объектов и напихать туда чего попадет.  

Я немного неясно написал, предполагается что проперти MonthlyHits, IP могут быть как у компаний, так и клиентов. Тем не менее, пример это подходящий - ошибок можно было бы избежать, если бы Contact и Company наследовали бы от Entity. Тогда в массив Contac[] объект Company никак бы попасть не смог.

Цитата(w1nd @  11.5.2006,  12:40 Найти цитируемый пост)
Мы про ООП или про что? Инкапсуляция подразумевает не сокрытие информации (это как самоцель не имеет смысла), а сокрытие способа хранения, реализации, взаимодействия. Это необходимо для того, чтобы не переписывать клиентский код при внесении изменений в реализацию класса. Геттеры/сеттеры - это как раз нарушение инкапсуляции (замаскированный прием структурного программирования). 

По-прежнему не вижу нарушения инкапсуляции. Объект часть своих свойств может скрывать, часть - предоставлять через методы/проперти. Если например класс Point не будет иметь методов getX, getY, то использовать его будет неудобно - для всех возможных применений класса придется создавать свой метод, меняя класс. Реюзать такой класс будет еще труднее, поскольку невозможно предусмотреть все возможные варианты использования Point. 

Цитата(w1nd @  11.5.2006,  12:40 Найти цитируемый пост)
Вообще (как я и говорил, вы, похоже, зацикливаетесь на существующих framework'ах, которые примером ООП не являются),

Существующие фрейворки, хоть и не на 100%, но по крайней мере процентов на 90 меня устраивают. Наследование Company от Contact или Square от Size - не устраивает на 100%, я легко могу представить как сложно поддерживать такой код. 
 


--------------------

PM   Вверх
powerOn
Дата 11.5.2006, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: нет
Всего: 159



Цитата

Геттеры/сеттеры - это как раз нарушение инкапсуляции 

Имхо, это скорее способ стандартизации работы с полями (свойствами) классов. 
 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
w1nd
Дата 11.5.2006, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
Что же тогда по твоему хороший пример?

Так ведь не знаю! Вот и хочу узнать, в каком случае решение о наследовании одного класса из другого (при условии, что все поля и методы родителя свойственны дитю) может быть ошибочным?
   


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 11.5.2006, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  11.5.2006,  13:06 Найти цитируемый пост)
Так ведь не знаю! Вот и хочу узнать, в каком случае решение о наследовании одного класса из другого (при условии, что все поля и методы родителя свойственны дитю) может быть ошибочным?

Заключение о том, что поля/методы класса А свойственны и классу Б должно следовать из логических соображений, из архитектуры, а не из сравнения (все поля класса Size есть и у Square и у Car, следовательно унаследуем Square и Car от Size). Что будет, позже, когда код написан, придется изменить класс SIze и дописать метод Resize()? Не получится ли, что размеры Car можно менять как угодно? Базовый класс должен быть абстракцией более высокого уровня, чем сабкласс (Entity - абстракция от Company и Contact).  


--------------------

PM   Вверх
w1nd
Дата 11.5.2006, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
Тем не менее, пример это подходящий - ошибок можно было бы избежать, если бы Contact и Company наследовали бы от Entity. Тогда в массив Contac[] объект Company никак бы попасть не смог.

Нет, не понимаю. Ну и что же? Теперь и Contact, и Company могут попасть в массив Entity, а Entity - это, допустим, еще и Vehicle. И что? 
А то, что вы пытаетесь привязать классы к наблюдаемым объектам, а этого делать как раз не нужно. ООП - это не концепция понимания мира сквозь призму модели классов, а способ создания программ, в которых возможны локальные изменения на любом уровне. 
Или вы пытаетесь создать заведомо ошибочный код (метод, которому на вход передаются контакты почему-то интерпретирует их как персон).

Цитата
Существующие фрейворки, хоть и не на 100%, но по крайней мере процентов на 90 меня устраивают. Наследование Company от Contact или Square от Size - не устраивает на 100%, я легко могу представить как сложно поддерживать такой код.

А я вот не могу представить трудностей, которые представляете вы. Поделитесь?   

Это сообщение отредактировал(а) w1nd - 11.5.2006, 22:18


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Domestic Cat
Дата 11.5.2006, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  11.5.2006,  13:15 Найти цитируемый пост)
Нет, не понимаю. Ну и что же? Теперь и Contact, и Company могут попасть в массив Entity, а Entity - это, допустим, еще и Vehicle. И что? 

Тот, кто пишет метод Process(Entity entity), знает, что в данный метод можно передать любую Entity. Если будет нужно создать метод, специфичный для контактов (Process(Contact contact)), то передать туда Company будет нельзя.
 
Цитата(w1nd @  11.5.2006,  13:15 Найти цитируемый пост)
А я вот не могу представить трудностей, которые представляете вы. Поделитесь?   

1. Непонятный код. К примеру, можно будет спокойно писать 
Код

Company company = new Company();
//..........
Contact contact = company; // Что тут имелось в виду?

2. Плохой код. К примеру, добавление нового метода или поля в контакт (например, пол) через полгода после старта проекта приведет к появлению компаний женского и мужского полу.
3. Больше багов
Код


Contact contact = new Company(); // забыли исправить копипаст
 


--------------------

PM   Вверх
LSD
Дата 11.5.2006, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Цитата(LSD @ 11.5.2006,  22:54)
Цитата(w1nd @  11.5.2006,  22:40 Найти цитируемый пост)
Вообще (как я и говорил, вы, похоже, зацикливаетесь на существующих framework'ах, которые примером ООП не являются), само по себе понятие properties объекта очень сомнительно с точки зрения ООП.

1. Что же тогда по твоему хороший пример?

Цитата(w1nd @  11.5.2006,  23:06 Найти цитируемый пост)
Так ведь не знаю! Вот и хочу узнать, в каком случае решение о наследовании одного класса из другого (при условии, что все поля и методы родителя свойственны дитю) может быть ошибочным?

Ты не знаешь примеров хорошего ООП, но при этом твердо убежден, что все что есть сейчас плохо?

Добавлено @ 22:44 
Цитата(Domestic Cat @  11.5.2006,  23:34 Найти цитируемый пост)
К примеру, добавление нового метода или поля в контакт (например, пол) через полгода после старта проекта приведет к появлению компаний женского и мужского полу.

Гут! smile  


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
w1nd
Дата 11.5.2006, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
Тот, кто пишет метод Process(Entity entity), знает, что в данный метод можно передать любую Entity. Если будет нужно создать метод, специфичный для контактов (Process(Contact contact)), то передать туда Company будет нельзя.

Если программер делает метод, рассчитанный только на обработку контактов (зная, что контакты - это еще и компания) - он всего лишь совершает ошибку. Если вместо того, чтобы создать класс Person, человек добавляет пол контактам и компаниям - это тоже всего лишь ошибка. Если нужен объект класса компания, а программер создает переменную контакт - это попросту странно (компания и так есть контакт). А если этот самый программер вообще сядет спиной к монитору, он вообще ничего написать не сможет. 

Один мой товарищ, например, считает, что возможность переопределения операций в C++ - зло, которого следует избегать любой ценой. В чем здесь прикол? У него просто нет нормальной IDE, а C++ он знает недостаточно хорошо, чтобы отследить все зависимости без IDE. А другой мой товарищ вообще не знаком с программированием и нифига не понимает во всех этих кракозяблах. Так что, программировать нужно так, чтобы все одобряли и понимали? Не смешно ли?

Добавлено @ 23:05 
Цитата
Ты не знаешь примеров хорошего ООП, но при этом твердо убежден, что все что есть сейчас плохо?

Аз есмь живой, ходячий пример хорошего ООП smile И речь идет не о том, насколько все плохо (и уж тем более не о примере хорошего ООП - я достаточно внятно изъясняюсь по-русски, прочитайте пост внимательнее), а чем может быть плохо наследование квадрата из координаты и размера. Пока я узнал только: кто-то может наделать ошибок. Но кто угодно может наделать любое количество самых разнообразных ошибок - это еще ничего не говорит о качестве объектной модели.   

Это сообщение отредактировал(а) w1nd - 11.5.2006, 23:06


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
LSD
Дата 11.5.2006, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Цитата(w1nd @  12.5.2006,  00:00 Найти цитируемый пост)
я достаточно внятно изъясняюсь по-русски, прочитайте пост внимательнее

Кто тебе это сказал smile  smile  smile 

Цитата(w1nd @  12.5.2006,  00:00 Найти цитируемый пост)
И речь идет не о том, насколько все плохо (и уж тем более не о примере хорошего ООП - я достаточно внятно изъясняюсь по-русски, прочитайте пост внимательнее), а чем может быть плохо наследование квадрата из координаты и размера.

Ты абсолютно невнимательно читаешь собеседников. Я спрашивал, раз уж по твоим словам в существующих фреймворках, ООП плохо реализовано, то вообще есть пример реализации хорошего ООП. Про квадраты я ничего не спрашилал, это ты себе придумал. Если у тебя нет таких примеров, то тут квадраты?

Цитата(w1nd @  12.5.2006,  00:00 Найти цитируемый пост)
Но кто угодно может наделать любое количество самых разнообразных ошибок - это еще ничего не говорит о качестве объектной модели.

Смотря какая цель разработки данной модели, если упростить разработку (один из способов минимизировать количество ошибок). То количество "подводных камней" играет большую роль, чем их больше тем хуже эта модель. 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
w1nd
Дата 11.5.2006, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
Кто тебе это сказал

Я это точно знаю. Язык - не живопись и не скульптура, чтобы каждый понимал так, как хотел.
Цитата
Ты абсолютно невнимательно читаешь собеседников. Я спрашивал, раз уж по твоим словам в существующих фреймворках, ООП плохо реализовано, то вообще есть пример реализации хорошего ООП. Про квадраты я ничего не спрашилал, это ты себе придумал.

Обмишурился чуток. Беседовали о квадратах и разнополых компаниях.
Хорошим примером ООП наверняка может быть отдельно взятый фрагмент в любом из существующих якобы-ООП-фреймворков (кроме майкрософтовских, пожалуй). Но в целом - нет. Самое жуткое - это, конечно, properties.
Цитата
Смотря какая цель разработки данной модели, если упростить разработку

Целью разработки каких-либо моделей или фреймворков никогда не становится упрощение, только ускорение.      

Это сообщение отредактировал(а) w1nd - 12.5.2006, 00:14


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
jimur
Дата 12.5.2006, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 21.4.2006

Репутация: нет
Всего: 3



Цитата(w1nd @  11.5.2006,  23:48 Найти цитируемый пост)
Целью разработки каких-либо моделей или фреймворков никогда не становится упрощение, только ускорение. 

Да ладно smile
Spring Framework значительно упрощает разработку
 
PM MAIL   Вверх
Domestic Cat
Дата 12.5.2006, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 4
Всего: 172



Цитата(w1nd @  11.5.2006,  14:00 Найти цитируемый пост)
Так что, программировать нужно так, чтобы все одобряли и понимали? Не смешно ли?

Конечно. В команде когда-нибудь работал? Занимался переписыванием кода после индусов? 
Цитата(w1nd @  11.5.2006,  14:00 Найти цитируемый пост)
Если программер делает метод, рассчитанный только на обработку контактов (зная, что контакты - это еще и компания) - он всего лишь совершает ошибку. Если вместо того, чтобы создать класс Person, человек добавляет пол контактам и компаниям - это тоже всего лишь ошибка. Если нужен объект класса компания, а программер создает переменную контакт - это попросту странно (компания и так есть контакт). А если этот самый программер вообще сядет спиной к монитору, он вообще ничего написать не сможет. 


Цитата(LSD @  11.5.2006,  14:28 Найти цитируемый пост)

Смотря какая цель разработки данной модели, если упростить разработку (один из способов минимизировать количество ошибок).

Правильное наследование уменьшает количество возможных ошибок в будущем, но не устраняет их совсем, конечно же.
Для того, чтобы "унаследовать" свойства точки, достаточно использовать композицию. К примеру
Код

class Square
{
    Point a1;
    Point a2;
    Point a3;
    Point a4;
    // ...
}

class Square
{
    Point a1;
    Size size;
    // ...
}



Цитата(w1nd @  11.5.2006,  14:48 Найти цитируемый пост)
Целью разработки каких-либо моделей или фреймворков никогда не становится упрощение, только ускорение.    

Упрощение - тоже ускорение, оно ускоряет дебаг и поддержку кода.
 


--------------------

PM   Вверх
w1nd
Дата 12.5.2006, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: нет
Всего: 54



Цитата
В команде когда-нибудь работал? Занимался переписыванием кода после индусов?

Ни я, ни мои коллеги никогда, к счастью, не сталкивались с необходимостью переписывать чей-то код. 

Я не против агрегации классов для использования их свойств, но бездумная эксплуатация такого подхода по поводу и без повода порождает пресловутые properties и, в конечном итоге, сводит на нет те преимущества, которые может дать нам ООП. Как правило, подобные артефакты рождаются из-за стремления переделать старую не-ООП программу на новый лад, что невозможно без фундаментальнго перепроектирования, или из-за непонимания ООП.

Изначально вопрос состоял в том, может ли ООП обойтись без множественного наследования. Я утверждал, что не может и пока не никто не смог предъявить сколько-нибудь весомых аргументов против (кроме утверждений о том, что кто-то потеряет голову, глядя на классы с N-надцатью родителями). 

 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
powerOn
Дата 12.5.2006, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: нет
Всего: 159



Цитата(Domestic Cat @  12.5.2006,  08:38 Найти цитируемый пост)
Занимался переписыванием кода после индусов? 

Я очень сильно извиняюсь за offtop, просто уже не в первый раз,  от совершенно разных людей (программистов естественно), слышу о необыкновенных талантах индийских кодеров. Если Вас не затруднит, поделитесь кусочком кода (малееееньким), ну пожалуйста. 
Я очень хочу на это взглянуть..  smile   


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Void
Дата 12.5.2006, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



[OFF] MoonCatDaily WTF: там этого добра навалом smile 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.1085 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.