powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пятничные get-ы
15 сообщений из 40, страница 2 из 2
Пятничные get-ы
    #39654711
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbТут начинается моё мнение: бездумное следование этому правилу приводит к ситуации, когда класс наполняют куча вырожденных set-ов и get-ов, которые просто присваивают значение и возвращают его, просто потому что так правильно.

Это значит, что эти данные не должны принадлежать этому классу. Он их просто хранит для кого-то. А если они ему не нужны, то их у него надо забрать.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39654745
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbА чтобы они могли, когда это нужно, надо завести пару функций, set и get. Тут начинается моё мнение: бездумное следование этому правилу приводит к ситуации, когда класс наполняют куча вырожденных set-ов и get-ов, которые просто присваивают значение и возвращают его, просто потому что так правильно. Поэтому я считаю, что когда ввод-вывод значения в переменную класса не нуждается в проверках - set и get делать ненужно, а просто сделать переменную public и, если надо, назвать соответствующе нотации.

Частный случай, когда никто кроме самого класса установить значение переменной не может, вместо get-а можно(?) использовать public const-ссылку на эту переменную, что я и написал в первом посте.так-то оно вроде так, когда местечковый класс пишешь. Но вот когда твой код уходит в виде либы начинаются ходьбы по граблям из-за бинарной несовместимости. Я бы не очень обрадовался если бы какой-то разраб каждый раз интерфейсы менял на свою динамическую либу.
Поясню: для динамичекой либы, в идеале, вообще не должно быть ситуаций с вычислением смещения полей класса (когда даёшь доступ к полям напрямую), т.е. полупустой метод для установки это необходимое зло для обеспечения совместимости.

Кроме того set-метод обычно используется для создания триггера, т.е. каких-то действий при установке поля.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39654770
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Поясню: для динамичекой либы, в идеале, вообще не должно быть ситуаций с вычислением смещения полей класса (когда даёшь доступ к полям напрямую)Это один из самых смертных грехов. За такое сразу в ад - на "1С Платформу" пожизненно.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655302
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_kЭто значит, что эти данные не должны принадлежать этому классу. Он их просто хранит для кого-то. А если они ему не нужны, то их у него надо забрать.а кому их отдать? Я имел ввиду неконтролируемые значения.
kealon(Ruslan)Поясню: для динамичекой либы, в идеале, вообще не должно быть ситуаций с вычислением смещения полей класса (когда даёшь доступ к полям напрямую)Не понял про вычисление смещения полей. Это про DLL речь?
rdb_devЭто один из самых смертных грехов. За такое сразу в ад - на "1С Платформу" пожизненно.О чём речь?
kealon(Ruslan)Кроме того set-метод обычно используется для создания триггера, т.е. каких-то действий при установке поля.Ну с этим случаем всё ясно, я про это упоминал.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655317
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbа кому их отдать? Я имел ввиду неконтролируемые значения.
я тоже.
Если класс не контролирует эти значения, значит они ему не нужны. Просто, кто то приходит и кладет их. Кто то приходит и берет. А временем жизни управляет класс. Это неправильно.
Классу нужно обладать теми данными, которые он использует.

Это допустимо, если вся суть этого класса - хранить эти значения. Типа настройки какие то. Но тогда тут достаточно и структуры, рид онли которой достигается константностью ссылки на нее. Или сделать константные поля, инициализирующиеся в конструкторе.

Возьмем класс std::string. у него есть геттеры, типа size(). Но они не возвращают значение внутреннего поля, они возвращают размер строки. Это большая разница. Да, размер строки может быть записан во внутреннем поле и size вернет это значение, но для потребителя интерфейса это неважно. Его интересует размер строки, а не содержимое поля.

std::string предоставляет геттер data(). Дата возвращает указатель на последовательное расположение символов строки. И, скорее всего, этот указатель будет указывать память, в которой строка хранит свои символы. Но потребителю строки не нужен указатель на эту память. Ему нужен указатель на символы строки.

