Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » В чем преимущество ООП ?

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10

Открыть новую тему     Написать ответ в эту тему

wasilissk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Qraizer
Вам не понять, я вам глубоко сочувствую....... Тоже неплохое завершение, можно сказать классическое. Okay.
 
Добавил
 

Цитата:
Отмена интерфейса не означает конец его существования.

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

Цитата:
Ты перечитался COMом, без которого Дельфи и не Дельфи вовсе.

Интерфейс уже давно много больше чем com.  

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

Когда в некой иерархии приходится прятать методы которые в предках имели большую видимость, такая иерархия порочна, ее надо переделывать. Читаем принцип замещения Лисков до просвещения. И принцип single responsibility заодно.

Цитата:
Сам понял, что сказал? В таком случае здравому смыслу противоречит, например, FireFox, который просто пестрит совершенно различными сущностями в лице плагинов, и где они все под одной суперсущностью - браузером.

Т.е. система плагинов FireFox-а такова, что некая сущность(супер-пупер-классс)  наследуется от всех классов плагинов и от супер-класса браузера и предоставляет свой объединенный интерфейс супер-пуперт-класса ТБраузерСПлагинами для работы со всем сразу? Именно этим и занимается TQip в прошлом примере. Это какое-то процедурное программирование получается. Конечно это противоречит здравому смыслу, хотя я очень сомневаюсь в FireFox-е работает именно так как ты описал. Я еще раз повторяю, есть паттерн фасад, но в него не тащат все подряд, и не вытаскивают все в интерфейсную часть без разбора.

Цитата:
Тот факт, что для более ёмкой статистики в неком частном случае потребовалась TQIPовая информация, которая может быть получена от него через IRichEdit, означает не более чем то, что в этом частном случае потребовался частный Посетитель, который легко может быть получен наследованием и перекрытием одного метода.

Полностью переопределять поведение класса в его потомке – дурнейшая практика, ничего нормального в ней нет. Читаем принцип замещения Лисков до просвещения.

Цитата:
И только в этом методе потребовался другой TQIPовый интерфейс, а именно IRichEdit.

Я ответил на этот запрос в предыдущем посте. Delphi позволяет написать и этот говнокод,  передаем потомку этого посетителя интерфейсную ссылку IRichEdit от класс TQip в перегруженном конструкторе.

Цитата:
Нда? Привести пример "попроще"? У Александреску посмотри. Его смарт-поинтер - это нечто.  

Это вообще к чему? Для смарт-поинтеров нужно множественное наследование? Или это к подсчету ссылок? Если второе, так не канает - в Delphi это из коробки, мы же тут, высасывая из пальца, строки кода считаем.

Цитата:
Вообще, что касается множественного наследования реализаций, так паттерн Стратегия - чи как там её

Куда там в стратегии всунуть множественное наследование вообще ума не приложу. Кстати думаю не следует вообще упоминать о гофах если стоишь на позиции множественного наследования, они мягко говоря против него (найду ссылку - приведу).

Цитата:
Только вот незадача: в мире ОП

Что еще за мир ОП? Хотелось  бы почитать про мир, где потомок наследуется от четырех родителей, включая полностью или частично их тела в себя. Думаю будет увлекательное чтиво.

Цитата:
Касательно остального, что не комментировал, внимательно, а не по диагонали, перечитай прошлый пост. Можно не один раз перечитать, если покажется сложным. Потому как там все ответы есть, а чего нет, так то азбука. Я может и холиварщик, но не преподаватель нахаляву и тем более не тавтолог.

Там очень много текста, я его внимательно прочитал, честно, ничего сложного не нашел, ответов тоже нет; есть ошибки, неуместные примеры (зачем в частности там вообще интерфейсы ты так и не ответил), неаргументированные высказывания. В ученики не набиваюсь, уволь.

Всего записей: 293 | Зарегистр. 25-12-2006 | Отправлено: 06:21 13-10-2011 | Исправлено: wasilissk, 09:37 13-10-2011
Eternal_Shield

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
wasilissk
Берите пример с меня и никому ничего не доказывайте Если слон верит что он синий, значит он действительно синий
 
А если серьёзно, то нельзя человеку показать тот путь, который он не хочет видеть. Это было видно по второму посту. У меня сложилось такое впечатление, что человечек волею судеб пересел (на работе) на делфи с с++, а логика то уже разбита об сверх-ООП в С++ и пути назад нет. Вот и протестует.  
 
Кстати, знаю как минимум 2х людей, которые были ярыми противниками Delphi и садиться за него не хотели. Зато перешли с С++ на шарп и поняли чего им религия (запрещала/не давала) все эти годы
 
З.Ы: А Хейлсберг-то (и все последователи С#), наверно, не в курсе гигантских проблем с ооп в Delphi/C#.

Всего записей: 766 | Зарегистр. 18-05-2009 | Отправлено: 09:12 13-10-2011 | Исправлено: Eternal_Shield, 09:26 13-10-2011
wasilissk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Eternal_Shield

Цитата:
А если серьёзно, то нельзя человеку показать тот путь, который он не хочет видеть.

Ну я на это и не претендую. Убедить кого-то задачи нет, так просто отвлеченная беседа на тему ооп.

Всего записей: 293 | Зарегистр. 25-12-2006 | Отправлено: 09:48 13-10-2011
rrromano



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
wasilissk
Вот, я как раз собирался что-то написать по поводу, а вы уже всё рассказали ))).

Всего записей: 283 | Зарегистр. 20-09-2006 | Отправлено: 10:39 13-10-2011
wasilissk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
rrromano

Цитата:
а вы уже всё рассказали

Да неужели таки все?
Напишите, мне интересно.

Всего записей: 293 | Зарегистр. 25-12-2006 | Отправлено: 11:51 13-10-2011
rrromano



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
wasilissk
Ну, по крайней мере, это больше, чем я хотел. Я всего-лишь по множественному наследованию хотел пройтись )))

Всего записей: 283 | Зарегистр. 20-09-2006 | Отправлено: 15:00 13-10-2011
Qraizer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

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

Цитата:
Еще раз повторяю, в Delphi невозможно отменить интерфейс.  

