event на невизуальном классе

Вопросы программирования и использования среды Lazarus.

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

Re: event на невизуальном классе

Сообщение Лекс Айрин » 14.01.2019 12:40:12

MylnikovDm, ты не прав. Этот проперти позволит в будущем заменить переменную на вызов метода, да и служит дополнительным контролем от непланомерного изменения переменной. То есть, это реализация инкапсуляции.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: event на невизуальном классе

Сообщение Ichthyander » 14.01.2019 15:08:04

MylnikovDm заранее не всегда известно понадобятся ли геттеры и сеттеры для нового свойства, так что я создаю свойство. По необходимости добавляю процедуры для установки и чтения свойства. Если свойство понадобится в наследниках или снаружи. В противном случае, если нового поле нужно только для внутренних нужд класса, то property не делаю, просто поле класса

Добавлено спустя 1 минуту 53 секунды:
Еще если property published, то удобно использовать для rtti функций
Аватара пользователя
Ichthyander
постоялец
 
Сообщения: 496
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: event на невизуальном классе

Сообщение MylnikovDm » 14.01.2019 20:19:28

Лекс Айрин писал(а):MylnikovDm, ты не прав. Этот проперти позволит в будущем заменить переменную на вызов метода, да и служит дополнительным контролем от непланомерного изменения переменной. То есть, это реализация инкапсуляции.


Ichthyander писал(а):MylnikovDm заранее не всегда известно понадобятся ли геттеры и сеттеры для нового свойства, так что я создаю свойство. По необходимости добавляю процедуры для установки и чтения свойства. Если свойство понадобится в наследниках или снаружи.


А что мешает преобразовать простое поле класса в property с тем же именем именно в тот момент, когда потребовалось использовать функции для чтения или записи?

Что касается "инкапсуляции", то при доступе для чтения и записи на самом деле никакой инкапсуляции не происходит. Да и код, который выдаст компилятор, будет абсолютно одинаковым.

Ichthyander писал(а):В противном случае, если нового поле нужно только для внутренних нужд класса, то property не делаю, просто поле класса

Если поле нужно только для внутренних нужд класса, то оно не размещается в секции public.

Ichthyander писал(а):Еще если property published, то удобно использовать для rtti функций.

А с чего вы взяли, что в published нельзя объявить просто поля?

читаем документацию https://www.freepascal.org/docs-html/ref/refsu37.html
For methods, fields and properties in the Published section, the compiler generates RTTI information (Run Time Type Information), which can be used to query the defined methods, fields and properties in the published section(s).

Only class-typed fields can be published. For properties, any simple property whose size is less than or equal to a pointer, can be declared published: floats, integers, sets (with less than 32 distinct elements), enumerateds, classes or dynamic arrays (not array properties).

Although run-time type information is available for other types, these types cannot be used for a property or field definition in a published section. The information is present to describe f.e. arguments of procedures or functions.


Есть, правда, некоторые ограничения, указанные во втором абзаце про размер поля, который должен быть меньше или равен длине указателя. То есть, для 32х разрядных версий не получится использовать поле типа doube, только float. Но в остальном большую часть базовых типов можно объявлять просто как обычное поле в разделе published.
MylnikovDm
новенький
 
Сообщения: 92
Зарегистрирован: 15.02.2007 21:26:10
Откуда: Челябинск

Re: event на невизуальном классе

Сообщение Ichthyander » 14.01.2019 20:41:04

MylnikovDm писал(а):Если поле нужно только для внутренних нужд класса, то оно не размещается в секции public.

Я же это и имел ввиду - если оно для внутренних нужд, то я его и объявляю как private и property не использую, где оно в общем случае бессмысленно.
MylnikovDm писал(а):А с чего вы взяли, что в published нельзя объявить просто поля?
читаем документацию https://www.freepascal.org/docs-html/ref/refsu37.html

В Pascal многое что можно, но в общем случае лучше не делать. Так и в данном случае rtti генерит для полей в published, но вот класс TPropsStorage или, к примеру, стриминг и дестриминг JSON данных в объекты паскаля произойдет ли, если это будут не свойства, а просто поля? Я вот сильно сомневаюсь.
Аватара пользователя
Ichthyander
постоялец
 
Сообщения: 496
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: event на невизуальном классе

Сообщение Лекс Айрин » 14.01.2019 21:27:37

MylnikovDm, мозги мешают. Всегда проще менять уже написанную реализацию, а не переделывать все каждый раз. Плюс, стоит привязаться к хорошему столу написания, когда реализация и интерфейс отделены, пусть чисто символически, друг от друга. Вообще, стоит учитывать, что код программы должен оптимизироваться на понимание человеком, а не компилятором. Уже даже директивы сильно вредят пониманию текста программы.
Как показала практика, published поля нужны прежде всего для дизайнера и прочих служебных целей. Конечно, в них можно создавать и обычные поля, но они могут вылезти где угтдно
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: event на невизуальном классе

Сообщение MylnikovDm » 15.01.2019 00:11:00

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

Опять же, вас никто не заставляет писать так, как вам нравится.
MylnikovDm
новенький
 
Сообщения: 92
Зарегистрирован: 15.02.2007 21:26:10
Откуда: Челябинск

Re: event на невизуальном классе

Сообщение Ichthyander » 15.01.2019 00:14:44

MylnikovDm писал(а):Если вы не знаете как применить возможности RTTI в своих программах, то это ещё не значит, что это нужно только для дизайнера.


В тот то и дело, что не только в дизайне. Я выше привел пример класс TPropsStorage и стриминга JSON объектов, которые и используют непосредственно RTTI
Аватара пользователя
Ichthyander
постоялец
 
Сообщения: 496
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot], Yandex [Bot] и гости: 4

Рейтинг@Mail.ru