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, но после своего последнего поста я перешел на третий.