Цитата:
Если тебе этого не нужно, не стоит их выносить в этот интерфейс.  

Цитата:
Интерфейс уже давно много больше чем com.  

Цитата:
Когда в некой иерархии приходится прятать методы которые в предках имели большую видимость, такая иерархия порочна, ее надо переделывать. Читаем принцип замещения Лисков до просвещения.  

Цитата:
...
Секундочку и по порядку.
Во-первых, Дельфи тут причём? Я предъявил ТЗ, а к реализациям на языках я перешёл после этого. Ты даже этого не понял? Впрочем, ты и тут неправ, отменить интерфейс в Дельфи можно, а иногда и нужно, и опять же Дельфи тут не причём, причём - архитектура подсистем.
Во-вторых, и это связано с во-первых. Интерфейсы требуются для регламентирования требований к реализациям. Если некая сущность является внутренней деталью некой подсистемы, почему её нельзя регламентировать? И если можно, то почему при этом обязательно раскрывать наружу? Похоже тебе самому Лисков перештудировать не помешало бы.
В-третьих, вот чему-чему, но учить меня проектировать не следует. Дельфи вот - можно, я его не знаю достаточно хорошо, чтобы отвечать за все свои слова о нём. Но вот проектированию больших, гибких и масштабируемых систем... ладно, я реалист... есть куда ещё расти, но учить меня не тебе явно. Ты уже дваджы накололся на принципах Лисков.
В-четвёртых. Не понравился пример с браузером? А что с ним не так? Какая разница, как оно там внутри реализовано и как спроектировано? Но ведь он явно попадает под твоё определение говнопродукта, ибо вмещает в себя кучу разнородных сущностей.
В-пятых. Ладно. Предположим ты поколебал мою уверенность касательно TQIP. Тогда укажи пальцем, где просчёт. Вернёмся к ТЗ. Итак.

  1. Требуется компонент, реализующий три интерфейса. Пока всё в порядке? Ничего необычного?
  2. Каждый интерфейс по отдельности уже реализован и не однажды. Диссонанс не возник? Будет весьма странно, если вдруг.
  3. Некоторые из этих реализаций уже подходят нашему компоненту. Так не бывает? От ёлки, а мужуки-то не знают.
  4. Когда мне подходит некая реализация, я имею право, основываясь на ней как на базе, задействовать её у себя, и при этом согласно принципу Лисков наследование должно быть публичным, ибо новый класс в частности является и базовым и может выступать всемто него везде, где необходим базовый. Неужели прокол тут?
  5. Я беру три подходящих мне реализации, по одной на каждый интерфейс, и получаю свой компонент. Э-э-э...
Жду комментов. Очень хочется в спойлере предсказать, каких именно, но сдержусь.

Цитата:
Полностью переопределять поведение класса в его потомке – дурнейшая практика, ничего нормального в ней нет. Читаем принцип замещения Лисков до просвещения.  

Цитата:
передаем потомку этого посетителя интерфейсную ссылку IRichEdit от класс TQip в перегруженном конструкторе.  
Ладно, и это разжую. Это не полное переопределение, а кастомизация. Предположим Посетитель используется для оценки  эффективности кеширования строк объектами IHistory. TQIP (сейчас совершенно неважно, каким именно способом он составлен из кирпичиков) безусловно должен будет быть помещён в коллекцию к Посетителю для опроса. Так уж получилось, что реализация IRichEdit разделяет с IHistory несколько последних строк истории. Открой QIP, ну или вообще любой пейджер, так и есть. Поэтому для более точной статистики требуется это число получить также и от реализации IRichEdit и вычесть из значения, полученного у IHistory.
Посетитель используется во всём проекте, а не ради каких-то жалких экземпляров TQIP, всего IHistory в проекте десятки. Коллекция у него хранит ссылки на IHistory. С какого перепугу он должен нормально отнестить к передаче ему IRichEdit? Что делать? Переделывать? Я уже показал наиболее правильный метод, использующий только локальное вмешательство на уровне одной-единственной подсистемы. Разумеется от базового класса локальному посетителю придёт IHistory, но он-то знает, что некоторые из них могут оказаться экземплярами TQIP, и если это так, то требуется получить от него IRichEdit, вызвать там единственный метод и вычесть. Делов-то:
Код:
std::size_t getLinesCount(const IHistory* hist)
{
  const IRichEdit  *edit        = dynamic_cast<const IRichEdit*>(hist);
        std::size_t linesAmount = hist->getCachedLines();
 
  if (edit != NULL) linesAmount -= edit->getCurrentLines();
 
  return linesAmount;
}

Код:
FUNCTION getLinesCount(hist:IHistory):Cardinal;
  VAR edit:IRichEdit;
BEGIN
  Result := hist.getCachedLines;
 
  TRY
   edit   := hist AS IRichEdit;
   Result := Result - edit.getCurrentLines
  EXCEPT
  END
END;
У меня только один вопрос: будет ли это работать в Дельфи? Т.е. поддерживается ли перекрёстное приведение между аггрегированными полиморфными типами?
В общем, понятнее не изложу. Сорри, если чё. Только пожалуйства не надо мне пробовать доказывать, что локальные кастомизации поведения - это не путь Дельфи.

Цитата:
Куда там в стратегии всунуть множественное наследование вообще ума не приложу.
Ладно, попозже набросаю скелет. Александреску - штука тяжёлая сама по себе. Так что читать без подготовки, наверно, и правда не стоит.

Цитата:
Что еще за мир ОП? Хотелось  бы почитать про мир, где потомок наследуется от четырех родителей, включая полностью или частично их тела в себя. Думаю будет увлекательное чтиво.  
Объектное программирование. Объектно-ориентированное - это лайт-версия для императивных языков. Где почитать? Та хоть любую литературу по проектированию.
А можно и не читать. Думаешь C++ единственный в своём роде, с множественным наследованием реализаций?  Python, Perl, Ruby, Eiffel, Curl (честно говоря, не знаю, кто такой), Common Lisp, OCaml (тоже не знаю, но отзываются неплохо) и даже Delphi, правда, весьма ограниченно и только с 7-й версии. И C++ в общем-то тут не первые по качесту и набору возможностей. Для ознакомления рекомендую Python, Eiffel или Ruby, но у последнего это не совсем штатная возможность, а скорее её имитация. Лучше всего - Лисп, но он не совсем императивный.

