Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/16: Рейтинг темы: голосов - 16, средняя оценка - 4.69
0 / 1 / 0
Регистрация: 12.10.2018
Сообщений: 10

Сравнение методов доступа к данным класса

12.10.2018, 14:36. Показов 3657. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Изучаю С++. И маленький перфекционист внутри меня не даёт покоя. Допустим есть класс.В нем находится поле класса типа массив(data) и публичный метод для доступа к ячейке этого массива(getCell). Далее в классе нужен ПРИВАТНЫЙ метод для обработки строки массива, который проверяет некоторые ячейки в строке(isMyRow). Как в этом методе правильней(оптимальней) обращаться к ячейкам массива: c помощью метода getCell или с помощью индексации[].
По идее индексация оптимальней, так как не задействует стек. Так что скажете ? Или я всё таки ерундой занимаюсь, задавая такие глупые вопросы??
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class MyClass{
private:
int data[3][3];
bool isMyRow(int row);
public:
int getCell(int x, int y);
 
};
 
 
...
 
 
bool  MyClass::isMyRow(int i){
//как надо?
//так?
return (data[row][0]==data[row][1] );
 
//или так?
// return getCell(row,0)==getCell(row,0);
 
}
P.S. Вообще стараюсь не задавать таких посредственных вопросов и указатели более менее понимаю. Но эти мелочи не дают покоя. И гуглил, но гугл молчит.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.10.2018, 14:36
Ответы с готовыми решениями:

Обьявление методов доступа к данным класса.
Не компилируется программа //Обьявление класса Cat. //Переменные-члены обьявляются закрытыми, а открытые методы доступа ...

Напишите реализацию методов, предоставляющих доступ к данным класса. Отобразите в программе работу этих методов
Реализация методов класса. Напишите реализацию методов, предоставляющих доступ к данным класса. Отобразите в программе...

Сравнение скорости доступа к данным
Просто ужас берёт... http://www.rsdn.ru/article/db/DBSpeed.xml

49
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
12.10.2018, 15:11
Цитата Сообщение от alexbez Посмотреть сообщение
По идее индексация оптимальней, так как не задействует стек.
По идее компилятор не дурак, и такие простые методы просто заинлайнит.

Если рассматривать общий случай, то я бы с осторожностью вызывал публичные методы изнутри других методов класса. Мотивировать это можно тем, что вызов публичного метода должен сохранять инвариант для данного объекта, т.е. переводить его из одного корректного с точки зрения программиста состояния в другое корректное состояние. Каждый раз, вызывая этот публичный метод из середины другого метода, можно столкнуться с проблемой того, что в данный момент времени объект находится в некорректном состоянии, что скорее всего приведет к ошибке.

Я бы разделял между собой публичные методы и приватные и избегал бы вызовов одних публичных методов из других публичных или приватных методов. Скажем, можно иметь два варианта одной функции: публичную, которая имеет весь набор проверок для защиты "от дурака", и приватную - без проверок.
2
0 / 1 / 0
Регистрация: 12.10.2018
Сообщений: 10
12.10.2018, 15:24  [ТС]
Теперь стало понятнее. Спасибо за разъяснение проектирования.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.10.2018, 16:27
Цитата Сообщение от alexbez Посмотреть сообщение
По идее индексация оптимальней, так как не задействует стек. Так что скажете ?
компилятор оптимизирует такие вызовы.

всегда, когда есть функция-член для доступа к данным,
нужно использовать именно эту функцию-член.

при этом всегда нужно предпочитать использовать именно публичную функцию-член.

разделение на функцию-член с проверками и аналогичную без проверок - путь в адъ.
так никогда не делайте.

