Кратко ръководство за създаване на приложение с интерфейс на командния ред с Ruby

Когато навлезете в света на кодирането, независимо дали става дума за четиригодишна степен по компютърни науки, трудна програма за начален лагер или самоук курс по Udemy, повече от вероятно е първото ви „изпитание с огън“ да бъде изработването на команден ред интерфейсно приложение. Предизвикателството тук е да поставите всички умения, които сте научили досега, на напълно празна страница и да започнете оттам. Тъй като бях на ваше място, ще използвам собствения си проект като насока, за да ви помогна да постигнете целта си. Ще предоставя полезни връзки към допълнителни четива, за да разберете по-добре какво да правите и как да го правите.

Преди да започнем да кодираме, ще трябва да създадете git хранилище в Github. Git е

  1. „система за контрол на версиите“, която ви позволява безопасно да инициирате проект от вашата локална среда към достъпен сайт в интернет
  2. „основен инструмент“ за намиране на работа във всяка софтуерна компания днес
  3. софтуер, който ви позволява да „сътрудничите с други потребители“, за да създавате мощни и стабилни проекти заедно

Не е нужно да четете всички тези връзки наведнъж; по-скоро ги посетете или ги прегледайте отново, докато напредвате в проекта. Да започнем със самия проект сега.

За да генерирате самия скъпоценен камък, въведете bundle gem в командния ред на вашия текстов редактор (предполагам, че това е Visual Studio Code, Atom или друга среда) и изберете име на проекта, който искате да направите. В моя случай избрах steadychef, тъй като това е проект, описващ начални класове по готвене в и около Ню Йорк. Най-добрият ви залог е да пишете с малки букви и/или да подчертавате името, тъй като главната буква и тирето отварят множество други неща, които може да не искате.

Входът bundle gem трябва да генерира скеле или очертание на CLI приложението за вас.

Тук няма да разбивам всеки отделен файл и папка, тъй като всяка част може да означава различни неща за различните програмисти по време на различни проекти. На първо място, bin, lib, Gemfile, README.md, gemspec са мястото, където ще вършите по-голямата част от работата си.

Папката bin е мястото, където обикновено ще се съхраняват вашите изпълними файлове и библиотеки. Ще извикате различните файлове тук, за да стартирате приложението, за да преминете през него сами или за вашите потребители, за да го използвате. Папката lib съдържа цялото кодиране, което трябва да направите, за да оживите програмата си. Как структурирате тези файлове е от най-важно значение за потока и доставката, една грешка може да доведе до непрекъснато главоболие или гладко плаване. Самото оформление на приложението следва конвенция, наречена „разделяне на притесненията“, и трябва да продължите с това, като се подчинявате на „принципа на единната отговорност“.

Всеки един от ruby ​​файловете, означен с .rb, съдържа един class и придружаващите го методи. Този единствен class отговаря за една единствена част от приложението. Например файлът location.rb съдържа класа, наречен Location, който е отговорен за създаването наекземпляри за местоположение. Оставайки верен както на връзките към обектната ориентация, така и на принципа на единичната отговорност, всяко местоположение има много курсове (връзката се установява чрез използване на attr_accessor :courses, както и @courses = []), като същевременно носи единствената отговорност за създаването и поддръжката на всички екземпляри на местоположение (attr_accessor :name, @@all = [], и@@all << self). Няколко метода в класа Location също извикват класа Scraper.

Класът Scraper е ключът към събирането и импортирането на информация от уебсайт по мой избор в моето CLI приложение. За steadychef използвах CourseHorse и зададох филтрите да показват само курсове за начинаещи. Използвайки комбинация от скъпоценни камъни nokogiri и open-uri, успях да изгребна информацията от CSS селекторите на уеб страницата, която исках. Това включваше избор на правилните обекти родител-дете на страницата (понякога не можете да изберете точно това, което има най-голям смисъл само въз основа на вашите очи, тъй като изтриването с nokogiri може да бъде измамно сложно, така че тренирайте!), повторение на необработените данни и извличане на точния текст, който трябваше да покажа на потребителите си при избора им на местоположение и курсове. Нека навлезем в повече подробности, като се потопим вself.scrape_locations;

Задаваме променливата page да се равнява на анализатор на Nokogiri. Nokogiri::HTML е конструкция, която приема информацията за съдържанието на уеб страницата и я превежда в уникален тип данни Nokogiri (на който можете да изпълнявате някои Ruby методи). Конструкцията трябва да приеме аргумента на open, който сам по себе си трябва да има аргумента на низа на URL адреса на уебсайта, от който искате да изтриете. След това задаваме променливата neighborhoods да е равна на page.css и избираме css селекторите от уеб страницата. Въпреки че може да не е необходимо да правите това, трябваше да задам друга променлива, наречена locations, и да задам нейната стойност, равна на допълнителен филтър, за да получа конкретните местоположения, от които се нуждаех от сайта. След това повторих този обект и присвоих името на това местоположение на чисто нов момент на местоположение, докато се инициализира. Не забравяйте, че задаваме name като задължителен атрибут за всеки новосъздаден обект на екземпляр на местоположение в нашия клас Location.

Интерфейсът на командния ред се активира от класа CLI, където внимателно изработваме серия от методи, които извикват информация от други класове и също така позволяват на потребителя да взаимодейства с приложението чрез командния ред. Това ще бъде класът, в който ще пишете най-много код и ще правите тестване на принципа проба-грешка, както и ще добавяте функции, докато проектът напредва.

Командата bin/steadychef всъщност извиква метода start, намиращ се в lib/cli. Не забравяйте, че казахме, че bin е мястото, където се съхраняват изпълнимите файлове, а lib е мястото, където се съхранява кодът, за да може вашият потребител да взаимодейства с програмата.

Можете да видите, че start извиква още един метод в друг клас, поставя различни низове и има условен цикъл въз основа на входа от потребителя. Нека да разгледаме някои от другите методи.

Няма да обидя вашето владеене на Ruby, като разгледам подробно всеки ред код, но като общ преглед можете да видите, че get_locationsизвиква allот Location, което (както е показано в класа Location) извиква scrape_locations от класа Scraper. Това събира всички налични местоположения, извлечени от кулинарната уеб страница на CourseHorse. След това list_locations прави точно това; изброява местоположенията на потребителя. Ето защо е важно да давате на вашите методи, аргументи, класове, модули и т.н. лесни за разбиране имена. След това get_user_location извиква valid_user_input и ако chosen_location съответства на стойност, намерена в @locations, ще бъдат показани курсовете, налични за това местоположение. След това това води до друга поредица от методи относно курсовете и взаимодействието с тях.

Мисля, че си прекарах добре с проектирането и разработването на това приложение, тъй като обичам да готвя и смятам, че всички можем да направим повече, за да балансираме диетите и бюджетите си, и дава по-голямо чувство за постижение, когато правиш нещо със собствените си ръце. Да се ​​науча да извличам информация от уебсайтове беше малко по-досадно, отколкото си мислех първоначално, тъй като изисква прецизност и многобройни опити, за да бъде правилно. Все пак смятам, че имам по-добро управление на обектно-ориентирани връзки и смекчаване на броя на грешките чрез внедряване на failsafe в моя код.

Ето видео демонстрация на моето CLI приложение, steadychef, в действие.

„Тук“ е репото на Github, където можете да закупите копие на приложението и да го тествате. Приветствам всякакви въпроси, коментари и опасения. Надявам се, че това ви е помогнало във вашето кодиращо пътуване.

Както винаги, не забравяйте да почиствате зъбите си с конец и да останете хидратирани.