----------
Одни с годами умнеют, другие становятся старше.

Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 09:27 15-10-2011
Eternal_Shield

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
 

Код:
FUNCTION getLinesCount(hist:IHistory):Cardinal;  
   VAR edit:IRichEdit;  
 BEGIN  
   Result := hist.getCachedLines;  
   
   TRY  
    edit   := hist AS IRichEdit;  
    Result := Result - edit.getCurrentLines  
   EXCEPT  
   END  
 END;

У меня только один вопрос: будет ли это работать в Дельфи?

Не будет. Чтобы достать интерфейс IRichEdit через IHistory, то придётся юзать hist.QueryInterface. Мягкое приведение типов через as тут не поможет (да и жесткое тоже). Скорее всего, даже компиль забракует такой финт ушами.
 
З.Ы: Подразумевается, что оба интерфейса НЕ родственники.

Всего записей: 766 | Зарегистр. 18-05-2009 | Отправлено: 16:18 15-10-2011 | Исправлено: Eternal_Shield, 16:21 15-10-2011
wasilissk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Ты бы предпочёл увидеть скопипасченный пост? Странно. rrromano, ты прав, в моём посте всё есть, но.

Я написал это когда увидел в качестве ответа

Цитата:
ты ничего не понял. Сожалею.

И ничего более. После того как твой пост был дополнен, я дополнил и свой.
 

Цитата:
Во-первых, Дельфи тут причём?

При том, что речь шла именно о Делфи на всем протяжении разговора. Все фразы про интерфейсы были написаны именно в контексте делфи.

Цитата:
Но касательно Дельфи - её там не может быть в связи с самой моделью ООП.


Цитата:
если необходимость сомнительна, почему оставили множественное наследование интерфейсов?


Цитата:
Отмена интерфейса не означает конец его существования. Ты перечитался COMом, без которого Дельфи и не Дельфи вовсе. Отмена интерфейса означает, что им просто не дают пользоваться за определёнными пределами, например,

 

Цитата:
Я предъявил ТЗ, а к реализациям на языках я перешёл после этого. Ты даже этого не понял?

Ну вот только не надо доказывать, что белое это черное. Разговор об интерфейсах начался еще до твоего ТЗ.

Цитата:
Впрочем, ты и тут неправ, отменить интерфейс в Дельфи можно, а иногда и нужно

Как?

Цитата:
Во-вторых, и это связано с во-первых. Интерфейсы требуются для регламентирования требований к реализациям. Если некая сущность является внутренней деталью некой подсистемы, почему её нельзя регламентировать?  


Цитата:
И если можно, то почему при этом обязательно раскрывать наружу?  

Ну регламентируй в интерфейсе поведение сущности, хочешь - скрой в этой системе, хочешь – опубликуй; что эти твои слова доказывают или что опровергают? И как они вообще связаны с  

Цитата:
Похоже тебе самому Лисков перештудировать не помешало бы.

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

Цитата:
В-третьих, вот чему-чему, но учить меня проектировать не следует. Дельфи вот - можно, я его не знаю достаточно хорошо, чтобы отвечать за все свои слова о нём. Но вот проектированию больших, гибких и масштабируемых систем... ладно, я реалист... есть куда ещё расти, но учить меня не тебе явно.

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

Цитата:
Ты уже дваджы накололся на принципах Лисков.

Где? Цитату, пожалуйста.  

Цитата:
Не понравился пример с браузером? А что с ним не так?
 
Т.е. мне в третий раз написать то же самое?

Цитата:
Какая разница, как оно там внутри реализовано и как спроектировано?  
 
Т.е. как оно внутри все равно, лишь бы работало. Ну-ну. Мы все еще про ООП или уже про что-то иное?  

Цитата:
Но ведь он явно попадает под твоё определение говнопродукта, ибо вмещает в себя кучу разнородных сущностей.
 
Ложь и искажение, я не об этом писал.

Цитата:
Жду комментов. Очень хочется в спойлере предсказать, каких именно, но сдержусь.

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

Цитата:
Опять же, ты ничего не понял. Посетителя интересует только IHistory.


Цитата:
Это не полное переопределение, а кастомизация.  

Кастомизация это преобразование одного типа к другому. Если изначально посетитель проектировался исключительно для работы с IHistory, а его потомок с никоим образом не связанным с ним IRichEdit-ом стал работать - это называется полным переопределением поведение класса в его потомке.  

Цитата:
будет ли это работать в Дельфи?

Будет

Код:
 
VAR qip: TQip;
       edit:IRichEdit;
begin
  qip := TQip(Hist);
  if qip.QueryInterface(IRichEdit, edit) then
     работаем с edit
  else
     работаем c Hist
 

И это - говнокод

Цитата:
Что делать? Переделывать?

Переделывать посетителя, он для этого и предназначен вообще-то, изменение нескольких классов без вмешательства в их структуру и логику работы, тем более что переделки там просто смешные. Переделываем базового посетителя чтобы принимал и IRichEdit-а тоже. В конкретном посетителе реализуем работу с IRichEdit-ом и IHistory.

Цитата:
Объектное программирование. Объектно-ориентированное - это лайт-версия для императивных языков.

Т.е. объектное программирование, как не объектно-ориентированное, реализуют неимперативные языки? В перечисленном тобой списке условно к неимперативным можно причислить лишь common lisp, однако опять же незадача, про него написано, что он объектно-ориентированный.  

Цитата:
Та хоть любую литературу по проектированию.

Это утверждение о том, что в любой книжке по проектированию есть определение объектного программирования как не объектно-ориентированного? Это ложь могу перечислить сходу 10 книг, где нечего подобного нет.

Всего записей: 293 | Зарегистр. 25-12-2006 | Отправлено: 10:52 16-10-2011
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Qraizer

Цитата:
Впрочем, ты и тут неправ, отменить интерфейс в Дельфи можно, а иногда и нужно

