Как называть getter'ы и setter'ы

Для именования функций записи и чтения членов класса (getter/setter) в стандартном C++ есть три часто используемых приема.

1. Чисто плюсовый вариант, основанный на семантике ссылок.

class Foo {
  Value field_;
public:
  Value& field() { return field_; }
  const Value& field() const { return field_; }
};

Использование:

Foo foo;
foo.field() = field_instance;
field_instance = foo.field();

Плюсы: краткость текста, близость к нотации свойств, и возможность использования присвоения в каскаде (foo1.field() = foo2.field() = 2;).

Минусы: использование синтаксиса вызова функции слева от знака присваивания выглядит непривычно.

2. Способ в стиле Java.

class Foo {
  Value field_;
public:
  void setField(const Value& value) { field_ = value; }
  const Value& getField() const { return field_; }
};

Использование:

Foo foo;
foo.setField(field_instance);
field_instance = foo.getField();

Плюсы: ясность и очевидность синтаксиса.

Минусы: многословность из приставок “get” и “set”.

3. Cтиль Objective-C

class Foo {
  Value field_;
public:
  void setField(const Value& value) { field_ = value; }
  const Value& field() const { return field_; }
};

Использование:

Foo foo;
foo.setField(field_instance);
field_instance = foo.field();

Плюсы: краткость текста при чтении (нет почти бессмысленной приставки “get”) и очевидность при записи.

Минусы: я пока не нашел таковых.

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

Лично я почти всегда предпочитал способ #1, но после своего последнего поста я перешел на третий.


Оригинальный пост | Disclaimer

Комментарии