printКлассы

printРекомендации по проектированию

Все поля и вспомогательные методы в class следует делать закрытыми или защищенными элементами. Для доступа к полям пользователям класса могут быть предоставлены тривиальные селекторы и модификаторы. Для запрета чтения или изменения некоторого поля соответствующий селектор или модификатор не определяется.
class A {
  int value;
public:
  int getValue() const { return value; } // тривиальный селектор
  void setValue(int newValue) { value=newValue; } // тривиальный модификатор
};

Друзьями класса следует делать только операции этого класса. Прочие функции и классы должны использовать открытый интерфейс. Более того, некоторые операции могут быть реализованы через обычные функции, не являющиеся друзьями класса, если открытого интерфейса достаточно для их реализации.

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

Необходимо минимизировать интерфейс класса. В набор операций необходимо включать те операции, которые нельзя эффективно реализовать через другие методы и функции.

Методы, не изменяющие состояния объекта, должны быть объявлены как константные.

Методы, изменяющие состояние объекта, не должны возвращать информацию о состоянии объекта (текущем или предыдущем).

Взаимосвязанные поля (например, день и месяц в дате) должны устанавливаться вызовом одного метода.

Если параметр не изменяется в теле функции, а его размер больше или равен 16 байт или он содержит указатель на динамически выделенную память, то его необходимо передавать как ссылку на константный объект. Иначе можно передавать по значению.

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

Объявляйте деструкторы виртуальными в классах, являющихся базовыми в иерархии.

В объявлении класса определяйте только методы, состоящие из одного оператора присваивания или return.
loading