Переменные экземпляра предназначены для использования в контексте рассматриваемого экземпляра. Если вам нужно обмениваться данными с другими объектами или даже другими экземплярами, вы должны предоставлять им attr_reader
или attr_accessor
, как требуется, если вы не пишете свои собственные методы для облегчения этого.
Методы доступа действуют как привратник и дают вам возможность проверить, что внешний вызывающий не испортил ваше внутреннее состояние. Один из принципов объектно-ориентированного проектирования заключается в том, что объект берет на себя ответственность за скрининг ввода. То, как вы справляетесь с неправильным вводом, зависит от вас, будь то игнорирование, создание исключения или регистрация ошибки среди прочего.
Если вы не обрабатываете неверный ввод и впоследствии вылетаете из-за него, это в конечном итоге становится вашей "ошибкой", и вы окажетесь на вершине трассировки стека. Отклонение неверных значений ранее показало бы проблему именно тогда, когда она возникла, а не позже при выполнении, когда вы могли потерять отслеживание того, откуда пришло это назначение.
Как правило, вы не хотите, чтобы люди обращались к вашим данным, если у них нет для этого веских причин. Непосредственный доступ и изменение переменных экземпляра другого объекта - плохая форма.
Некоторые языки зашли настолько далеко, что практически невозможно напрямую изменить внутреннее состояние объекта, но в этом отношении Ruby весьма небрежен. Тем не менее, просто потому, что что-то можно сделать, не значит, что оно должно.
Когда вы определяете методы доступа, вы сами решаете, используете ли вы их в реализации этого экземпляра. Иногда удобнее обращаться к ним напрямую, вызывая @var
вместо self.var
, но бывают случаи, когда использование средства доступа предоставляет дополнительные функции, которых нет у переменной экземпляра. Это также может упростить рефакторинг вашего приложения, поскольку у вас есть единственная точка контроля.