Поэтому геттеры и сеттеры у класса - это не способ записать/прочитать значение в поле объекта. Это способ повлиять на состояние или выяснить текущее состояние объекта. Только так нужно об этом думать. А в таком случае - прямой доступ к полю допустим в частном случае реализации, которая может измениться и интерфейс придется поменять. Потребители интерфейса не обрадуются :)
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655323
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbkealon(Ruslan)Поясню: для динамичекой либы, в идеале, вообще не должно быть ситуаций с вычислением смещения полей класса (когда даёшь доступ к полям напрямую)Не понял про вычисление смещения полей. Это про DLL речь?да
Вот, например, ты объявил класс, его реалиация ушла в dll. Оставляя паблик-поля ты "заставляешь" компилятор при обращении к ним жёстко прописывать смещение, а если пользуешься методом, то он будет сцеплен по имени.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655326
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_kТолько так нужно об этом думать.Ну вот не согласен. Так нужно думать, но это 100% случаев. Это был бы идеальный вариант, как телевизор: нажал одну кнопку, внутри произошло N невидимых процессов, телевизор включился, переключился на последний используемый канал, включил последнюю используемую громкость, и так далее. И всё одним простым методом. Это идеальный вариант, для совсем конечного пользователя. Программер, который делает пульт от телевизора, должен иметь больше прямого доступа к телевизору. А программер, который делает точку ИК-приёмника и обработку - ещё больше. И так далее.
Или вот ещё пример, делаю я игру с N объектов. Чтобы объект двигался, мне надо сделать функцию Go(), к примеру, внутрь класса засунуть x, y, z чтобы их никто не видел. Ок. Но тут мне надо посчитать коллизии, чтобы повлиять на движение. Если это объекты одного класса, то всё ок, а если разных? Тогда надо кому-то делать GetX, GetY, GetZ, потому что по всем координатам разные проверки. А если объект словил пулю другого класса? А если объект нашёл что-то, тоже другого класса? А если ветер (другого класса) подул - мне приходится постоянно пользоваться get-ами, потом set-ами. Это всё правильно по науке. Но вот, например, с учётом того, что в Debug версии нет inline - оно всё будет тормозить, а ещё мне тяжко будет в IDE во внутреннем цикле обработки мышкой быстро глянуть значение переменных - надо будет сначала залезть в QuickWatch самого объекта, потом по иерархии долго шарить в поисках нужных для просмотра переменных...
Не, я, конечно, утрирую, таких доступов к переменным бывает немного, но если в классе самих переменных много, много условных обработок - получается много кода на set/get.
alex_kЭто допустимо, если вся суть этого класса - хранить эти значения.почему вся? Данные могут логически быть связаны с классом, при этом никак не ограничиваться самим классом.
Вот пыль на телевизоре - она связана с телевизором, но стереть её может кто угодно, без использования set. В случае переноса телевизора - пыль перенесётся вместе с ним. Количество пыли самим телевизором никак не ограничивается(нет set с проверками), но собирает пыль на себя именно телевизор, т.е. нельзя сказать, что пыль связана с каким-то другим классом.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655328
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Оставляя паблик-поля ты "заставляешь" компилятор при обращении к ним жёстко прописывать смещение, а если пользуешься методом, то он будет сцеплен по имени.Ага, ясно.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655341
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbrdb_devЭто один из самых смертных грехов. За такое сразу в ад - на "1С Платформу" пожизненно.О чём речь?Речь о способе доступа к членам экземпляра класса, ссылку или указатель на который возвращает библиотечная функция. Любой доступ к членам такого объекта должен осуществляться исключительно через виртуальные методы интерфейсного класса.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655839
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devCEMbпропущено...
О чём речь?Речь о способе доступа к членам экземпляра класса, ссылку или указатель на который возвращает библиотечная функция. Любой доступ к членам такого объекта должен осуществляться исключительно через виртуальные методы интерфейсного класса.а я вот насчёт виртуальных методов не совсем согласен, статические лучше.
Для виртуальных компилятору придётся вставлять в код смещение метода из VMT, что запретит менять порядок методов, а со статикой таких проблем нету
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655854
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)а я вот насчёт виртуальных методов не совсем согласен, статические лучше.
Для виртуальных компилятору придётся вставлять в код смещение метода из VMT, что запретит менять порядок методов, а со статикой таких проблем нетуПо-моему, ты не совсем понял о чем идет речь. Использование библиотечных функций как статических методов класса вырождается в обычный Си-подобный API с передачей явной передачей указателя на структуру, а заголовочный файл, описывающий такой интерфейс будет выглядеть более громоздко и менее понятно.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655874
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devkealon(Ruslan)а я вот насчёт виртуальных методов не совсем согласен, статические лучше.
Для виртуальных компилятору придётся вставлять в код смещение метода из VMT, что запретит менять порядок методов, а со статикой таких проблем нетуПо-моему, ты не совсем понял о чем идет речь. Использование библиотечных функций как статических методов класса вырождается в обычный Си-подобный API с передачей явной передачей указателя на структуру, а заголовочный файл, описывающий такой интерфейс будет выглядеть более громоздко и менее понятно.прекрасно понимаю, в этом вырождении как раз и вся прелесть
а то что хидеры больше - нет, суммарно меньше, так как наследований нет
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655879
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devРечь о способе доступа к членам экземпляра класса, ссылку или указатель на который возвращает библиотечная функция. Любой доступ к членам такого объекта должен осуществляться исключительно через виртуальные методы интерфейсного класса.
Непонятно почему именно виртуальные методы интерфейсного класса, когда можно и PImpl'ом обойтись. Но тут всё на вкус и цвет.
Библиотечные интерфейсы C++ -- вещь достаточно хрупкая, накладывающая некие ограничения в измерениях версий рантаймов и правил манглинга различных компиляторов. Например, считается дурной практикой выставлять контейнеры STL в интерфейсы. API в C стиле до сих пор является статусом-кво стабильности ABI.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655942
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZБиблиотечные интерфейсы C++ -- вещь достаточно хрупкая, накладывающая некие ограничения в измерениях версий рантаймов и правил манглинга различных компиляторов.Чувствуется, ты никогда не пробовал реализовать объектный интерфейс. Манглинг там вообще неусметен... Например, надо тебе сделать объектный интерфейс для подключения к БД. Что ты делаешь:
1. Описываешь в заголовочном файле набор абстрактных интерфейсных классов, например: CONNECTION, TRANSACTION, QUERY DATASET и т.д.;
2. Пишешь реализацию библиотеки, наследуя для классов реализации интерфейсные классы и экспортируешь только одну Си функцию, возвращающую экземпляр наследника CONNECTION с реализацией всех наследованных виртуальных функций;
3. Далее, в проект, использующий твою библиотеку, включаем заголовочный файл, описывающий интерфейсные классы и "поднимаем ботинок за шнурок", типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CONNECTION & conn = mylib::getCONNECTION("my_database");
TRANSACTION & tran = conn.transactions.Сreate();
tran["property_name"] = some_value;
tran.Start();
QUERY & qry = conn.queries.Create();
qry.transaction = tran;
qry.SQL = "SELECT * FROM my_table";
if (qry.Prepare())
  qry.Exec();

