|
0 / 1 / 0
Регистрация: 12.10.2018
Сообщений: 10
|
||||||
Сравнение методов доступа к данным класса12.10.2018, 14:36. Показов 4116. Ответов 49
Метки нет (Все метки)
Добрый день. Изучаю С++. И маленький перфекционист внутри меня не даёт покоя. Допустим есть класс.В нем находится поле класса типа массив(data) и публичный метод для доступа к ячейке этого массива(getCell). Далее в классе нужен ПРИВАТНЫЙ метод для обработки строки массива, который проверяет некоторые ячейки в строке(isMyRow). Как в этом методе правильней(оптимальней) обращаться к ячейкам массива: c помощью метода getCell или с помощью индексации[].
По идее индексация оптимальней, так как не задействует стек. Так что скажете ? Или я всё таки ерундой занимаюсь, задавая такие глупые вопросы??
0
|
||||||
| 12.10.2018, 14:36 | |
|
Ответы с готовыми решениями:
49
Обьявление методов доступа к данным класса. Напишите реализацию методов, предоставляющих доступ к данным класса. Отобразите в программе работу этих методов Сравнение скорости доступа к данным |
|
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
||
| 15.10.2018, 14:43 | ||
|
Ладно, хрен с ним с вектором. Пусть будет map. Как ты там внутри, допустим, метода добавления будешь обращаться к внутренним данным через публичные методы доступа? И если класс делает чуть более, чем ничего - чуть менее, чем всегда во время полезной работы инвариантность нарушается. Но даже если и нет. В публичных методах доступа проверки на валидность аргументов чаще нужны, чем нет. В приватных - достаточно ассертов. И в этом принципиальная разница.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 15.10.2018, 15:57 | |||||||
|
но ещё различаю проверки входных данных от пользователей, от проверок на ошибки программистов. а вот ты похоже нет. но одного я кстати, так и не уловил: какое отношение вот эти ваши пассажи имеют к изначальному предложению господина nonedark2008 за каким то неведомым хреном дублировать одну и ту же функциональность: инвариантная и не инвариантная функция, и обе они делают абсолютно одно и тоже? может быть здесь какая то опечатка. в любом случае не вижу, какие у вас сложности с использованием map? и чем принципиально vector отличается в этом контексте? приведите пример. всегда, если есть техническая возможность, все входные аргументы в обязательном порядке должны быть проверены на корректность. и не важно: приватная там функция, или нет. 2. как именно работать с ошибками (ассерты, эксепшены, коды, etc) зависит от специфики ситуации. и вообще никак не коррелирует с модификатором доступа (public/protected/private). принципиальный вы наш.
0
|
|||||||
|
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
| 15.10.2018, 18:15 | |
|
hoggy, Разговор вообще не про обработку нештатных ситуаций. Рассмотрим такой пример. Класс инкапсулирует матрицу. Задача: реализовать умножение матрицы на вектор. Наружу торчит метод доступа к элементам. Че тут думать-то реализуем в лоб. Вот только есть множество задач, где матрицы - огромные, но сильно разреженные. В рамках данного треда, допустим, что в среднем в строке 27 элементов. Иногда меньше, иногда больше. Будем ее всю хранить, или только ненулевые элементы?
Очевидно, ненулевые. Тогда метод доступа будет возвращать либо сам элемент, либо 0 в случае его отсутствия в строке. Какие вы здесь варианты видите кроме вышесказанного? А как умножать-то будем? за O(N^2)? А реально еще и доступ к элементу за log(M~27) (в силу множества причин для хранения строки подходит только сортированный вектор). Или все-таки пробежимся по ненулевым и умножим за O(N*M) ~ O(N)? Причем, выдавать наружу строку ненулевых - тоже геморрой, т.к. это обяжет нас хранить элементы и их индексы определенным, а самое главное неизменным образом. Или придется формировать строку, как это оговорено в интерфейсе с выделением памяти на каждой итерации. И похожих случаев - море.
0
|
|
|
Комп_Оратор)
|
||
| 15.10.2018, 19:10 | ||
|
Интересен ещё вот какой момент. Методы доступа бывают константными и ... (внезапно) не константными. Метод get как правило не возвращает ссылку (это можно, но медленно). То есть он вообще безопасен "как ромашка на лугу". Да и операторы индексного обращения могут быть как константными так и не константными. В последнем случае возвращается не константная ссылка. Для каждого из перечисленных вариантов - свой резон. И говорить об этом можно долго. Тут вон вокруг выхода за границы - война. А могут же быть инварианты (логические ограничения) и на сами значения в массиве. Словом, - общего ответа нет (имхо), а конкретно вы не говорите. Моё мнение, - прямой доступ внутри класса это нормально, но некоторые проверки, если необходимо могут быть вынесены в методы, которые пользуют и паблики и приватные методы. Такое возможно, но не обязательно.
1
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||
| 15.10.2018, 19:23 | |||||
|
и заюзаем её паблик согласно документации. не знаете, как спроектировать практичный дизайн разряженной матрицы, или что? Добавлено через 35 секунд
0
|
|||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 15.10.2018, 19:29 | |||
|
и почему считаете, что вернуть ссылку - это медленно?
0
|
|||
|
Комп_Оратор)
|
|||
| 15.10.2018, 19:38 | |||
).А если геттер возвращает не константную ссылку бесхитростно, то весь разговор - не о чём. Хуже бомбы для инкапсуляции трудно представить. В прошлом году, на одном проекте, я изучая ключевые компоненты увидел как в одном классе геттер возвращает ссылку на мапу, которая протектед и есть-таки инварианты... Люди посмотрели и офанарели. Но потом, оказалось, что сделать правильно - переписать кучу всего. Гуру которые начинали всё, говорят, что очень торопились. Так что жизнь и теория идут рядом. И смотрят друг на друга дикими глазами.
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||
| 15.10.2018, 19:55 | ||||||||||
вертают бесхитростно. и пострадать не может. как то инвариант нарушается?
0
|
||||||||||
|
Комп_Оратор)
|
|||
| 15.10.2018, 20:02 | |||
|
Хороший программист как и хороший художник не может быть вровень с нормой. И вдруг, - неконстантная ссылка на map которую так оберегали... ![]() Но вначале, как и Вы, многие не поняли, что меня смущает. То есть, ненормальных-таки маловато.
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 15.10.2018, 20:04 | |
|
0
|
|
|
Комп_Оратор)
|
|||||||
| 15.10.2018, 20:09 | |||||||
0
|
|||||||
|
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|||
| 15.10.2018, 20:16 | |||
|
Или считаете, что у интерфейса всегда должна быть только одна реализация? А чем вообще отличаются разные реализации одного интерфейса? Чем-то должны ведь. Иначе зачем их больше одной? Все-таки, наверное, одна реализация делает что-то лучше, чем другая. А что-то - хуже. Доступ к данным может быть одной из таких вещей. Зная, что доступ к данным - дорогой все равно будем требовать использовать его во внутренних методах? Зная, что есть быстрый и удобный способ, но интерфейс его не предполагает.
1
|
|||
|
Комп_Оратор)
|
|
| 15.10.2018, 20:24 | |
|
avgoor, я вообще не понимаю о чём речь. Можно иметь нужду в доступе на запись и не нуждаться в проверке. Операторы присваивания для экземпляров, конструкторы копирования... Там нужны сеттеры с проверками? Паранойя. (имхо)
0
|
|
|
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
| 15.10.2018, 20:45 | |
|
IGPIGP, Я думаю, там отстаивается идея об однообразном доступе к данным. Но однообразность нужна для однообразных вещей. А внутренний и внешний доступ - вещи не однообразные.
1
|
|
|
Комп_Оратор)
|
|||
| 15.10.2018, 21:00 | |||
|
Это можно сделать, не нарушая инвариант. Сначала a=2 (2<=1+1) Потом b=3 (3<=2+1) и т.д. Меня как
1
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||
| 16.10.2018, 12:02 | |||||||||||||
|
составьте пример-иллюстрацию, которая проиллюстрирует проблему. затем уже можно будет подумать о решениях. как вообще такой вопрос мог возникнуть? и тогда сразу придет понимание сабжа. Добавлено через 20 минут я вам другой пример покажу:
именно для того, что бы снаружи их невозобранно можно было бы модифицировать. ну вот он слил. и как это нарушает инкапсуляцию/инвариант самого вектора? я к тому, что сама по себе надобность выдавать наружу мутабельную ссылку должна быть чем то обоснованна. из вашего примера не понятно: зачем вы поле класса наружу слили?
0
|
|||||||||||||
|
Комп_Оратор)
|
|||||
| 16.10.2018, 20:04 | |||||
|
Смотрите: nonedark2008 написал первым всё что нужно и вы, упорствуя, проявляете незавидные качества. Что касается оператора индексного обращения, то в неконстантной реализации он и так возвращает ссылку. На неё можно установить кучу ссылок, но зачем? Если оператор написан как интерфейс, то он уже даёт доступ к данным по ссылке. И если он реализовывает проверки инварианта, то он мало пригоден для внутреннего использования. Пример про соблюдение инварианта в "треугольнике": Сравнение методов доступа к данным класса не убедил?
0
|
|||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 16.10.2018, 21:08 | |
|
IGPIGP, пример с треугольником не то, что бы не удивил, а вообще не понятно,что должен был проиллюстрировать
0
|
|
|
Комп_Оратор)
|
|||||||||
| 16.10.2018, 21:32 | |||||||||
|
hoggy, вы не изменяете себе:
Добавлено через 2 минуты alexbez, не волнуйтесь. Смотрите и изучайте. В мире программеров, это всё случается досчтаточно часто.
0
|
|||||||||
| 16.10.2018, 21:32 | |
|
Почему дружественная функция с перегруженным оператором << не имеет доступа к данным класса? Реализовать ввод исходных данных, расчет и вывод данных в виде методов класса. В Main только создание объектов и вызов методов Treeview описание методов работы с данным элементом
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|