|
0 / 1 / 0
Регистрация: 12.10.2018
Сообщений: 10
|
||||||
Сравнение методов доступа к данным класса12.10.2018, 14:36. Показов 3657. Ответов 49
Метки нет (Все метки)
Добрый день. Изучаю С++. И маленький перфекционист внутри меня не даёт покоя. Допустим есть класс.В нем находится поле класса типа массив(data) и публичный метод для доступа к ячейке этого массива(getCell). Далее в классе нужен ПРИВАТНЫЙ метод для обработки строки массива, который проверяет некоторые ячейки в строке(isMyRow). Как в этом методе правильней(оптимальней) обращаться к ячейкам массива: c помощью метода getCell или с помощью индексации[].
По идее индексация оптимальней, так как не задействует стек. Так что скажете ? Или я всё таки ерундой занимаюсь, задавая такие глупые вопросы??
0
|
||||||
| 12.10.2018, 14:36 | |
|
Ответы с готовыми решениями:
49
Обьявление методов доступа к данным класса. Напишите реализацию методов, предоставляющих доступ к данным класса. Отобразите в программе работу этих методов Сравнение скорости доступа к данным |
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
||
| 12.10.2018, 15:11 | ||
|
Если рассматривать общий случай, то я бы с осторожностью вызывал публичные методы изнутри других методов класса. Мотивировать это можно тем, что вызов публичного метода должен сохранять инвариант для данного объекта, т.е. переводить его из одного корректного с точки зрения программиста состояния в другое корректное состояние. Каждый раз, вызывая этот публичный метод из середины другого метода, можно столкнуться с проблемой того, что в данный момент времени объект находится в некорректном состоянии, что скорее всего приведет к ошибке. Я бы разделял между собой публичные методы и приватные и избегал бы вызовов одних публичных методов из других публичных или приватных методов. Скажем, можно иметь два варианта одной функции: публичную, которая имеет весь набор проверок для защиты "от дурака", и приватную - без проверок.
2
|
||
|
0 / 1 / 0
Регистрация: 12.10.2018
Сообщений: 10
|
|
| 12.10.2018, 15:24 [ТС] | |
|
Теперь стало понятнее. Спасибо за разъяснение проектирования.
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 12.10.2018, 16:27 | |||
|
всегда, когда есть функция-член для доступа к данным, нужно использовать именно эту функцию-член. при этом всегда нужно предпочитать использовать именно публичную функцию-член. разделение на функцию-член с проверками и аналогичную без проверок - путь в адъ. так никогда не делайте. но такой, что бы при этом он не являл собой пример говнокода.
1
|
|||
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|||
| 12.10.2018, 17:34 | |||
|
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||
| 12.10.2018, 17:39 | |||||
|
мы ведь говорить об инвариантных вещах? тесты делают, что бы отлаживать ничего не нужно было. ИТ сегодня на первое место ставит надежность. эффективность - где то на 10е, если не дальше. 2. откройте для себя assert.
0
|
|||||
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|
| 12.10.2018, 18:04 | |
|
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 12.10.2018, 18:17 | ||
|
вам не очевидно, что разделение проверочного кода и бизнес-логики делает код более запутанным, а бизнес-логику - не инвариантной?
1
|
||
|
Заблокирован
|
|
| 12.10.2018, 18:47 | |
|
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 12.10.2018, 20:37 | ||
|
"почему код пишут медленно?" "почему пишут плохо?" "почему сопровождение выливается в такие дикие расходы?" и тп. обычно, после вдумчивого прочтения его книги "совершенный код", сознание джуниора меняется, ему открывается дзен, и он шагнув на ещё одну ступеньку в своём развитии выше, уже никогда не будет как прежде. https://ru.wikipedia.org/wiki/... 0%B8%D0%B2
1
|
||
|
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
||
| 14.10.2018, 08:43 | ||
std::vector. Для доступа к его содержимому можно использовать operator[], а можно at(). Вот, вы лично какой чаще используете?
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 14.10.2018, 23:32 | |
|
avagor , я лично - только оператор скобки.
at() не понятно зачем вообще завезли.похоже, что для параноиков, которые убежденны, что код априори содержит грубые программные ошибки. и решили дополнительно подстраховаться в ситуациях, когда исполняемый процесс должен выжить, даже в условиях, когда он находится в неконсистентном состоянии. лично я категорически против подобной практики, и с позиции своего опыта полагаю, что подобная попытка защититься от собственного говнокода по итогу привет лишь к ещё большему говнокоду
0
|
|
|
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
||||
| 15.10.2018, 00:05 | ||||
operator[]?А как это соотносится с: Единственная причина использования публичных методов доступа к приватным данным внутри класса - DRY. Всё. Озвученное вами (хотя, может быть, мне показалось) - решение несуществующей проблемы методом, который более гемороен, чем сама проблема.
0
|
||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 15.10.2018, 01:02 | |
|
avgoor, в прямом смысле соотносится.
есть публичная функция-член оператор скобки. специально предназначенный для доступа к элементу. что вам не понятно? про гемморой вы конечно доставили, особенно в контексе DRY. и часто вы так противоречите собственным тезисам, в след. предложении?
0
|
|
|
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|||
| 15.10.2018, 02:43 | |||
|
Проверим, как мы получаем доступ к элементу нашего контейнера (а мы, ведь например, пишем какой-то контейнер каких-то объектов). Блжад, вышли за границу. Но мы, ведь, умные. МакКонела читали. Чтоб никогда, вот никогда... Давай проверять, вот, каждое обращение!!! Как, тормозит??? У нас все правильно, как гуру программинга завещали... Как, гуру программинга не об этом говорили??? Они об инкапсуляции??? Чтоб, другие мимо нашего контейнера не гадили??? Нeeeeeeeeee. У нас же все под контролем. Наш код пишут ущербные личности,которые не могут в осознание архитектуры. И, вот, всегда, когда нам нужен элемент нашего контейнера - пусть через публичный метод доступа к нему доступаются. У нас программисты - калечные. Даже те, которые работают над файлом с классом нашего контейнера... Ну, нельзя им позволять закладываться на реализацию того, что они сами реализуют. Так как у нас это все-таки тормозит, позовем реального гуру. Как гуру нас на х*й послал???
0
|
|||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||||||
| 15.10.2018, 03:28 | ||||||
|
avgoor, я конечно извиняюсь, но что мешает в operator[] ассерт добавить, который будет проверять инвариант в отладочной версии?
Вот в отладочной мы и получим все прелести программирования по Макконелу, а в релизной получим отсутствие тормозов. Все счастливы, все довольны.Кусочек кода из vector в MSVC.
0
|
||||||
|
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
| 15.10.2018, 03:50 | |
|
DrOffset, Я где-то ругал ассерты? Разговор-то о том, что уважаемый господин hoggy утверждает, что правильно обращаться к данным изнутри класса через публичные методы этого класса. Я утверждаю, что это не так (не всегда так). У нашей абстракции всегда должна быть реализация. И в этой реализации обычно не получается "и рыбку съесть и на *** сесть". Если вы не верите в магию, конечно.
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||
| 15.10.2018, 11:49 | ||||
assert? не, не слышал.остальной текст смахивает на бред обдолбанного наркомана. в обход специально предназначенных для этого методов. Добавлено через 1 минуту в каких случаях и для чего их используют. человек похоже не в курсе.
0
|
||||
|
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
||
| 15.10.2018, 13:02 | ||
|
1) Считаете ли вы правильным когда наружу торчит только метод доступа с проверками времени выполнения? Не всегда, а в каком-то конкретном классе, такое имеет право на существование? 2) Надо ли внутри использовать такой метод доступа?
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
| 15.10.2018, 13:42 | ||||||
|
вам было бы понятно, если бы вы знали какие проверки в каких случаях используют. в каких случаях ассерты, в каких эксепшены, в каких seh, в каких catch(...), в каких csignal, etc.что самое забавное, способы работы над ошибками вообще никак не коррелируют с изначальным бредом: разделять функции на инвариантные и не инвариантные, которые по итогу делают одно и тоже. оператор[] не делает никаких проверок выполнения в релизе. а теперь заново прочти #12 и перестань тупить.
0
|
||||||
| 15.10.2018, 13:42 | |
|
Помогаю со студенческими работами здесь
20
Почему дружественная функция с перегруженным оператором << не имеет доступа к данным класса? Реализовать ввод исходных данных, расчет и вывод данных в виде методов класса. В Main только создание объектов и вызов методов Treeview описание методов работы с данным элементом
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536
Одним из. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|