Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
CEMbТут начинается моё мнение: бездумное следование этому правилу приводит к ситуации, когда класс наполняют куча вырожденных set-ов и get-ов, которые просто присваивают значение и возвращают его, просто потому что так правильно. Это значит, что эти данные не должны принадлежать этому классу. Он их просто хранит для кого-то. А если они ему не нужны, то их у него надо забрать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 10:12 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
CEMbА чтобы они могли, когда это нужно, надо завести пару функций, set и get. Тут начинается моё мнение: бездумное следование этому правилу приводит к ситуации, когда класс наполняют куча вырожденных set-ов и get-ов, которые просто присваивают значение и возвращают его, просто потому что так правильно. Поэтому я считаю, что когда ввод-вывод значения в переменную класса не нуждается в проверках - set и get делать ненужно, а просто сделать переменную public и, если надо, назвать соответствующе нотации. Частный случай, когда никто кроме самого класса установить значение переменной не может, вместо get-а можно(?) использовать public const-ссылку на эту переменную, что я и написал в первом посте.так-то оно вроде так, когда местечковый класс пишешь. Но вот когда твой код уходит в виде либы начинаются ходьбы по граблям из-за бинарной несовместимости. Я бы не очень обрадовался если бы какой-то разраб каждый раз интерфейсы менял на свою динамическую либу. Поясню: для динамичекой либы, в идеале, вообще не должно быть ситуаций с вычислением смещения полей класса (когда даёшь доступ к полям напрямую), т.е. полупустой метод для установки это необходимое зло для обеспечения совместимости. Кроме того set-метод обычно используется для создания триггера, т.е. каких-то действий при установке поля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 11:20 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Поясню: для динамичекой либы, в идеале, вообще не должно быть ситуаций с вычислением смещения полей класса (когда даёшь доступ к полям напрямую)Это один из самых смертных грехов. За такое сразу в ад - на "1С Платформу" пожизненно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 11:47 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
alex_kЭто значит, что эти данные не должны принадлежать этому классу. Он их просто хранит для кого-то. А если они ему не нужны, то их у него надо забрать.а кому их отдать? Я имел ввиду неконтролируемые значения. kealon(Ruslan)Поясню: для динамичекой либы, в идеале, вообще не должно быть ситуаций с вычислением смещения полей класса (когда даёшь доступ к полям напрямую)Не понял про вычисление смещения полей. Это про DLL речь? rdb_devЭто один из самых смертных грехов. За такое сразу в ад - на "1С Платформу" пожизненно.О чём речь? kealon(Ruslan)Кроме того set-метод обычно используется для создания триггера, т.е. каких-то действий при установке поля.Ну с этим случаем всё ясно, я про это упоминал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 05:22 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
CEMbа кому их отдать? Я имел ввиду неконтролируемые значения. я тоже. Если класс не контролирует эти значения, значит они ему не нужны. Просто, кто то приходит и кладет их. Кто то приходит и берет. А временем жизни управляет класс. Это неправильно. Классу нужно обладать теми данными, которые он использует. Это допустимо, если вся суть этого класса - хранить эти значения. Типа настройки какие то. Но тогда тут достаточно и структуры, рид онли которой достигается константностью ссылки на нее. Или сделать константные поля, инициализирующиеся в конструкторе. Возьмем класс std::string. у него есть геттеры, типа size(). Но они не возвращают значение внутреннего поля, они возвращают размер строки. Это большая разница. Да, размер строки может быть записан во внутреннем поле и size вернет это значение, но для потребителя интерфейса это неважно. Его интересует размер строки, а не содержимое поля. std::string предоставляет геттер data(). Дата возвращает указатель на последовательное расположение символов строки. И, скорее всего, этот указатель будет указывать память, в которой строка хранит свои символы. Но потребителю строки не нужен указатель на эту память. Ему нужен указатель на символы строки. Поэтому геттеры и сеттеры у класса - это не способ записать/прочитать значение в поле объекта. Это способ повлиять на состояние или выяснить текущее состояние объекта. Только так нужно об этом думать. А в таком случае - прямой доступ к полю допустим в частном случае реализации, которая может измениться и интерфейс придется поменять. Потребители интерфейса не обрадуются :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 07:19 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
CEMbkealon(Ruslan)Поясню: для динамичекой либы, в идеале, вообще не должно быть ситуаций с вычислением смещения полей класса (когда даёшь доступ к полям напрямую)Не понял про вычисление смещения полей. Это про DLL речь?да Вот, например, ты объявил класс, его реалиация ушла в dll. Оставляя паблик-поля ты "заставляешь" компилятор при обращении к ним жёстко прописывать смещение, а если пользуешься методом, то он будет сцеплен по имени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 07:53 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
alex_kТолько так нужно об этом думать.Ну вот не согласен. Так нужно думать, но это 100% случаев. Это был бы идеальный вариант, как телевизор: нажал одну кнопку, внутри произошло N невидимых процессов, телевизор включился, переключился на последний используемый канал, включил последнюю используемую громкость, и так далее. И всё одним простым методом. Это идеальный вариант, для совсем конечного пользователя. Программер, который делает пульт от телевизора, должен иметь больше прямого доступа к телевизору. А программер, который делает точку ИК-приёмника и обработку - ещё больше. И так далее. Или вот ещё пример, делаю я игру с N объектов. Чтобы объект двигался, мне надо сделать функцию Go(), к примеру, внутрь класса засунуть x, y, z чтобы их никто не видел. Ок. Но тут мне надо посчитать коллизии, чтобы повлиять на движение. Если это объекты одного класса, то всё ок, а если разных? Тогда надо кому-то делать GetX, GetY, GetZ, потому что по всем координатам разные проверки. А если объект словил пулю другого класса? А если объект нашёл что-то, тоже другого класса? А если ветер (другого класса) подул - мне приходится постоянно пользоваться get-ами, потом set-ами. Это всё правильно по науке. Но вот, например, с учётом того, что в Debug версии нет inline - оно всё будет тормозить, а ещё мне тяжко будет в IDE во внутреннем цикле обработки мышкой быстро глянуть значение переменных - надо будет сначала залезть в QuickWatch самого объекта, потом по иерархии долго шарить в поисках нужных для просмотра переменных... Не, я, конечно, утрирую, таких доступов к переменным бывает немного, но если в классе самих переменных много, много условных обработок - получается много кода на set/get. Вот пыль на телевизоре - она связана с телевизором, но стереть её может кто угодно, без использования set. В случае переноса телевизора - пыль перенесётся вместе с ним. Количество пыли самим телевизором никак не ограничивается(нет set с проверками), но собирает пыль на себя именно телевизор, т.е. нельзя сказать, что пыль связана с каким-то другим классом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 08:13 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Оставляя паблик-поля ты "заставляешь" компилятор при обращении к ним жёстко прописывать смещение, а если пользуешься методом, то он будет сцеплен по имени.Ага, ясно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 08:16 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
CEMbrdb_devЭто один из самых смертных грехов. За такое сразу в ад - на "1С Платформу" пожизненно.О чём речь?Речь о способе доступа к членам экземпляра класса, ссылку или указатель на который возвращает библиотечная функция. Любой доступ к членам такого объекта должен осуществляться исключительно через виртуальные методы интерфейсного класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 09:04 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
rdb_devCEMbпропущено... О чём речь?Речь о способе доступа к членам экземпляра класса, ссылку или указатель на который возвращает библиотечная функция. Любой доступ к членам такого объекта должен осуществляться исключительно через виртуальные методы интерфейсного класса.а я вот насчёт виртуальных методов не совсем согласен, статические лучше. Для виртуальных компилятору придётся вставлять в код смещение метода из VMT, что запретит менять порядок методов, а со статикой таких проблем нету ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 17:33 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)а я вот насчёт виртуальных методов не совсем согласен, статические лучше. Для виртуальных компилятору придётся вставлять в код смещение метода из VMT, что запретит менять порядок методов, а со статикой таких проблем нетуПо-моему, ты не совсем понял о чем идет речь. Использование библиотечных функций как статических методов класса вырождается в обычный Си-подобный API с передачей явной передачей указателя на структуру, а заголовочный файл, описывающий такой интерфейс будет выглядеть более громоздко и менее понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 17:44 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
rdb_devkealon(Ruslan)а я вот насчёт виртуальных методов не совсем согласен, статические лучше. Для виртуальных компилятору придётся вставлять в код смещение метода из VMT, что запретит менять порядок методов, а со статикой таких проблем нетуПо-моему, ты не совсем понял о чем идет речь. Использование библиотечных функций как статических методов класса вырождается в обычный Си-подобный API с передачей явной передачей указателя на структуру, а заголовочный файл, описывающий такой интерфейс будет выглядеть более громоздко и менее понятно.прекрасно понимаю, в этом вырождении как раз и вся прелесть а то что хидеры больше - нет, суммарно меньше, так как наследований нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 18:01 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
rdb_devРечь о способе доступа к членам экземпляра класса, ссылку или указатель на который возвращает библиотечная функция. Любой доступ к членам такого объекта должен осуществляться исключительно через виртуальные методы интерфейсного класса. Непонятно почему именно виртуальные методы интерфейсного класса, когда можно и PImpl'ом обойтись. Но тут всё на вкус и цвет. Библиотечные интерфейсы C++ -- вещь достаточно хрупкая, накладывающая некие ограничения в измерениях версий рантаймов и правил манглинга различных компиляторов. Например, считается дурной практикой выставлять контейнеры STL в интерфейсы. API в C стиле до сих пор является статусом-кво стабильности ABI. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 18:07 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
NekZБиблиотечные интерфейсы C++ -- вещь достаточно хрупкая, накладывающая некие ограничения в измерениях версий рантаймов и правил манглинга различных компиляторов.Чувствуется, ты никогда не пробовал реализовать объектный интерфейс. Манглинг там вообще неусметен... Например, надо тебе сделать объектный интерфейс для подключения к БД. Что ты делаешь: 1. Описываешь в заголовочном файле набор абстрактных интерфейсных классов, например: CONNECTION, TRANSACTION, QUERY DATASET и т.д.; 2. Пишешь реализацию библиотеки, наследуя для классов реализации интерфейсные классы и экспортируешь только одну Си функцию, возвращающую экземпляр наследника CONNECTION с реализацией всех наследованных виртуальных функций; 3. Далее, в проект, использующий твою библиотеку, включаем заголовочный файл, описывающий интерфейсные классы и "поднимаем ботинок за шнурок", типа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. и т.д... Иными словами, твоя библиотека экспортирует лишь одну функцию и никаких тебе манглингов. Единственное, что тебе нужно - предусмотреть проверку соответствия версии заголовочного файла и версии реализации библиотеки, чтобы быть уверенным, что все виртуальные методы на своих местах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 19:38 |
|
||
|
Пятничные get-ы
|
|||
|---|---|---|---|
|
#18+
rdb_devNekZБиблиотечные интерфейсы C++ -- вещь достаточно хрупкая, накладывающая некие ограничения в измерениях версий рантаймов и правил манглинга различных компиляторов.Чувствуется, ты никогда не пробовал реализовать объектный интерфейс. Манглинг там вообще неусметен... Например, надо тебе сделать объектный интерфейс для подключения к БД. Что ты делаешь: 1. Описываешь в заголовочном файле набор абстрактных интерфейсных классов, например: CONNECTION, TRANSACTION, QUERY DATASET и т.д.; 2. Пишешь реализацию библиотеки, наследуя для классов реализации интерфейсные классы и экспортируешь только одну Си функцию, возвращающую экземпляр наследника CONNECTION с реализацией всех наследованных виртуальных функций; 3. Далее, в проект, использующий твою библиотеку, включаем заголовочный файл, описывающий интерфейсные классы и "поднимаем ботинок за шнурок", типа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. и т.д... Иными словами, твоя библиотека экспортирует лишь одну функцию и никаких тебе манглингов. Единственное, что тебе нужно - предусмотреть проверку соответствия версии заголовочного файла и версии реализации библиотеки, чтобы быть уверенным, что все виртуальные методы на своих местах. По-видимому, у тебя там какая-то своя атмосфера из частной практики. Видимо, мы о разных вещах говорим. Примерно так же реализованы драйвера БД в Qt. Спасибо, открыл мне Америку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 19:51 |
|
||
|
|

start [/forum/topic.php?fid=57&gotonew=1&tid=2017840]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
8ms |
get first new msg: |
7ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 299ms |
| total: | 451ms |

| 0 / 0 |