Цитата Сообщение от nonedark2008 Посмотреть сообщение
Каждый раз, вызывая этот публичный метод из середины другого метода, можно столкнуться с проблемой того, что в данный момент времени объект находится в некорректном состоянии,
приведите пример такой ситуации.
но такой, что бы при этом он не являл собой пример говнокода.
1
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
12.10.2018, 17:34
Цитата Сообщение от hoggy Посмотреть сообщение
но такой, что бы при этом он не являл собой пример говнокода.
Такой код по определению будет считаться говнокодом. Вопрос в том, какому стилю и методологии придерживаться, чтобы уменьшить количество ошибок текущих и будущих ошибок. Хотя стоит понимать, что хороший код и говнокод в представлении разных людей выглядит по разному.

Цитата Сообщение от hoggy Посмотреть сообщение
разделение на функцию-член с проверками и аналогичную без проверок - путь в адъ.
На счет этого можно поспорить. Совсем нет необходимости в повторных проверках одних и тех же данных, когда они уже были проверены ранее. Для отладки, можно хоть каждую строчку кода покрыть тестами, а вот в конечном продукте избыточные проверки не нужны. Отсюда и разделение на публичные методы, которые содержат необходимые тесты входных данных и могут быть вызваны извне с непойми чем, и приватные, которые вызываются для уже заранее проверенных данных.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.10.2018, 17:39
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Совсем нет необходимости в повторных проверках одних и тех же данных,
всегда есть.
мы ведь говорить об инвариантных вещах?

Цитата Сообщение от nonedark2008 Посмотреть сообщение
Для отладки, можно хоть каждую строчку кода покрыть тестами
тесты делают не для отладки.
тесты делают, что бы отлаживать ничего не нужно было.

Цитата Сообщение от nonedark2008 Посмотреть сообщение
а вот в конечном продукте избыточные проверки не нужны
1.
ИТ сегодня на первое место ставит надежность.
эффективность - где то на 10е, если не дальше.

2.
откройте для себя assert.


Цитата Сообщение от nonedark2008 Посмотреть сообщение
которые вызываются для уже заранее проверенных данных.
эта порочная практика спровоцирует говнокод.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
12.10.2018, 18:04
Цитата Сообщение от hoggy Посмотреть сообщение
эта порочная практика спровоцирует говнокод
Пример можно?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.10.2018, 18:17
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Пример можно?
примеры (включая детальный разбор полетов, с упоминанием статистики) см в книге "совершенный код" Макконнелла.


вам не очевидно, что разделение проверочного кода и бизнес-логики делает код более запутанным,
а бизнес-логику - не инвариантной?
1
Заблокирован
12.10.2018, 18:47
Цитата Сообщение от hoggy Посмотреть сообщение
"совершенный код" Макконнелла
А что это самый крутой сиплюсплюсер?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.10.2018, 20:37
Цитата Сообщение от stu4ent2018 Посмотреть сообщение
А что это самый крутой сиплюсплюсер?
он исследовал такие вопросы, как:
"почему код пишут медленно?"
"почему пишут плохо?"
"почему сопровождение выливается в такие дикие расходы?"
и тп.

обычно, после вдумчивого прочтения его книги "совершенный код",
сознание джуниора меняется, ему открывается дзен,
и он шагнув на ещё одну ступеньку в своём развитии выше,
уже никогда не будет как прежде.

https://ru.wikipedia.org/wiki/... 0%B8%D0%B2
1
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
14.10.2018, 08:43
Цитата Сообщение от hoggy Посмотреть сообщение
всегда есть.
мы ведь говорить об инвариантных вещах?
Есть замечательный контейнер std::vector. Для доступа к его содержимому можно использовать operator[], а можно at(). Вот, вы лично какой чаще используете?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.10.2018, 23:32
avagor , я лично - только оператор скобки.
at() не понятно зачем вообще завезли.
похоже, что для параноиков, которые убежденны,
что код априори содержит грубые программные ошибки.
и решили дополнительно подстраховаться в ситуациях,
когда исполняемый процесс должен выжить,
даже в условиях, когда он находится в неконсистентном состоянии.

лично я категорически против подобной практики,
и с позиции своего опыта полагаю,
что подобная попытка защититься от собственного говнокода
по итогу привет лишь к ещё большему говнокоду
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
15.10.2018, 00:05
Цитата Сообщение от hoggy Посмотреть сообщение
я лично - только оператор скобки
В смысле operator[]?
А как это соотносится с:
Цитата Сообщение от hoggy Посмотреть сообщение
всегда, когда есть функция-член для доступа к данным,
нужно использовать именно эту функцию-член.
Цитата Сообщение от hoggy Посмотреть сообщение
всегда, когда есть функция-член для доступа к данным,
нужно использовать именно эту функцию-член.
при этом всегда нужно предпочитать использовать именно публичную функцию-член.
разделение на функцию-член с проверками и аналогичную без проверок - путь в адъ.
Ну и? Вы адепт секты свидетелей макКонела? У меня во время общения с вами создалось впечатление о вашей вменяемости.
Единственная причина использования публичных методов доступа к приватным данным внутри класса - DRY. Всё. Озвученное вами (хотя, может быть, мне показалось) - решение несуществующей проблемы методом, который более гемороен, чем сама проблема.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
15.10.2018, 01:02
avgoor, в прямом смысле соотносится.
есть публичная функция-член оператор скобки.
специально предназначенный для доступа к элементу.
что вам не понятно?

про гемморой вы конечно доставили,
особенно в контексе DRY.
и часто вы так противоречите собственным тезисам,
в след. предложении?
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
15.10.2018, 02:43
Цитата Сообщение от hoggy Посмотреть сообщение
есть публичная функция-член оператор скобки.
специально предназначенный для доступа к элементу.
что вам не понятно
Цитата Сообщение от hoggy Посмотреть сообщение
всегда есть.
мы ведь говорить об инвариантных вещах?
Есть публичная функция... Стоп. Проверки. Больше проверок богу TDD.
Проверим, как мы получаем доступ к элементу нашего контейнера (а мы, ведь например, пишем какой-то контейнер каких-то объектов).
Блжад, вышли за границу. Но мы, ведь, умные. МакКонела читали. Чтоб никогда, вот никогда... Давай проверять, вот, каждое обращение!!! Как, тормозит??? У нас все правильно, как гуру программинга завещали...
Как, гуру программинга не об этом говорили??? Они об инкапсуляции??? Чтоб, другие мимо нашего контейнера не гадили???
Нeeeeeeeeee. У нас же все под контролем. Наш код пишут ущербные личности,которые не могут в осознание архитектуры. И, вот, всегда, когда нам нужен элемент нашего контейнера - пусть через публичный метод доступа к нему доступаются. У нас программисты - калечные. Даже те, которые работают над файлом с классом нашего контейнера... Ну, нельзя им позволять закладываться на реализацию того, что они сами реализуют.
Так как у нас это все-таки тормозит, позовем реального гуру. Как гуру нас на х*й послал???
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
15.10.2018, 03:28
avgoor, я конечно извиняюсь, но что мешает в operator[] ассерт добавить, который будет проверять инвариант в отладочной версии? Вот в отладочной мы и получим все прелести программирования по Макконелу, а в релизной получим отсутствие тормозов. Все счастливы, все довольны.

Кусочек кода из vector в MSVC.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    const_reference operator[](size_type _Pos) const
    {   // subscript nonmutable sequence
 #if _ITERATOR_DEBUG_LEVEL == 2
        if (size() <= _Pos)
        {   // report error
            _DEBUG_ERROR("vector subscript out of range");
            _SCL_SECURE_OUT_OF_RANGE;
        }
 
 #elif _ITERATOR_DEBUG_LEVEL == 1
        _SCL_SECURE_VALIDATE_RANGE(_Pos < size());
 #endif /* _ITERATOR_DEBUG_LEVEL */
 
        return (*(this->_Myfirst() + _Pos));
    }
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
15.10.2018, 03:50
DrOffset, Я где-то ругал ассерты? Разговор-то о том, что уважаемый господин hoggy утверждает, что правильно обращаться к данным изнутри класса через публичные методы этого класса. Я утверждаю, что это не так (не всегда так). У нашей абстракции всегда должна быть реализация. И в этой реализации обычно не получается "и рыбку съесть и на *** сесть". Если вы не верите в магию, конечно.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
15.10.2018, 11:49
Цитата Сообщение от avgoor Посмотреть сообщение
Давай проверять, вот, каждое обращение!!! Как, тормозит???
assert? не, не слышал.

