|
0 / 1 / 0
Регистрация: 12.10.2018
Сообщений: 10
|
||||||
Сравнение методов доступа к данным класса12.10.2018, 14:36. Показов 3873. Ответов 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 описание методов работы с данным элементом
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы
Всем привет! Хочу поделиться свежим (и довольно. . .
|
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
|
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения:
- добавлена многоязычность
- добавлено снятие скриншотов
- добавлено поддержание бафов хождения по воде (для жреца, дк и шамана)
- и так, по. . .
|