Для нашего первого проекта в программе Immersive Software Engineering школы Flatiron нам было поручено разработать за четыре дня приложение с интерфейсом командной строки (CLI) с использованием Ruby и SQLite для хранения данных приложения. Мой партнер по проекту, Аманда Роджерс, и я разработали Cheers, приложение для оценки и обзора пива, которое позволяет пользователю создать профиль, искать пиво по названию, просматривать его, а также получать случайно сгенерированные рекомендации по пивоварне и типу пива от пивоварни. наша база данных. После выхода из приложения пользователь также может снова открыть его, найти свой существующий профиль пользователя, просмотреть избранное и прошлые обзоры и продолжить использование других функций приложения.

Базовая структура приложения была основана на архитектуре MVC (модель-представление-контроллер), в которой модель содержит классы и методы, относящиеся к хранению, доступу и управлению данными приложения, а представление содержит классы и методы, которые взаимодействуют с внешним интерфейсом. (в данном случае это командная строка), а контроллер взаимодействует с моделью и представлением для управления потоком приложения. Другими словами, одна часть кода имеет дело с серверной частью (данные), другая — с интерфейсом (экран/пользовательский интерфейс), а третья управляет их взаимодействием во время работы приложения. Разделив эти части приложения, мы могли организовать методы, которые мы писали, таким образом, чтобы они были полезны, имели смысл для нас и, надеюсь, были понятны для других.

Во-первых, я расскажу о некоторых полезных драгоценных камнях и командах Ruby, которые мы использовали для создания нашего приложения:

1. АктивРекорд

Мы использовали гем Ruby ActiveRecord для управления отношениями между моделями данных в наших файлах Ruby и таблицами в нашей базе данных. После того, как мы создали тщательную модель отношений между различными типами данных в нашем приложении (подробнее об этом позже), все, что нам нужно было сделать, это использовать несколько встроенных методов ActiveRecord и сопутствующие задачи rake для создания всех таблиц в нашу базу данных, связать их с нашими связанными моделями данных ruby ​​и вуаля; мы заложили основу для серверной части нашего приложения.

2. Подсказка телетайпа

Этот драгоценный камень мы использовали в части просмотра нашего приложения, расположенной в cli.rb, для создания меню в командной строке, по которым можно было перемещаться с помощью клавиш со стрелками на клавиатуре. Без этого драгоценного камня мы бы застряли, требуя от наших пользователей вручную вводить команду для каждого действия в приложении. В дополнение к менее удобному для пользователя интерфейсу, это потребовало бы гораздо большей логики за кулисами, чтобы принять пользовательский ввод, убедиться, что он был введен правильно (без лишних пробелов, без неожиданных символов или заглавных букв и т. д.) и предоставить сообщения об ошибках, если код не смог прочитать ввод. Используя меню подсказки TTY, вы можете заранее указать только несколько параметров для пользовательского ввода, что упрощает скрытую логику и одновременно обеспечивает более понятный пользовательский интерфейс.

3. TTY-box и Paint

TTY-box, еще одна жемчужина из TTY-toolkit, может использоваться для стилизации приложения путем создания рамок вокруг блока текста, например, в логотипе нашего приложения (на фото выше). Paint, как следует из названия, позволяет вам добавлять цвет к тексту, который вы выводите в обычно черно-белую командную строку.

4. Полезные команды Ruby

Огромную помощь в улучшении взаимодействия с пользователем нашего приложения оказал метод system(“clear”). Это встроено в Ruby и просто говорит терминалу очистить то, что он отображал ранее. Используя эту команду, когда мы хотели отобразить новое меню или раздел приложения, мы создали иллюзию навигации по разным страницам. Команда sleep принимает число (например, sleep(2) или sleep(0,5)) и приостанавливает выполнение кода на это количество секунд. Это можно использовать для создания анимации (например, воспроизводимой при выходе или выходе из нашего приложения) или просто для добавления паузы в приложение по своему усмотрению.

Первым шагом в этом проекте, как и в любом другом, было планирование. Во-первых, мы выбрали несколько пользовательских историй, коротких предложений, которые выражали то, что мы хотели, чтобы пользователь мог делать в нашем приложении. Например, пользователь должен иметь возможность найти пиво, оставить отзыв и/или добавить его в избранное или пользователь должен иметь возможность найти свои прошлые отзывы и избранное. Далее нам понадобилась информация о пиве. Проверив несколько API, мы решили воспользоваться некоторыми свободно доступными файлами CSV от OpenBeerDB. Эти файлы включали информацию о тысячах сортов пива, связанных с пивоварнями, которые их производили, и категориями, к которым они принадлежали.

Найдя данные, которые мы хотели использовать, мы смогли спланировать структуру базы данных нашего приложения. Полезный способ сделать это — использовать диаграмму сущность-связь (ERD):

Я не могу не подчеркнуть, насколько полезной была эта диаграмма и планирование, которое сопровождало ее, в течение всего процесса создания нашего приложения. Чем больше вы планируете заранее, особенно когда речь идет об основополагающих вещах — вашей базе данных/моделях и общей структуре ваших файлов, в данном случае MVC — тем больше времени и головной боли вы сэкономите в будущем.

Не вдаваясь в подробности, эта диаграмма показывает, какие типы данных мы будем использовать и как они связаны. Затем с помощью ActiveRecord мы создали таблицу в нашей базе данных для каждого типа данных и соответствующего класса в нашей модели. Благодаря скрытой работе ActiveRecord по связыванию наших таблиц данных мы могли бы использовать несколько простых методов для доступа к подробной информации о наших моделях данных и отношениях между ними. Например, поскольку обзор связывал пользователя с пивом, мы могли бы использовать «user_one.beers», чтобы быстро увидеть, какие сорта пива просматривал этот пользователь. Точно так же мы могли бы быстро выяснить, какой пивоварне принадлежит конкретная пивоварня и какие сорта пива принадлежат конкретной пивоварне. Это было особенно полезно, когда мы писали методы, которые генерировали бы случайную рекомендацию пива на основе выбора пивоварни пользователем.

Создавая наше приложение, мы с Амандой немного устали от написания подсказок меню и проектирования потока нашего приложения, поэтому мы сделали перерыв, чтобы добавить что-то более интересное в наш код. Его зовут Рэнди:

Чтобы добавить эту анимацию, мы сначала искали ASCII-арт, подходящий для нашего приложения (спасибо пользователю jgs за этот дизайн http://www.ascii-art.de/ascii/ab/beer.txt), а затем запаковали его. в методе, который мы могли бы вызвать позже. Затем мы написали метод, который будет перебирать массив цветов и печатать рисунок ASCII в каждом цвете с помощью драгоценного камня Paint. Хотя Рэнди не обязательно является неотъемлемой частью функционирования приложения, он внес немного радости в иногда сухой процесс создания меню и структурирования кода путем проб и ошибок, чтобы найти эффективный способ организации нашего контроллера.

Через четыре дня у нас был готовый продукт. Cheers позволили пользователям просматривать и добавлять любимые сорта пива, получать рекомендации и просматривать данные об их прошлых взаимодействиях с приложением. Тем не менее, есть еще улучшения, которые можно было бы внести в проект. В итоге мы написали очень повторяющийся код в методах рекомендаций, нарушив принцип DRY (не повторяйтесь) в программировании, и мы оставили пользователей неспособными редактировать какие-либо свои данные после того, как они были в базе данных. Проектирование Cheers было отличным опытом и предоставило много возможностей попрактиковаться и применить различные навыки программирования, а также стало углубленным взглядом на то, насколько сложным может быть написание даже простого приложения.