и т.д... Иными словами, твоя библиотека экспортирует лишь одну функцию и никаких тебе манглингов. Единственное, что тебе нужно - предусмотреть проверку соответствия версии заголовочного файла и версии реализации библиотеки, чтобы быть уверенным, что все виртуальные методы на своих местах.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655946
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devNekZБиблиотечные интерфейсы C++ -- вещь достаточно хрупкая, накладывающая некие ограничения в измерениях версий рантаймов и правил манглинга различных компиляторов.Чувствуется, ты никогда не пробовал реализовать объектный интерфейс. Манглинг там вообще неусметен... Например, надо тебе сделать объектный интерфейс для подключения к БД. Что ты делаешь:
1. Описываешь в заголовочном файле набор абстрактных интерфейсных классов, например: CONNECTION, TRANSACTION, QUERY DATASET и т.д.;
2. Пишешь реализацию библиотеки, наследуя для классов реализации интерфейсные классы и экспортируешь только одну Си функцию, возвращающую экземпляр наследника CONNECTION с реализацией всех наследованных виртуальных функций;
3. Далее, в проект, использующий твою библиотеку, включаем заголовочный файл, описывающий интерфейсные классы и "поднимаем ботинок за шнурок", типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CONNECTION & conn = mylib::getCONNECTION("my_database");
TRANSACTION & tran = conn.transactions.Сreate();
tran["property_name"] = some_value;
tran.Start();
QUERY & qry = conn.queries.Create();
qry.transaction = tran;
qry.SQL = "SELECT * FROM my_table";
if (qry.Prepare())
  qry.Exec();

и т.д... Иными словами, твоя библиотека экспортирует лишь одну функцию и никаких тебе манглингов. Единственное, что тебе нужно - предусмотреть проверку соответствия версии заголовочного файла и версии реализации библиотеки, чтобы быть уверенным, что все виртуальные методы на своих местах.
По-видимому, у тебя там какая-то своя атмосфера из частной практики. Видимо, мы о разных вещах говорим.
Примерно так же реализованы драйвера БД в Qt.
Спасибо, открыл мне Америку.
...
Рейтинг: 0 / 0
15 сообщений из 40, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пятничные get-ы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]