Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 287 288 [289] 290 291 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#4321
,
|
|
|
|
Цитата korvin @ нет, только один method Memo.copyDataFrom (CanGiveCollection<Stringable> anyObject) clear addAll(anyObject.items) end ОМГ! То есть, вместо набора методов набор объектов извлечения коллекции, я правильно понял? Понятно, что это ООП, но чем это лучше предоставления атрибута в виде объекта-коллекции? Добавлено Цитата Flex Ferrum @ А потому, если объект сообщает клиенту, что у него есть длина, значит клиент может ее запросить. Или изменить. Не нарушая инкапсуляции объекта, поскольку делает это посредством публичного интерфейса и под полным контролем. Собственно, под свойствами мною понимается именно это - элемент публичного интерфейса объекта, скрывающий за собой доступ к сеттеру и геттеру, а потому никак инкапсуляцию не нарушающий. Точно. Я тоже не понимаю, почему скрытие сеттера и геттера нарушает чего-то там. Цитата Qraizer @ Кстати, мне вот интересно, можно ли в Дельфи обеспечить ОП-шное раздельное наследование аттрибутов при ромбовидной иерархии иначе чем ручным программированием инвариантов? Иначе же минимальной единицей разделения/совмещения является исключительно класс. В Delphi нет множественного наследования, следовательно и с ромбом разбираться не приходится. А у интерфейсов нет данных (свойства есть, но это всегда геттер/сеттер). |
|
Сообщ.
#4322
,
|
|
|
|
Romkin, если у тебя окажется ромб в интерфейсах, отсутствие в Дельфи множественного наследования реализаций никак этому не поможет. Уже язык болит говорить, что отсутствие множественного наследования реализаций не решает никаких проблем, а вместо этого тупо подменяет понятия, из-за чего проблемы перестают восприниматься как проблемы и начинают - как естественные ожидаемые траблы.
|
|
Сообщ.
#4323
,
|
|
|
|
Цитата Qraizer @ Romkin, если у тебя окажется ромб в интерфейсах, отсутствие в Дельфи множественного наследования реализаций никак этому не поможет. Каким образом окажется ромб в интерфейсах? Это принципиально невозможно, у интерфейса нет полей данных и виртуальных методов. Цитата Qraizer @ Уже язык болит говорить, что отсутствие множественного наследования реализаций не решает никаких проблем, а вместо этого тупо подменяет понятия, из-за чего проблемы перестают восприниматься как проблемы и начинают - как естественные ожидаемые траблы. Ну-ну. Это когда интерфейсы подменяют абстрактными классами - вот тогда траблы имеют место. |
|
Сообщ.
#4324
,
|
|
|
|
Цитата Romkin @ ОМГ! То есть, вместо набора методов набор объектов извлечения коллекции, я правильно понял? хз, я не понял тебя Добавлено Цитата Romkin @ Точно. Я тоже не понимаю, почему скрытие сеттера и геттера нарушает чего-то там. где там скрытие, когда наоборот предоставление прямого доступа? Добавлено Цитата Romkin @ Понятно, что это ООП, но чем это лучше предоставления атрибута в виде объекта-коллекции? тем, что не вводит в заблуждение и соответственно не ухудшает читабельность |
|
Сообщ.
#4325
,
|
|
|
|
Цитата korvin @ где там скрытие, когда наоборот предоставление прямого доступа? Доступ к приватному полю через метод - это прямой доступ? Цитата korvin @ хз, я не понял тебя Может быть и я не понял твой код. Я не понимаю, как можно связать разнородные объект, не написав под каждый тип свой вспомогательный объект. Добавлено Цитата korvin @ тем, что не вводит в заблуждение и соответственно не ухудшает читабельность Свойства улучшают читабельность. Сам же запутался, получаем length, а устанавливаем через resize. Да, никаких заблуждений. |
|
Сообщ.
#4326
,
|
|
|
|
Цитата Flex Ferrum @ А потому, если объект сообщает клиенту, что у него есть длина, значит клиент может ее запросить. Или изменить. Может. С помощью соответствующих методов. Зачем на это нужно наворачивать еще нечто, уменьшающее прозрачность? Добавлено Цитата Romkin @ Я тоже не понимаю, почему скрытие сеттера и геттера нарушает чего-то там. А я не понимаю, зачем скрывать сеттеры и геттеры. Ведь это уменьшает прозрачность и ухудшает понимания происходящего. Читая высокоуровневый код, как ты отличишь обращения к свойству от прямого обращения к полю? Добавлено Цитата Romkin @ Свойства улучшают читабельность. Каким образом? Добавлено Цитата Qraizer @ Romkin, если у тебя окажется ромб в интерфейсах А к каким проблемам приводит робм в интерфейсах? |
|
Сообщ.
#4327
,
|
|
|
|
Цитата D_KEY @ Может. С помощью соответствующих методов. Зачем на это нужно наворачивать еще нечто, уменьшающее прозрачность? А чем это будет принципиально отличаться от доступа к свойству, как к атрибуту? Основная идея инкапсуляции в чём? Внешние клиенты могут менять состояние объекта только разрешённым и контролируемым способом, описываемом в публичном интерфейсе. Если обращение к атрибуту явным образом контролируется объектом, то в чём проблема? Цитата D_KEY @ Читая высокоуровневый код, как ты отличишь обращения к свойству от прямого обращения к полю? А зачем тебе это отличать читая код клиента? Валидировать публичный интерфейс объекта ты должен при проектировании этого интерфейса, а не в процессе работы с ним. |
|
Сообщ.
#4328
,
|
|
|
|
Цитата Romkin @ И что? Если у нескольких интерфейсов общий предок, их реализации не могут столкнуться с одинаковыми аттрибутами? Откуда принципиальная невозможность-то? Каким образом окажется ромб в интерфейсах? Это принципиально невозможно, у интерфейса нет полей данных и виртуальных методов. Добавлено В общем, я понял. Мой вопрос имеет ответом сам себя, только без ? в конце. Рассматриваю это как ещё один гвоздь. Вопрос вообще-то был навеян обсуждением пропертей. Добавлено Цитата D_KEY @ Ни к каким.А к каким проблемам приводит робм в интерфейсах? Проблем множественного наследования реализаций не существует. Существует задача дизайна системы, иногда сводящаяся к множественным базовым классам, и решаться эта задача должна архитектором системы. Это он должен определить, какие аттрибуты совмещаются, какие разделяются, и каким именно способом, модет быть даже определяя инварианты для них. Когда задача решена, программист реализует её в коде, пользуясь предоставленным инструментарием выбранного языка. В Дельфи я вижу неплохой инструмент для архитектора, но ущербный для программиста. |
|
Сообщ.
#4329
,
|
|
|
|
Цитата Flex Ferrum @ Если обращение к атрибуту явным образом контролируется объектом, то в чём проблема? Проблема в том, что есть еще один уровень непонятного назначения(ну максимум - синтаксический сахар), который влияет на проектирование(как показал korvin). Добавлено Цитата Qraizer @ Ни к каким. Тогда я не понял, в чем заключался твой вопрос. Цитата Существует задача дизайна системы, иногда сводящаяся к множественным базовым классам, и решаться эта задача должна архитектором системы. Это он должен определить, какие аттрибуты совмещаются, какие разделяются, и каким именно способом, модет быть даже определяя инварианты для них. Во-первых, в С++ тебе нужно определиться с виртуальностью базового класса не тогда, когда у тебя появился ромб, а при создании "среднего" класса, что печально. В данном случае реализация повлияла на языковую концепцию... В том же Eiffel эта проблема решается иначе, причем один атрибут верхушки ромба у тебя может быть "виртуальным", а другие нет. И определяет это программист того класса, в котором ромб возник. Во-вторых, я не очень понимаю, как это связанно с интерфейсами, ведь в них этих вопросов не возникает, даже при ромбе. |
|
Сообщ.
#4330
,
|
|
|
|
Цитата Romkin @ Доступ к приватному полю через метод - это прямой доступ? доступ к сеттеру/геттеру через свойство -- это прямой доступ к сеттеру и геттеру (прямой вызов сеттера и геттера), т.о. свойство ничего не скрывает Цитата Romkin @ Может быть и я не понял твой код. Я не понимаю, как можно связать разнородные объект, не написав под каждый тип свой вспомогательный объект. эээ... у меня нет никаких вспомогательных объектов, у меня есть объект Memo, в который заносятся данные и объект anyObject, из которого беруться данные и который реализует интерфейс CanGiveCollection<Stringable>, поэтому не понимаю о каком вспомогательном объекте идет речь. Цитата Romkin @ Свойства улучшают читабельность. Сам же запутался, получаем length, а устанавливаем через resize. Да, никаких заблуждений. я? не запутался, в чем путаница? и почему мы не можем изменять length с помощью resize? тебе не знакомы значение/перевод этих слов? |
|
Сообщ.
#4331
,
|
|
|
|
Цитата D_KEY @ А как проблемы множественного наследования относятся к моему вопросу? Вопрос был о потенциальной возможности управлять делением/совмещением отдельных атрибутов множественной базы без ручного кода. Библиотечный за ручной не считается, если он писан один раз и навсегда.Тогда я не понял, в чем заключался твой вопрос. Цитата D_KEY @ Я не говорил, что в Плюсах с этим гладко. И если ты помнишь, когда шёл разговор о множественном наследовании реализаций, не пытался доказывать обратное. Опять же, вопрос не в этом.Во-первых, ... Цитата D_KEY @ Может возникнуть при реализации. Особенно, если они попытаются заагрегировать уже готовые. (Хотя истинные труъ безусловно пойдут перепроектировать, не дай бог кто увидит.) К примеру реализация базовых потоковых IO операций должна быть едина для потоков ввода/вывода, следовательно атрибут, например, состояния потока - всякие там good, fail etc - должен совмещаться. Так <iostream> и поступает. А реализации IUnknown обязаны быть разделены, чтобы у каждого были свои счётчики. Или счётчик пользователей не является аттрибутом, потому что непубличный? Во-вторых, ... |
|
Сообщ.
#4332
,
|
|
|
|
Цитата D_KEY @ Проблема в том, что есть еще один уровень непонятного назначения(ну максимум - синтаксический сахар), который влияет на проектирование(как показал korvin). Да. Он влияет на проектирование. Делает интерфейс класса более очевидным и приближенным к реальности. |
|
Сообщ.
#4333
,
|
|
|
|
Цитата Flex Ferrum @ Делает интерфейс класса более очевидным и приближенным к реальности. ![]() нет, он привносит дополнительную ненужную сущность и вводит в заблуждение, что усложняет проектирование и ухудшает восприятие кода, делает синтаксис менее строгим и очевидным, что тоже ухудшает восприятие кода |
|
Сообщ.
#4334
,
|
|
|
|
Цитата korvin @ нет, он привносит дополнительную ненужную сущность и вводит в заблуждение, что усложняет проектирование и ухудшает восприятие кода, делает синтаксис менее строгим и очевидным, что тоже ухудшает восприятие кода Да что ты? Всё-таки я не понимаю, почему запись вида "int size = object.size;" хуже записи вида "int size = object.size()" или "int size = object.getSize();". На счёт сеттеров - тоже всё не так просто. С установлением новой длины - понятно. resize(int newLen) будет выглядеть логичнее. Но есть и другие случаи. Например, r/w-свойство Caption, отображаемое на заголовок окна. Чем запись "window->setNewCaption("Something New")" лучше, чем "window->Caption = "Something New";"? |
|
Сообщ.
#4335
,
|
|
|
|
Цитата Flex Ferrum @ Да что ты? Всё-таки я не понимаю, почему запись вида "int size = object.size;" хуже записи вида "int size = object.size()" или "int size = object.getSize();".и я не понимаю, почему ты решил, что для вызова метода обязательно нужны скобки Добавлено Цитата Flex Ferrum @ Чем запись "window->setNewCaption("Something New")" лучше, чем "window->Caption = "Something New";"? эта? ничем, а, например, ![]() ![]() window.changeCaptionTo "New Caption" лучше их обеих |