Для именования функций записи и чтения членов класса (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, но после своего последнего поста я перешел на третий.