В Дельфи это реализуется весьма просто, до банальности, хотя если интерфейс уже прописан будет диссонанс между объявлением компилятору и саппортом Query. Диссонанс легко можно сопроводить ссылками на источник+комментами девелоперу, что и нужно всегда делать. Наверно между проектированием и научной теорией тоже бывает диссонанс.
 

Цитата:
5. Я беру три подходящих мне реализации, по одной на каждый интерфейс


Цитата:
Ну вот только не надо доказывать, что белое это черное

Уже неплохо для начала ) только я не хореограф. Оба пика оторваны от базовых величин к коим предлагаю вернуться, а именно синтаксис и прагматика. (Отступление, скажу честно, есть 3 реализации готовые я делаю копи паст и перевариваю в одну, - дольше на 1 час, надёжнее на полгода ИМХО, потому что лучше запомню и реже буду изменять код). И так:
СИНТАКСИС
1. Предположим имеется type TMyBoolean = Boolean?. (true,false,null).
2. Классическая конструкция if Conditional then, для этого типа заменяется методом IfThen3(TMyBoolean,1,2,3).  
3. Допустим существует доп.указание как это используется на сотне другой проектов.
Я уважаю мнение человека который скажет что это не синтаксис, что это вроде даже не язык Си. Но мне где то в глубине будет так жаль учёных которые придумывали всякие понятия о формализованном языке и мета языке. Для них то IfThen3 вполне себе синтаксис. Да он подразумевает внутри байты или inline/template, и что с того если для всей проектируемой системы требуется формализовать задачу в соответствии с сущностями задачи. Это полноправный синтасис, но не вселенского масштаба конечно.
 
ПРАГМАТИКА
Дисциплина от греческого слова - польза (*или дело, неважно уже столько раз всё менялось).  
1. Допустим было доказано что кастомизация это преобразование одного типа к другому.
2. Предположим первый тип является в иерархии наследования предком второго типа.
3. Предположим что за доказательство номер 1 нужно определить гонорар.
В ситуации когда выясняется, что в предке уже есть всё для преобразования помогает прагматика - избыточные доказательства. Без выделения общего (в преобразуемом субъекте), понятие кастомизации займёт место на полке с другими ненужными понятиями ИМХО.  
 
Книг перечислить не могу ниодной. )  
*Исправлено*
 
*Добавлено*
Забываю, если сохряняется условие выполнимости, сложно согласиться с утверждением о невыполнимости множественного наследования.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 17:11 16-10-2011 | Исправлено: delover, 21:45 17-10-2011
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Так про сложности согласиться с утверждением. Говнокод есть говнокод, думаю никак не один человек это видит и разделяет.  

Цитата:
VAR qip: TQip;  
       edit:IRichEdit;  
begin  
  qip := TQip(Hist);  
  if qip.QueryInterface(IRichEdit, edit) then  
     работаем с edit  
  else  
     работаем c Hist  

А где обещаный говнокод? Использованы два интерфейса один преобразовывается в другой. Если Вам так удобнее, ради Бога, пишите так, а в чём говнокодистость?  
 
Добавлено:
Представим что он есть, тогда с его слов по Вашему, напишите пожалуйста? Если совершенство лени то это обратное от говнокода. Если что другое так экстрасенсов нет.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 22:46 20-10-2011
Qraizer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Eternal_Shield
Цитата:
Не будет. Чтобы достать интерфейс IRichEdit через IHistory, то придётся юзать hist.QueryInterface.
Я примерно так и предполагал. В смысле, что перекрёстный каст, который на Плюсах выполняется не сложнее нисходящего, в Дельфи делается в два этапа: сначала к общему - хоть потомку, хоть предку, неважно - классу, затем к нужному. В принципе не суть важно, разве что требуется знать об иерархии больше, а именно помимо исходного класса и класса-назначения ещё и какой-нибудь промежуточный общий.
Кстати, рад, что не все дельфисты как только так сразу бегут исследовать RTTI руками. Бо я слишком уж часто встречал таких.
 
wasilissk, ты потроллить сюда заходишь или прикидываешься?

Цитата:
Все фразы про интерфейсы были написаны именно в контексте делфи.

Цитата:
Ну вот только не надо доказывать, что белое это черное.
Все фразы были высказаны в ответ на твоё заявление о ненужности множественного наследования реализаций при тем не менее допустимости множественного наследования интерфейсов. Ежели ты окромя Дельфи ни на чём больше не писал (что вообще-то было бы странным, но выходит, что так), то я тут ни при чём. Интерфейс и реализация - это понятия из ОО проектирования, а не ОО программирования. Кого как, но меня учили проектировать до программирования, а не наоборот.

Цитата:
Иерархия, в которой скрываются методы, опубликованные в предке, просто по определению не удовлетворяет принципу замещения Лисков, потому что потомок не может выступать на месте предка.  
А я о чём? Он не выступает, и даже не собирается. Что дальше? Таки понял суть, или будешь сам себе противоречить?

Цитата:
Ты с этим спорить собираешься?
Нет, не понял.  
...Ок, вопросов больше не имею.

Цитата:
Ложь и искажение, я не об этом писал.  
Ну... Если ты имел в виду другое, надо было говорить это самое другое. А так ты сказал ровно то, что сказал. И кстати, я-таки не увидел, какой же всё-таки из тех нумерованных пунктов прокольный.

Цитата:
В предложенной тобой делфийской реализации интерфейсы не нужны.
Аха. Т.е. реализация интерфейсов может существовать и без наследования от них? Не, конечно можно так поступить, но во-первых, почему тогда это будет называться реализацей интерфейса, и во-вторых, а как-же полиморфизм, и в-третьих , а как же ТЗ? Вот дали ТЗ, там курсивом по ариалу написано "...должен реализовывать три интерфейса..." ТЗ выпущено консилиумом системных интеграторов доброго десятка специализаций, работавших над архитектурой системы добрых пол-года. И чё? И хде? Минус премия устроит за срыв сроков, или будешь искать аргументы для спора с кандидатами наук, своими кураторами, ибо твоя фирма - всего лишь подрядчик, и ведущими инженерами, у которых этот проект уже пятый по счёту? Я не шучу. Это не дядя с кипой флешек в кармане пришёл сайт заказывать, эти люди реально знают, как должен быть устроен самолёт или атомная станция.

Цитата:
Кастомизация это преобразование одного типа к другому.
Кастомизация - это customisation, настройка обощённого модуля под конкретику контекста. То что ты имеешь в виду - это каст, cast, и это сленг, ибо правильно тогда уж тайпкаст.

Цитата:
Если изначально посетитель проектировался исключительно для работы с IHistory, а его потомок с никоим образом не связанным с ним IRichEdit-ом стал работать - это называется полным переопределением поведение класса в его потомке.
Конструктива нет и не будет. Не верю, что ты прикидываешься, а троллей я ненавижу, и это ещё мягко сказано.

Цитата:
Переделывать посетителя,...
Уволен. Ты ещё TObject перепиши в подобной ситуации.

Цитата:
Т.е. объектное программирование, как не объектно-ориентированное, реализуют неимперативные языки?  
Не обязательно. Чистое ОП плохо укладывается в императив. А для императива чистое ОП неудобно. Так что ООП - это золотая середина, но с большим перекосом в угоду императиву, чем в угоду ОП.

Цитата:
В перечисленном тобой списке условно к неимперативным можно причислить лишь common lisp, однако опять же незадача, про него написано, что он объектно-ориентированный.
Не он конкретно, а некая библиотека делает его таковым. Не помню, какая. И вообще, императивность я затронул, поскольку немногие готовы взяться за неимперативные языки за просто так, ради нематериальной выгоды.

Цитата:
Это утверждение о том, что в любой книжке по проектированию есть определение объектного программирования как не объектно-ориентированного?
Нет. Это есть утверждение о том, что в любой книжке по проектированию нет программирования. Если есть, то это уже не книжка по проектированию. Но это не означает, что чтобы получить предстваление об ОП, требуется именно книжка по проектированию. Можно рассмотреть и книжки по программированию, где рассматривается язык, реализующий множественное наследование лучше, чем C++.
 
delover
Цитата:
В Дельфи это реализуется весьма просто, до банальности, хотя если интерфейс уже прописан будет диссонанс между объявлением компилятору и саппортом Query.
Опять же. Не следует подходить к разговору об интерфейсах и их реализациях в контексте какого-либо языка. Это разговор в первую очередь об архитектуре некой подсистемы. Её реализация в коде вторична. И именно с этих позиций имеет смысл сравнивать ООП-модели языков. Иначе будет вот такой вот разговор, как у меня с wasilissk-ом.
 
Ага, ну вот и ты тоже написал, нечто подобное как у Eternal_Shield. Только я за qip := Hist AS TQip; тогда уж, потому как далеко не каждая реализация IHystory является TQIP-ом.

Цитата:
Забываю, если сохряняется условие выполнимости, сложно согласиться с утверждением о невыполнимости множественного наследования.
Именно.
Множественное наследование ничем не отличается от простого. Ну вот просто ничем. Ну вот какая разница, столько у объекта непосредственных предков? Почему если они интерфейсы - это якобы нормально, а если нет, то якобы плохо? Если агрегацией успешно можно имитировать множественное наследование, зачем тогда нужно простое, если агрегация сможет его имитировать не хуже? Я тупо не понимаю логики. Если мы против множественного наследования, так мы и должны быть против. Если мы его допускаем, значит мы его просто допускаем, зачем ограничения? Я вижу единственное объяснение: байка о ненужности множественного наследования реализаций - это маркетинговый ход, ибо архитекторы языка не осилили или не хотят выпячивать недостатки принятой ОО модели, чтоб они стали заметны. Вот C++ не стал комплексовать по этому поводу, а Дельфи и C# решили не рисковать.
Ещё раз. Проблема ромба - это не проблема множественного наследования, это проблема задача дизайна подсистемы. Вот есть у нас классы TA, TB и TC. Нужно их собрать в единый компонент. Каждый их них является производным от TLog, некого логгера. Ну, допустим он пишет журналы, каждый экземпляр TLog в отдельный файл. Таков дизайн. Надо, чтобы TA и TC разделяли общий экземпляр, потому что у них один файл ждурнала, а TB имел отдельную копию журнала. Причём тут программирование, если таков дизайн системы? Да, вот так спроектировали. Что с ней не так? Почему это плохой дизайн, и таких существовать не должно? Та вся VCL такова вообще-то, если копнуть принципы её устройства. Просто этого не очень видно, потому что мало кто изучает её философию, а не предоставляемые возможности, и поэтому мало кто видит, где за динамическим полиморфизмом и ссылками на интерфейсы в параметрах конструкторов объектов на самом деле скрывается замаскированное множественное наследование с разделением или объединеним атрибутов. Разделять или объединять аттрибуты - это задача - задача, а не проблема! - архитектора. И как он спроектирует, так и должно быть. После этого проблемы ромба просто нет, потому что дизайнер явно указал, что и как дожно быть. Берём и пишем.
Что делают Дельфисты, когда получают в разработку такой компонент? Правильно, говорят, что это говнодизайн и перепроектируют подсистему. Хотя почему говнодизайн, вменяемых аргументов от них обычно не дождёшься, окромя отсыла к Help и литературе по Object Pascal, писанной авторитетами. Хотя аргумент есть и весьма прост - их ОО модель этого не позволяет. Ну, некоторые это понимают и честно так и говорят. И я не вижу тут ничего такого уж предосудительного. Они сами выбрали инструмент разработки, имели право, и идут на компромиссы с его требованиями, и это неизбежно. И когда это приемлимо, та ради бога. Только вот не всегда приемлимо.
Что делают Плюсовики? Та объявляют TLog виртуальным базовым классом для TA и TC и обычным для TB, и всех делов. Вопрос: почему по факту прямое следование требованиям должно считаться худшим решением, нежели витиеватый балет вокруг да около из каких-то религиозных соображений, да ещё и обманывающий по части реальных взаимоотношений между классами, реализуя не те отношения, которые заложены интерфейсами? C++ в общем-то тоже не идеален. Я могу привести по меньше мере два недостатка его ОО модели в части множественного наследования, и мне тоже придётся в реализации неких вещей нет-нет, да и подогнать дизайн под требования модели. Но я уж точно при этом не буду врать, что мне подсунули говнодизайн.
 
Добавлено:
К слову. Правда, немного оффтопному.
Повторяющие как мантру "множественное наследование не нужно, вредно, создаёт проблемы" нужное подчекнуть мне всегда напоминают простых обывателей, слышавших о парадоксе близнецов в Теории Относительности. Ни те, ни те не могут внятно ничего сформулировать, если попросить аргументы. Первые просто отбрыкиваются негативными прилагательными и обидными существительными, без каких бы то ни было аргументов, вторые... скажем так, ещё никто, кого я спрашивал, не смог его даже правильно сформулировать, не говоря уже о том, чтобы разрешить.

----------
Одни с годами умнеют, другие становятся старше.

Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 06:46 21-10-2011 | Исправлено: Qraizer, 06:56 21-10-2011
wasilissk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Qraizer

Цитата:
Интерфейс и реализация - это понятия из ОО проектирования, а не ОО программирования.

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

Цитата:
А я о чём?

А ты об отмене интерфейса в иерархии. Где в предке он доступен, а в потомке отменен.  

Цитата:
В предложенной тобой делфийской реализации интерфейсы не нужны.  


Цитата:
 Т.е. реализация интерфейсов может существовать и без наследования от них?  

В огороде бузина, а в Киеве - дядька. Не нужны, это значит - не нужны, т.е. вообще не нужны. Ни реализация, ни декларирование.  
Это ТЗ придумал ты, а не консилиум, точнее высосал его из пальца, а еще точнее - все что касается реализации, а не поставленной задачи. Дабы придумать хоть какой-то аргумент в пользу множественного наследования, изюминкой этого ТЗ является жесткое, грязное и неправильное приведение типов. Если бы такую же глупость совершил бы консилиум, это бы ничего не изменило. Примеров самодурства высоколобых седых дядек в жизни уйма. Борька Моисеев  богат и влиятелен, но это не отменяет того факта что он педик. Твое ТЗ неправильно и тот факт, что сам доцент поставит на нем свою резолюцию - его правильным не сделает.
Кстати страшным авторитетом кандидаты являются только для необразованных птушников. У нас в тестерах сидят два кандидата.

Цитата:
То что ты имеешь в виду - это каст, cast, и это сленг, ибо правильно тогда уж тайпкаст.

Ну конечно, а то что ты имеешь в виду - это конечно же не сленг, а самый что ни на есть энциклопедический термин.

Цитата:
Конструктива нет и не будет. Не верю, что ты прикидываешься, а троллей я ненавижу, и это ещё мягко сказано. Уволен. Ты ещё TObject перепиши в подобной ситуации.  

Ок, так и запишем, что такое паттерн посетитель ты тоже не знаешь. Применять не умеешь.  
Забавная статистика получается, из всех паттернов упомянутых тобой (абстрактная фабрика, стратегия, фабричный метод, фасад, посетитель) ни один ты не знаешь, а это азбука как-никак.

Цитата:
Объектно-ориентированное - это лайт-версия для императивных языков.

Т.е. имеем множество ОП языков. Имеем его подмножество императивных  ООП языков, оно нам не интересно. Так что это за дополнение до множества ОП языков, определение, примеры?  

Цитата:
Нет. Это есть утверждение о том, что в любой книжке по проектированию нет программирования.

Ну коне-е-ечно, те же gof-ы, Буч - Объектно-ориентированный анализ и проектирование, куча книг Мартина, Бека, Нильсона это все книжки не по проектированию.

Всего записей: 293 | Зарегистр. 25-12-2006 | Отправлено: 08:23 21-10-2011
Eternal_Shield

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Qraizer

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

 
Тут надо чётко понимать, что в делфи интерфейс - это НЕ класс и не имеет с ним ничего общего.  Поэтому, если объект (класс) имеет N интерфейсов, то каждый взятый интерфейс будет иметь СВОЙ адрес, а не адрес ОБЪЕКТА. Соотв., через приведение интерфейса к типу объекта, нельзя получить адрес объекта. Надеюсь я ясно выразился.
 
Следовательно, у интерфейса IHistory будет ссылка на таблицу с адресом AAAAAAAA, у интерфейса IRichEdit ссылка будет на таблицу с адресом AAAAAAAC. Вызов метода N через не родственного интерфейса сработает, если будет совпадение сигнатур и индекса в объявленных интерфейсах. Но вызов будет одного и того же метода. И не более того.  
 
Если не совсем ясно, могу привести пример:
 

Код:
 
type
  IHistory = interface
    function getCachedLines: Cardinal;
    ....
  end;
 
  IRichEdit = interface
    function getCurrentLines: Cardinal;
    ....
  end;
 

 
то вот это сработает и будет вызван один и тот же метод
 

Код:
 
FUNCTION getLinesCount(hist:IHistory):Cardinal;  
    VAR edit:IRichEdit;  
  BEGIN  
    Result := hist.getCachedLines;  
     
    TRY  
     edit   := hist AS IRichEdit;  
     Result := Result - edit.getCurrentLines  
    EXCEPT  
    END  
  END;
 

даже try..except не нужен будет. Только вот вызван будет один и тот же метод и в результате будет 0
 
Тут логика ясна (из-за наложения)....а вот получить ссылку на IRichEdit путём обычного преобразования из IHistory - невозможно.  
 
З.Ы: Этим постом я хотел, чтобы Вы поняли, почему это не будет работать.

