![]() |
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]() ![]() ![]() |
|
rocky7 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 148 Регистрация: 20.1.2009 Репутация: нет Всего: нет |
Пытаюсь глубже понять объектную модель DELPHI. Для чего вводиться property? Для того чтобы только упростить запись вызова метода доступа к закрытым данным или есть ещё какие преимущества?
|
|||
|
||||
Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 4 Всего: 146 |
+ есть возможность сделать с этими данными все что угодно от проверки на валидность до ... -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. ![]() |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Концепция ООП не разрешает менять напрямую состояние объекта, а только действуя на него через методы, свойства фактически вызывают методы, при этом сохраняется привычная семантика как с полями данных. На самом деле свойству может и не соответствовать поле объекта. Меня свойство можно фактически не изменить состояние объекта или изменить его совсем не тривиальным образом. Когда читают свойство, аналогично, может не быть поля, в момент запроса данных может производиться вычисления или получение данных из внешнего устройства, например из файла.
Свойство скрывает данные от объекта получателя. Свойством можно ограничить доступ к полю данных, сделав его readonly. Или запретить чтение, а разрешить лишь запись, можно организовать потокобезопасное изменение данных. При этом код остается описательным и наглядным. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
rocky7 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 148 Регистрация: 20.1.2009 Репутация: нет Всего: нет |
Спасибо за ответ! Решил сегодня начать читать Марко Кэнту. На мой взгляд у него всё чётко разложено для понимания внутренних механизмов Delphi.
|
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
Вот это чушь полная. Наоборот. Конструкции без использования свойств (явный вызов методов get()/set()) хоть и более громоздки, но не скрывают факт, что в месте их вызова управление переходит к подпрограмме, которая, возможно, обладает side effects. А вот при обращение к свойству это скрывается. К тому же, по тексту программы невозможно определить, к чему мы обращаемся: к свойству или напрямую к полю.*
А в методах это сделать нельзя что-ли? Короче, очередная порция синтаксического сахара. Полезна она может оказаться лишь для визуальных систем (Delphi, VS). Но можно было обойтись и без них... * Только в Delphi она не реализована. public поля есть. Это сообщение отредактировал(а) kemiisto - 11.8.2009, 22:26 -------------------- |
|||
|
||||
Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 4 Всего: 146 |
можно , но имхо приятнее обратившись к полю текст у стринглиста и присвоив ему значение типа стринг на выходе получить набор строк разделеных переводом строки , чем вызывать ф_цию для того же ..... -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. ![]() |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Почему же скрывается, ты же видишь что это свойство, значит это не просто поле, а поле которое меняется функциями. При правильном проектировании ты не должен углубляться в структуру класса, ты видишь подходящее название, а остальное должен делать объект сам. Для тебя достаточно того что оно работает. Функция хороша, когда ты явно хочешь произвести действие, запустить процесс выполнения, начать операцию, например StartTransaction. Свойство работает когда ты хочешь корректно изменить состояние или узнать его при этом тебя мало волнуют какие будут произведены действия, например Width := 500. Добавлено через 5 минут и 30 секунд Проблема в том что функция может и не произвести правильного перевода состояния, потому что она означает действие, а для перевода в новое состояние может потребоваться несколько действий, попросту говоря можно вызвать функции не в той последовательности или не те действия. Что же касается функций предназначенных сугубо для смены состояния, так это просто недоделанные свойства загромождающие интерфейс. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
Ты не правильно меня понял. Класс проектируешь не ты. Ты читаешь исходник, в котором заюзан некий класс. Для того, чтобы понять, к чему идёт обращение в:
нужно заглянуть в интерфейс класса. А если это свойство, то нужно увидеть исходный код неявно вызываемой функции, которая write. Если хочешь убедиться в отсутствии side effects. -------------------- |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Это уже говорит о непродуманном проектировании. Объект это черный ящик. Если его писал другой человек, то он должен оставлять лишних хвостов в интерфейсе, а оставить лишь то что должен видеть другой человек. Минимально необходимый набор свойств для изменения состояния и минимально необходимый набор методов для управления процессами. Приведу аналогию. Анекдот. Приходит мужик в магазин и говорит мне нужна пила, ему показывают бензопилу, он покупает уходит довольный, через неделю возвращается и говорит, вот у вас тут написано что я могу за день 4 куба леса заготовить, а у меня больше куба не выходит. Продавец говорит ну давайте посмотрим, берет пилу, заводит. Клиент выпучив глаза смотрит на продавца ![]() Собственно если бензопилу не заводить, то соглашусь, что ей пилить не так удобно, как ручной пилой. ![]() -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
Даже если смотреть с этой точки зрения, то зачем добавлять в язык лишнюю возможность непродуманного проектирования? Зачем добавлять ещё одну степень свободы? Вот известная цитата Кернигана
То, что он говорит про С, не меняет сути дела. Нельзя расчитывать на "художников", которые могут соорудить элегантную программу. Как правило, большинство из нас, обычные люди, которым свойственно ошибаться и в итоге порождать то самое "кровавое месиво". "Не боги горшки лепят". Образцов "продуманного" проектирования практически не встречал. -------------------- |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Язык должен удовлетворять как новичком так и опытных. Например, в С++ можно писать шибко универсальный и гибкий код при помощи шаблонов всяких, получать доступ к данным итераторами согласовывать все шаблонными адаптерами. Но мой моск этого не осиливает ![]() ![]() Уже много лет обращаюсь к исходникам VCL и черпаю оттуда великолепные примеры грамотных реализаций. Скажем нужно что-то написать, вспоминаю аналоги, которые присутствуют в VCL, открываю код - вот вам и решение на каждый день. Есть еще один косяк проектирования, который как правило забывают все новички. Старательное документирование кода. Не просто комменты в коде, а сопроводительная документация с примерами и даже схемы. Это делать лень, на это всегда нет времени, но без этого написанный код это почти бесполезный набор строк. Обычно этого достаточно чтобы чужой человек мог правильно использовать не обращаясь к исходникам реализации. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 4 Всего: 146 |
имхо это надо только для работе в группе или для кода который через н-ное кол-во лет надо переделывать , в остальных случаях простых комментов хватает с головой -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. ![]() |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
Alexeis, поддерживаю. я за использование возможностей языка (в частности касательно свойств-пропертей). зачем не использовать для удобства предоставляемые возможности? это все равно, например, что купить машину, поставить под окном любоваться, и всем говорить - какая у меня клевая машине, но пешком привычнее и понятнее, а нажатие на педаль газа обладает side effects, ибо хз что там конструктора напридумывали.
Это сообщение отредактировал(а) MetalFan - 12.8.2009, 20:42 -------------------- There are always someone smarter than you... |
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
А меня никто не поддерживает... ![]() Машины бывают разные... -------------------- |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
данубросьты) тебе вообще не положено счас тут сидеть, а положено
![]() ну да... на некоторых действительно лучше не ездить) -------------------- There are always someone smarter than you... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |