Спорим, вы никогда не слышали эти две фразы в одном заголовке…

Я уже четыре недели занимаюсь программой разработки программного обеспечения Flatiron на полную ставку, и должен сказать, что количество информации, которую я обработал за последний месяц, превратило мой мозг в мягкий, мягкий и едва пригодный для использования орган.

К счастью, мне удалось закончить свой первый проект — программу Ruby CLI, и у меня осталось немного времени. Но была особенно сложная часть этой программы, которой я хотел поделиться с потенциальными читателями в надежде, что она может помочь вам понять концепцию, которая действительно бросила вызов моему собственному пониманию API и манипулирования данными.

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

#ЧТО ТАКОЕ ТИНДЕР ТОЛКИЕН?

Tolkien Tinder — это простое, несколько бестолковое CLI-приложение, которое переносит мир цифровых знакомств в Средиземье.

Программа импортирует и собирает всех персонажей Толкина, включенных в Единый API для управления ими всеми, расположенный по адресу https://the-one-api.dev/.

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

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

Пользователи могут выбрать, какие типы персонажей они хотели бы «сопоставить» с моим вводом трех вымышленных рас, которые их больше всего интересуют в начале программы. Затем программа возвращает отфильтрованный список персонажей на основе рас, представленных пользователем. Затем пользователь может узнать больше о своем потенциальном совпадении, введя «да» или «нет» в командной строке. Если пользователь хочет узнать больше о своем персонаже, программа отображает всю известную информацию о персонаже.

Если пользователю нравится то, что он видит, он может выбрать «совпадение» с указанным персонажем, проведя пальцем вправо, или увидеть свое следующее потенциальное совпадение, проведя пальцем влево (в обоих случаях пользователь просто набирает «проведите пальцем вправо» или «проведите пальцем влево»). в консоль). В Tolkien Tinder «совпадение» — это то же самое, что начать разговор с персонажем. Конечно, на самом деле программа возвращает пользователю случайную цитату из фильма от персонажа, чтобы имитировать реальный разговор, который может происходить в современном приложении для знакомств.

После того, как пользователь просмотрит весь свой пользовательский список, ему будет предложено либо выйти, либо перезапустить программу.

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

Первым шагом было создание метода, который перебирал очень большой список цитат из фильмов и возвращал уникальный список значений идентификаторов персонажей, которые можно было использовать для фильтрации большего списка символов в более короткий и удобный список. Обратите внимание, что этот метод возвращает только одно уникальное значение идентификатора из |"персонаж"| key для каждого хэша с цитатой из фильма, независимо от того, сколько раз он встречается. Таким образом, даже если у персонажа было 100 кавычек, он вернул бы его идентификатор персонажа только один раз. @@quote_hash в этом методе представляет необработанные данные, которые мы извлекли из API.

def self.unique_characters_with_quotes
quote_array = []
@@quote_hash.each do |key, value|
if value.class != Integer
value.collect do |quote|
quote_array <<  quote["character"] unless quote_array.include? quote["character"]
end
end
end
quote_array
end

Затем мне пришлось перебрать @@character_hash, необработанные данные из API, которые включали каждый символ, включенный во все книги Толкиена. Я использовал возвращаемое выше методом значение, чтобы значительно сократить количество символов, которые будут использоваться в нашем приложении, включив только те, которые содержат цитаты из фильмов.

def self.character_list_with_stats
character_array =[]
@@character_hash.each do |key, value|
if value.class != Integer
value.each do |character_stats|
if self.unique_characters_with_quotes.include? character_stats["_id"]
character_array << character_stats
character_array.each do |character|
character.each do |key, attribute| #This sets the character's attributes to 'not provided' if the API (or Tolkien himself) didn't supply a value.
if attribute == ""
character[key] = "Not provided"
end
end
end
end
end
end
end
character_array
end

Перебирая только те символы, значения ["_id"] которых совпадали со значением ["character"] хеша кавычек, я смог вернуть список символов, которые поддерживали функциональность приложения Tolkien Tinder.

Вы можете заметить, что каждый метод включает оператор if, который возвращает true только в том случае, если value.class не равен целому числу. Это связано с тем, что конец каждого списка включал целочисленное значение, которое создавало ошибку для методов .include и .collect, поэтому я просто обошел эту проблему с помощью логической логики.

В конце концов, я смог отфильтровать в основном бесполезный список из сотен персонажей Толкина до менее чем 50 хэшей символов с более обильными атрибутивными данными (в основном потому, что все они содержали цитаты из фильмов и, следовательно, были более конкретизированы). Я также смог гарантировать, что у каждого персонажа есть хотя бы одна цитата из фильма, которую он может вернуть пользователю, если он решит «свайпнуть вправо» и начать разговор.

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