Всего записей: 766 | Зарегистр. 18-05-2009 | Отправлено: 10:47 21-10-2011 | Исправлено: Eternal_Shield, 10:55 21-10-2011
Qraizer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
wasilissk, почитай первый абзац последнего поста Eternal_Shield-а, успокойся и возвращайся в ВУЗ. С тобой разговор я окончил, тема наполнена материалом, чего и хотелось, собственно. Есть что анализировать интересующимся.
Прочитав умных книжек, нахватавшись аббревиатур и терминов и зазубрив приведённые там примеры, ты не становишься умнее. Умнее тебя делает понимание изложенных идей, знание причин, приведших именно к такому имеющемуся там дизайну инструментов, представление об их плюсах и минусах и плюсах и минусах альтернативных их дизайнов. Знать же назубок данный тебе материал - этого достаточно для кодера, но не программиста.
И кстати, только что ты сильно обидел конструкторов одного из подрядчиков Боинг-787. А до этого - подрядчика Gulfstream IV и V, Dassault Falcon 900, 2000 и 7X, Embraer, Cessna, AgustaWestland, Hawker Horizon. И это ещё не все, только те, к которым приложены в частности мои руки. Нет, я не хвастаюсь, всего лишь тебя ставлю на место. Пересчитай свои посты и покажи пальцем в агрументы в них, а не сферические слова и эмоции. Сравнивает он тут себя с кандидатами наук физики атмосферы, специалистами по аэродромному и самолётному радиооборудованию, профессорами сопромата и конструкторами-практиками в области авионики. Да ещё и работающими в компании, по инициативе которой никакой самолёт, не имеющий у себя реализованных по меньшей мере двух её новаторских инициатив, изобретённых, реализованных, запатентованных и предложенных в качестве мировых стандартнов, в небо Европы даже пустят. Ты ни на один вопрос не ответил, ни одного своего тезиса не аргументировал. Так что побереги свои гонор и самомнение для подружек.  
 
Eternal_Shield
Цитата:
Тут надо чётко понимать, что в делфи интерфейс - это НЕ класс и не имеет с ним ничего общего.  Поэтому, если объект (класс) имеет N интерфейсов, то каждый взятый интерфейс будет иметь СВОЙ адрес, а не адрес ОБЪЕКТА. Соотв., через приведение интерфейса к типу объекта, нельзя получить адрес объекта. Надеюсь я ясно выразился.  
Более чем. Возможно, открою секрет, но в Плюсах всё точно так же. Окромя того, что интерфейсов там нет, их (почти) заменяют абстрактные классы. Именно преобразованием адреса и занимается dynamic_cast<>. Безусловно, каждый подобъект разделяет в цельном объекте, предком которого он является, некое пространство стораджа, и безусловно адреса подобъектов будут все разные, окромя может быть одного-единственного, чей адрес может оказаться равным самому цельному объекту.

Цитата:
Следовательно, у интерфейса IHistory будет ссылка на таблицу с адресом AAAAAAAA, у интерфейса IRichEdit ссылка будет на таблицу с адресом AAAAAAAC. ...
Под ... я спрятал уже несущественное. Применяя твои условности к моему вон тому коду, когда я подам на вход dynamic_cast<> указатель типа IHistory, указывающий на подобъект (некоего производного от него объекта, в данном случае - экземляра TQIP), чья VMT содержит ссылку на AAAAAAAA, на выходе из dynamic_cast<> я получу указатель типа IRichEdit, указывающий на подобъект (того же экземпляра TQIP), чья VMT содержит ссылку AAAAAAAC. Разумеется, только в том случае, если в пределах этого объекта действительно имеется такой маршрут от IHistory до IRichEdit, иначе dynamic_cast<> вернёт NULL. dynamic_cast<> гуляет и ищет любые маршруты по всей RTTI объекта, и способен от любого его подобъекта перейти к любому другому его же подобъекту. Полученный указатель будет указывать на этот подобъект как родной, и может использоваться со всеми прелестями полиморфного поведения цельного объекта. Если объект не содержит IRichEdit, или содержит, но он недоступен по причине неоднозначности (т.е. их больше одного доступного) или непубличности, или если маршрут до него пролегает по хотя бы одному неполиморфному классу, dynamic_cast<> будет бессилен. В случае использования ссылок вместо указателей, поведение не меняется, кроме как при неуспешном касте будет бросок исключения std::bad_cast вместо возврата NULL.
Я, если честно, ожидал от AS хотя бы подобного поведения, и в тайне надеялся, что ввиду явной поддержки агрегации на уровне языка AS умеет разгребать и их. Получается, что ошибался. Можешь тогда привести полную информацию, что AS умеет и чего не умеет? Интересно просто. И, да, чуть не забыл. dynamic_cast<> не работает с агрегатами. Просто потому, что они вне иерархии, и о них нет информации в VMT их "владельца".

----------
Одни с годами умнеют, другие становятся старше.

Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 05:04 22-10-2011 | Исправлено: Qraizer, 05:25 22-10-2011
Eternal_Shield

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Qraizer

Цитата:
Применяя твои условности к моему вон тому коду, когда я подам на вход dynamic_cast<> указатель типа IHistory, указывающий на подобъект (некоего производного от него объекта, в данном случае - экземляра TQIP), чья VMT содержит ссылку на AAAAAAAA, на выходе из dynamic_cast<> я получу указатель типа IRichEdit, указывающий на подобъект (того же экземпляра TQIP), чья VMT содержит ссылку AAAAAAAC.

 
Не выйдет, ибо при вот таком вызове:

Код:
 
var
   Qip: TQIP;
 
....
 getLinesCount(Qip);  
 

или вот таком, без разницы

Код:
 
var
   QipHistory: IHistory;
 
....
 getLinesCount(QipHistory);  
 

 
внутри функции будет интерфейс с адресом $AAAAAAAA...и по этому адерсу лежит вполне конкретная таблица сигнатур. Сам тип указателя можно приводить к чему угодно, таблица от этого неизменится.  
 

Цитата:
...чей адрес может оказаться равным самому цельному объекту.

Если подобъект интерфейс - нет, если класс - да и адрес всегда адрес объекта, и никак по-другому. Интерфейс по определению не может иметь одинаковый с объектом адрес.
 

Цитата:
Возможно, открою секрет, но в Плюсах всё точно так же. Окромя того, что интерфейсов там нет, их (почти) заменяют абстрактные классы.

Значит не точно так же. Поскольку на входе указатель на САМ объект, то ясен пень, этот указатель можно в кого угодно преобразовать, а учитывая, что все эти псевдо-интерфейсы, не более чем классы-родители объекта, то неудивительно, что можно сделать что угодно
 
 

Всего записей: 766 | Зарегистр. 18-05-2009 | Отправлено: 09:55 22-10-2011 | Исправлено: Eternal_Shield, 09:58 22-10-2011
wasilissk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Qraizer

Цитата:
почитай первый абзац последнего поста Eternal_Shield-а, успокойся и возвращайся в ВУЗ. С тобой разговор я окончил, тема наполнена материалом, чего и хотелось, собственно. Есть что анализировать интересующимся.

Во-первых, этот абзац был тебе адресован, для тебя может он и стал открытием, моим же словам это ни коим образом не противоречит.
Во-вторых, со своим пророчеством ты попал пальцем в небо, ВУЗ я закончил десять лет назад.

Цитата:
Прочитав умных книжек

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

Цитата:
И кстати, только что ты сильно обидел

Мдя, жесть, сам и не заметил как обидел Боинги, Фалконы, ну ладно хоть АйБиЭм и Майкрософт от меня не пострадали, а мировой кризис не я случайно начал, часовню не я развалил?

Цитата:
Сравнивает он тут себя  

Я себя ни с кем не сравнивал. Ты кстати сообщил по секрету “очень для меня важную” весть о своей ненависти к троллям, поделюсь и я с тобой - я ненавижу балаболов, демагогов всех мастей, трепачей, которые треплют языком, открыто лгут, искажают  реплики оппонента, и не отвечают за свои слова.

Цитата:
Пересчитай свои посты и покажи пальцем в агрументы в них

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

Всего записей: 293 | Зарегистр. 25-12-2006 | Отправлено: 15:59 22-10-2011 | Исправлено: wasilissk, 16:00 22-10-2011
Qraizer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Eternal_Shield, то, что AS не подходит, ты уже говорил. И сказал, что подходит вместо него. Так а что тогда делает AS? Совсем бесполезная фича, получается, на уровне *(int*)&some_double?
Что касается сказанного про dynamic_cast<> ...хочешь продемонстрирую? Или так поверишь? В C++ dynamic_cast<> - отличная вещь. Вкупе с динамическим полиморфизмом и шаблонами в статике они RTTI в явном виде делают практически ненужным.
wasilissk, АйБиЭм и Майкрософт не занимаются созданием высококритичного ПО. Им без надобности вкачивать в проектирование и тестирование средств на три порядка больше, чем на программирование. И уж поверь, в авионике, атомной энергетике и медицине средства моделирования, используемые на этапах ТЗ -> system requirements -> high-level requirements -> low-level requirements, и методы описания целевых систем таковы, что какие-нибудь Rational Rose с UML-ем на их фоне детский лепет. На твои заявления, мол, так системы не проектируют, тебя просто уволят и заменят индусом, который сумеет перевести смоделированную, отлаженную и отточенную на кластере архитектуру в код. Хоть индусов там и не любят. Кодят они, кстати, весьма неплохо, это программить и дизайнить они не умеют, максимум - наттыкать паттернов и связать их прокси-классами. Перенести объектное представление с указанными взаимоотношениями между подсистемами на C, не то что C++ - после 3-го курса это дело техники. Не ври про ВУЗ, не верится. Им глубоко наплевать на твоё образование, как и чему тебя учили и откуда у тебя диплом. Они спроектировали систему, которая относительно проста и надёжна, модель которой прошла все испытания, показала соответствие заданным характеристикам и влезает в бюджет. И уж точно гибкая, потому как потом будет ещё одна система, а деньги считать они умеют. Кстати, в школе тоже учат дробные, равноудалённые от соседних целых, округлять в большую сторону, но жизнь оказывается богаче. Похоже, что если про ВУЗ и не брехня, то научить тебя учиться дальше опытом он не смог.
Менторский тон ты сам вынудил. Думаешь у пилота нету аналога QIP под рукой? А что тогда делает вон та коробочка, справа от пилота, на ней ещё MCDU написано? Ты не поверишь: помимо множества переключаемых экранчиков Radio, TCAS, XPDS итп, построчно выводит оповещения, при необходимости управляется со scratch pad-а и отчитывается обо всём в чёрный ящик. Ой, да? Так что уволен, уволен. От тебя одни вычитанные где-то тезисы и кивки в сторону авторов умных книжек. От меня, прости, практика. А также аргументы и примеры. В холиварах не ставится цель переубедить оппонента. На то он и холивар. Холивар нужен для обмена мнениями и точками зрения с аргументированием своих позиций, для демонстрации преимуществ и недостатков каждой. Чтобы любой заинтересованный товарищ, гуглящий свою проблему или даже простой вопрос "с чего начать учиться програмить" и наткнувшийся на эту тему, пришёл и почитал. Даже вдруг я неправ, ты его замечательно мотивировал, поздравляю.

----------
Одни с годами умнеют, другие становятся старше.

Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 02:18 21-11-2011
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Qraizer
Осталось добавить только, что самый Феерический момент ООП - инкапсуляция. Это только опыт, (имхо), но после опыта понимание ставит программиста на следующий уровень.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 16:56 25-11-2011
Qraizer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
delover, ты может быть не поверишь, но инкапсуляция не есть прерогатива ООП. Модульное программирование вовсю использует непубличные сущности, "чтобы не засорять глобальное пространство имён", ага. Пространства имён зачастую являются куда как более удобным средством инкапсуляции.
Более того, она не обязательна в том виде, каково её определение. Аттрибуты объекта могут храниться вообще отдельно от объекта. Более того, объект может даже представления не иметь, сколько и какие аттрибуты он имеет. Весь вопрос в требуемом уровне абстракции. Если б из дискуссии не получился холивар, а из того в свою очередь дерьмо, я б привёл интересных примеров. Я скажу ещё более крамольную вещь: инкапсуляния в том виде, как она определяется, на самом деле нафиг не нужна. Она просто удобна, но не необходима. По-настоящему необходимым является только лишь запрет на неконтролируемый доступ к аттрибутам объектов, ибо в этом случае нет никаких гарантий касательно соблюдения инвариантов. Инкапсуляция служит этой цели наилучшим из простейших методов, да и то не полностью. Но эта цель может быть достигнута и иначе.

----------
Одни с годами умнеют, другие становятся старше.

Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 04:48 27-11-2011 | Исправлено: Qraizer, 05:03 27-11-2011
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » В чем преимущество ООП ?


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru