Russian Qt Forum
Ноябрь 23, 2024, 20:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Реализация класса  (Прочитано 7344 раз)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #15 : Июнь 17, 2011, 11:33 »

Ну как бы геттеры/сеттеры защищают от тупых ошибок и для этого и нужны. rx() случайно сложно написать. И да, таки весь класс инлайнится в место использования.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Июнь 17, 2011, 18:06 »

Ну как бы геттеры/сеттеры защищают от тупых ошибок и для этого и нужны. rx() случайно сложно написать.
Шансы перепутать rx() <-> ry() те же самые что и x <-> y  Улыбающийся

В одном проекте такой подход к геометрии видел. Шаблонные алгоритмы (построение остова, r-дерево) работали не только с прямоугольниками, но и с любыми объектами имеющими bounding box. При этом обычный прямоугольник тоже снабдили абсурдным на первый взгляд метеодом rect bbox () const {return *this;}. Более гибко получается, любой объект может "притвориться" точкой или прямоугольником безо всякого наследования (типа как в питоне duck typing).
Для таких игр нужны классы "выше травы", а Point2D таким не является. Заметим что Point3D никогда не наследуется от Point2D,  так же как и "Point4D" (кватернион) от Point3D. Неудачна даже попытка запихнуть его в template, напр
Код
C++ (Qt)
template <class T>
class TPoint {
..
T x, y;
};
 
И вроде есть варианты (int, float, double) но на деле только куча неудобств  Улыбающийся
Др. словами мощность такого класса слишком мала чтобы он мог что-то решать, это пассивные данные к которым все имеют прямой доступ. А если так чего тогда притворяться с get/set ? 

И дело не в том "как меньше записать" и, конечно, аксессоры никак не снизят скорость. Приятно работать с кодом где все "имеет смысл" , т.е. если человек сделал private, значит он что-то имел ввиду. А где просто налеплено get/set - логика класса не видна, и, как ни странно, эффект тот же самый что и все "public".
Записан
brankovic
Гость
« Ответ #17 : Июнь 17, 2011, 19:55 »

Для таких игр нужны классы "выше травы", а Point2D таким не является.

Вовсе нет, очень хорошо ложится на низкоуровневые классы.

это пассивные данные к которым все имеют прямой доступ. А если так чего тогда притворяться с get/set ? 

get спасает от нечаянного изменения (опечатка, = вместо ==):

Код:
if (a.x = invalid_coord)

set это имхо перебор, но тоже уменьшает вероятность неявных ошибок. Нашёл поиском сеты и видишь сразу, где объект меняли. Но я предпочитаю использовать оператор присваивания: a = point (a.x () + 10, a.y ()) вместо a.set_x (a.x () + 10). Чуть более громоздко, но наглядно.

Вообще если структура это локальная часть кода (например функтор, или внутренняя нода контейнера, или какая-нибудь деталь реализации в .cpp-файле), то делать там private/protected, set/get и прочая это блажь, имхо. Но если  класс библиотечный (как точка), используется много и в разных местах, то лучше причесать интерфейс.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.148 секунд. Запросов: 22.