Когда я впервые начал программировать, я влюбился в возможность решать одну и ту же задачу разными способами. Я также на собственном горьком опыте убедился, что скука с длинными руками ВСЕГДА побеждает ярлыки с короткими руками, когда вы впервые изучаете концепцию.

С этой целью я хотел бы показать вам пару различных способов написания буквально ТОЛЬКО ДВУХ МЕТОДОВ в упражнении на Ruby под названием «Единорог», входящем в серию «Мифические существа», используя волшебный инструмент Ruby под названием «attr_reader». ».

Я использую Ruby 2.4.1, гем Minitest, текстовый редактор Atom и невероятно крутой шрифт под названием «Monospace».

После настройки основ я готов сделать свой первый тестовый проход.

Давайте взглянем:

Основываясь на руководящих принципах TDD, давайте запустим тест и посмотрим, какие ошибки он нам выдаст.

Ладно, копай. Давайте создадим метод с именем ‹name› и сошлемся на мою переменную экземпляра @name, которую я создал в методе инициализации внутри него!

Давайте снова запустим мой тест и посмотрим, пройдет ли он.

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

Однако при дальнейшем рассмотрении мы обнаруживаем, что этот метод состоит из трех строк кода… вроде ничего. Конечно, это геттер-метод, что означает, что он показывает мне данные, на которые он ссылается, но со временем мне приходится много писать, если мне нужно написать три строки кода только для того, чтобы прочитать данные, на которые указывает переменная экземпляра @name. Что, если я захочу сделать это с другими атрибутами этого класса? Что, если бы у него было имя, и цвет, и город происхождения, и порода, и… я не знаю, другие атрибуты единорога? Есть ли способ сделать то же самое и не занимать три строки кода для каждого атрибута? Я по своей природе ленивый, поэтому я хотел бы узнать.

Здесь на помощь приходит attr_reader. Attr_reader — это сокращенный способ написания методов получения, как вы только что сделали выше. Это также делает ваши данные общедоступными, так же, как и запись полного метода. Это выглядит так:

С помощью этого инструмента вы можете сократить метод ‹name›, который мы написали ранее, а также добавить другие, которые мы скоро увидим. Таким образом, это избавляет вас от необходимости писать весь этот код снова и снова. Это становится особенно замечательным, когда у нас есть много переменных экземпляра в наших методах инициализации.

ВНИМАНИЕ

Когда я только начинал программировать, люди говорили мне: «Просто используйте attr_reader! Просто используйте attr_reader!!», поэтому я использовал их, не понимая до конца, что они на самом деле делают. Потребовался очень мудрый наставник, чтобы помочь мне понять, что я не знаю, что, черт возьми, я делаю, поэтому она заставила меня СНАЧАЛА писать все от руки, а затем позволила мне использовать ярлык. Я *настоятельно* советую вам сделать то же самое. Полное погружение и использование «ярлыка» стоило мне больше времени в долгосрочной перспективе.

Мы снова запускаем наш тест, и он проходит.

Давайте посмотрим на наш следующий тест:

Запустив этот тест, мы видим, что метод ‹color› не существует:

Тогда давайте напишем это сначала «длинным» способом, а затем с помощью attr_reader.

А теперь, используя attr_reader:

Любой из них удовлетворяет требованию написания метода ‹color›, который возвращает данные, связанные с переменной экземпляра @color. Оба пройдут наш тест и перейдут к следующему выпуску, который будет другим постом в другой раз!

НО ПОДОЖДИТЕ, ЕЩЕ ОДНО СЛОВО ПРЕДОСТЕРЕЖЕНИЯ

Если вы хотите добавить в attr_reader более одного элемента, вы ДОЛЖНЫ поставить запятую после каждого, кроме последнего. Моя боль, твоя выгода.

Помните, сначала несколько раз напишите длинный путь, прежде чем начать сокращать путь — вы же не хотите заблудиться в лесу! Разве что в лесу полно единорогов. В таком случае теряйтесь сколько хотите.