остальной текст смахивает на бред обдолбанного наркомана.

Цитата Сообщение от avgoor Посмотреть сообщение
Разговор-то о том, что уважаемый господин hoggy утверждает, что правильно обращаться к данным изнутри класса через публичные методы этого класса. Я утверждаю, что это не так (не всегда так)
приведите пример целесообразности получать доступ к данным
в обход специально предназначенных для этого методов.

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
я конечно извиняюсь, но что мешает в operator[] ассерт добавить
вы лучше спросите у него, зачем вообще нужны ассерты.
в каких случаях и для чего их используют.

человек похоже не в курсе.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
15.10.2018, 13:02
Цитата Сообщение от hoggy Посмотреть сообщение
вы лучше спросите у него, зачем вообще нужны ассерты.
в каких случаях и для чего их используют.
Это вы, похоже не в курсе чем отличается at() от []. Как вы с проверок времени выполнения съехали на ассерты - не понятно. Поэтому:
1) Считаете ли вы правильным когда наружу торчит только метод доступа с проверками времени выполнения? Не всегда, а в каком-то конкретном классе, такое имеет право на существование?
2) Надо ли внутри использовать такой метод доступа?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
15.10.2018, 13:42
Цитата Сообщение от avgoor Посмотреть сообщение
Это вы, похоже не в курсе чем отличается at() от []
да неужели?

Цитата Сообщение от avgoor Посмотреть сообщение
Как вы с проверок времени выполнения съехали на ассерты - не понятно.
никак не съезжал.

вам было бы понятно, если бы вы знали какие проверки в каких случаях используют.
в каких случаях ассерты, в каких эксепшены, в каких seh, в каких catch(...),
в каких csignal, etc.

что самое забавное, способы работы над ошибками
вообще никак не коррелируют с изначальным бредом:
разделять функции на инвариантные и не инвариантные,
которые по итогу делают одно и тоже.


Цитата Сообщение от avgoor Посмотреть сообщение
Считаете ли вы правильным когда наружу торчит только метод доступа с проверками времени выполнения?
уважаемый.
оператор[] не делает никаких проверок выполнения в релизе.
а теперь заново прочти #12
и перестань тупить.


Цитата Сообщение от avgoor Посмотреть сообщение
Надо ли внутри использовать такой метод доступа?
здесь вроде по-русски написано, не?

Цитата Сообщение от hoggy Посмотреть сообщение
всегда, когда есть функция-член для доступа к данным,
нужно использовать именно эту функцию-член.
при этом всегда нужно предпочитать использовать именно публичную функцию-член.
в оригинале, слово "всегда" специально выделено жирным для тех, кто в танке.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.10.2018, 13:42
Помогаю со студенческими работами здесь

Напишите реализацию методов, предоставляющих доступ к данным класса
Реализация методов класса. Напишите реализацию методов, предоставляющих доступ к данным класса. Отобразите в программе...

Почему дружественная функция с перегруженным оператором << не имеет доступа к данным класса?
В заголовочном файле &quot;klass.h&quot; есть класс: class klass { int x; public: klass(); ~klass(); void show(); friend void...

Реализовать ввод исходных данных, расчет и вывод данных в виде методов класса. В Main только создание объектов и вызов методов
Всем привет) помогите пожалуйста с заданием &quot;Реализовать ввод исходных данных, расчет и вывод данных в виде методов класса. В Main только...

Treeview описание методов работы с данным элементом
Есть ли у кого-нибудь описание на русском языке по работе с treeview? или работающего примера на vba

Класс внутри класса с доступом к данным первого класса
Есть класс, он содержит в себе функции. Функций этих много и я решил, что было бы удобно их группировать, как-нибудь через структуры или...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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&amp;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 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru