Daniro_San
@Daniro_San
Программист

ООП головного мозга?

Как вы считаете, нормально ли то, когда класс открывает свои поля в публичный доступ?
Ведь иногда гетеры и сетеры просто лишние куски кода.
Например, вот такой класс (для примера пусть он представляет переменную в коде какого нибудь интерпретатора):

class Variable
{
private:
     std::string Name;

public:
     std::string Value;
     std::string GetName() const
     {
         return Name;
     }
     Variable ( const std::string &name ): Name( name ) 
     {
     };
}


Далее по ходу выполнения кода, мы изменяем поле Value.

Разумно ли вместо изменить его вот таким образом ?

class Variable
{
private:
     std::string Name;
     std::string Value;
public:
     
     std::string GetName() const
     {
         return Name;
     }
     std::string GetValue() const
     {
         return Value;
     }
     void SetValue ( const std::string &value )
     {
         Value = value;
     }
     Variable ( const std::string &name ): Name( name ) 
     {
     };
}


Так же изменяем поле Value, но теперь через сеттер.

Какой вариант лучше? Если что, я использую и использовал всегда первый, но вот пару раз встречал на хабре мнение, что класс вообще не должен давать публичный доступ к полям.
  • Вопрос задан
  • 2110 просмотров
Решения вопроса 2
AtomKrieg
@AtomKrieg
Давай я поищу в Google за тебя
Когда вы пишете лабораторку или собственный маленький проектик, то можете делать как вам угодно.
А теперь представьте себе ситуацию когда в команде программистов вы написали класс с публичными переменными, а потом подошел руководитель проекта и сказал что на каждое присваивание переменной надо делать запись в лог-файл. Теперь все программисты, которые пользовались вашим классом, вместо работы переписывают код с переменных на сеттеры.

Советую почитать "Совершенный код", чтобы не задавать подобные вопросы.
Ответ написан
Vadiok
@Vadiok
Веб разработчик
Нельзя на 100% быть уверенным, что присваиваемое значение не придется как-то обрабатывать (например, приводить преобразование значение имени из "иванов ИВАН" в "Иванов Иван"). Если пользоваться сеттерами, то доп. обработка реализуется внутри класса и все. Если значения устанавливались напрямую через свойства, то придется возвращаться к использованию сеттеров, попутно переписывая присвоение свойств объектам класса во всех местах, где объекты этого класса используются.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Ну Вы же не летите из РФ в Европу через Австралию?)
Зачем тут то так делать, когда это явно не нужно?!

Есть внутренние переменные класса, которые служат для внутренних вычислений, а есть именно те, которые служат для задания свойств объекту класса без лишних действий (иначе: в самом простом случае - getter/setter, в более сложном - именованый метод).
Ответ написан
Комментировать
@LiguidCool
Ээээ ...
var Name = Value;
Зачем тут объект? :-D
Ответ написан
Комментировать
@iv_k
Если этот класс не торчит наружу в публичный api и им будете пользоваться только вы - нормально
Ответ написан
Комментировать
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
С открытыми полями можно сделать разве что какую-нибудь структурку вроде std::pair, которая допустим откуда-то возвращается в качестве результата (например это результат вычислений и какой-нибудь тэг) или которая используется только в рамках одного класса или просто в одном cpp файле как вспомогательная, но не где более.
В остальных случаях всегда нормальная инкапсуляция иначе потом будет плохо и вы будете страдать. Представьте ситуацию с большим проектом, когда вам нужно банально поставить бряку и посмотрять кто и когда изменил значение поля. Или например добавить любую логику перед установкой/получением значений (хотя бы банальные нотификации).
Просто возьмите за правило инкапсулировать и все. Нажать пару кнопок для генерации методов лучше, чем потом страдать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы