Это хорошая практика для создания функций для доступа к переменным класса? - PullRequest
2 голосов
/ 13 марта 2012

Как видно из заголовка: это хорошая практика для создания функций для доступа к переменным класса?

Я видел довольно много фрагментов кода, которые делают что-то вроде следующего:

class MyClass {
public:
void setx(int a);
void sety(int b);
int read_x;
int read_y;

private:
int x;
int y;

};

void MyClass::setx(int a) {
x=a;
}

void MyClass::sety(int b) {
y = b;
}

int MyClass::read_x() {
return x;
{

int MyClass::read_y() {
return y;
}

Таким образом, вместо прямого доступа к переменным (MyClass.x) они используют функции для чтения и установки значений переменных и т. Д.

Это стандарт или хорошая практика?

Ответы [ 4 ]

4 голосов
/ 13 марта 2012

Да, функции доступа предпочтительнее прямого доступа члена по нескольким причинам.Они предоставляют уникальную точку доступа, их легче отслеживать и отлаживать.

Например, вместо установки точки останова везде в коде, где изменяется MyClass.x, вы можете просто установить одну точку останова в MyClass::setX().

Однако , хотя и лучше, чем прямой доступ к элементам, методы доступа не лишены своих недостатков, если их неправильно использовать.Для деталей, вы можете посетить Геттеры и сеттеры плохой ОО дизайн?

2 голосов
/ 13 марта 2012

Вместо прямого доступа к переменным? Абсолютно. Создание уровня программного интерфейса отделяет вас от деталей реализации этих внутренних переменных. Затем вы предоставляете себе дополнительную гибкость для таких вещей, как создание макетных реализаций рассматриваемого класса (для тестирования), создание прокси-классов (для декорированных функций, таких как ведение журнала и т. Д.)

Я бы предостерег от автоматического создания их для всего, что может вам не понадобиться Но это другая проблема.

Очень похоже на тренировку в спортзале: это дает больше, чем нужно;)

1 голос
/ 13 марта 2012

Это важно, поскольку оно отделяет интерфейс класса от базовой модели данных. Вы часто видите основной код, такой как пример, который вы разместили, и поначалу многое из этого может показаться ненужным осложнением. Тем не менее, он обеспечивает (самодокументируемую) структуру, в которой значение объекта может быть изменено без нарушения кода, который обращается к объектам класса через определенный интерфейс.

1 голос
/ 13 марта 2012

Да, они в порядке, однако я бы также сказал, что вы должны держать свои классы маленькими, как, например, с Java, а что нет, чтобы не заканчивать типы, которые в основном являются геттерами и сеттерами.

Обычно класс содержит (в идеале одно) состояние (которое может быть получено при необходимости) и имеет реализацию, которая в идеале должна оставаться закрытой.

...