Как стать автором
Обновить

Комментарии 7

Для readonly доступа к приватным членам где-то встречал такой варинат:

private:
    int m_example = 0; 
public:
    const int &Example = m_example;

А что с ним случится в случае с мувами и прочими переприсваиваниями?

Хм, никогда бы не пришло в голову называть метод, возвращающий неконстантную ссылку "getter".

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

Надо изменить типа данных аттрибут c integer на double - меняем аттрибут, подправляем геттер/сеттер чтобы он для зависимостей делал вид что это все еще integer, пишем новую пару методов геттер/сеттер с другим именем, но которые уже полноценно возвращают/принимают double и все зависимости спокойно, без спешки переписываем.

Лучшие и худшие методы? Ну я не очень понимаю - в каждом конкретном случае используй то, что тебе просто удобно.

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


Когда вам нужно пересоздать данные и поместить их на место уже существующих, вам пригодится сеттер. Он также подходит для редактирования простых данных (целые числа, значения чисел с плавающей запятой, указатели и т. д.) или если вам нужно подставить полностью новое значение. Еще один вариант использования сеттеров: когда вы намеренно хотите дать пользователю возможность только редактировать данные, но не читать.

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


Геттер-ссылка вам пригодится для редактирования данных атрибута (а не атрибута целиком). Часто нам необходимо отредактировать только часть атрибута или вызвать для них неконстантный метод.

Геттер-ссылка — это в принципе две независимые сущности. Геттер собственно класса, и тип возвращаемого значения. Почему-то не упомянуты Геттер-значение, Геттер-конст-ссылка, геттер-конст-значение, конст-геттер-*, не-конст-геттер-*.


А суть опять же не в том, что геттер делает, а в том, зачем его использовать. Семантика ссылок в С++ позволяет использовать null-safe виртуальщину, когда вызывающий объект видит только ссылку на интерфейс, но может подменять реализации по необходимости, и инкапсулирующий объект, используя абстрактный интерфейс, не требует изменения собственного алгоритма. Так реализуется паттерн Стратегия, когда элементы стратегии сами являются подстратегиями. И из дефолтного состояния, объект можно частично доконфигурировать подстратегиями.


LLVM использует 'геттер-ссылки' для конфигурирования виртуальной машины и кодогенератора.

Почему-то до сих пор в язык не ввели встроенные геттеры и сеттеры. Хотя например уже очень давно такое было в C++Builder (__property), у Microsoft (__declspec(property)). А вот в GCC такой возможности нет, хотя казалось бы — именно GCC как никакой другой компилятор богат на языковые расширения.

Это не описывается стандартом, и всего лишь расширения конкретного производителя. В Борланде это было введено для возможностей визуального программирования.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий