Смысл абстракции сеттеров и геттеров в том, что метод поиска может измениться. Когда вы обращаетесь к переменной-члену напрямую, то, если что-то меняется, вы должны везде обновлять свое использование. Но если вы используете функцию, то изменение способа получения переменной должно измениться только в функции.
Теперь, поскольку это один и тот же класс, это гораздо менее важно, чем когда вы делаете переменные общедоступными, потому что вам нужно только обновить этот один файл реализации (вместо обновления каждого пользователя вашего класса, что может быть и не так). возможно, если у вас есть библиотечный класс).
Чтобы увидеть это, посмотрите на класс, который внезапно должен стать поточно-ориентированным. Теперь ваш копир будет выглядеть как
void myClass::copyVar1(myClass * dat)
{
scoped_lock lock(mutex);
var1 = dat->getVar1();
}
и вам бы не пришлось нигде исправлять, если бы вы всегда вызывали по функции. Если бы вы обратились к переменной напрямую, она бы выглядела как
void myClass::copyVar1(myClass * dat)
{
scoped_lock lock(mutex);
scoped_lock lock2(dat->mutex)
var1 = dat->var1;
}
, который блокирует мьютекс "dat", внешний по отношению к dat, обычно это не очень хороший дизайн (если вы заставляете инженеров не забывать блокировать объекты других людей, вы открываете шанс, что они забывают и не делают этого) .
Точно так же, если переменная начала храниться в базе данных, вам также придется с этим справиться. Или, если переменная теперь хранится в двух разных переменных и создается при ее извлечении, вы можете увидеть, как сложность возрастет.
Но помните, философия проектирования использования аксессоров и мутаторов заключается в снижении потенциальной сложности путем инкапсуляции. Бывают случаи, когда вы работаете над небольшими проектами (особенно над личными), когда вы не собираетесь менять класс. Это может быть менее сложным, чтобы получить к ним доступ напрямую. Не бойтесь этого, просто знайте, почему вы принимаете решение.