Niedawno miałam sytuację w której pracowałam z różnymi (choć pod pewnymi względami podobnymi) kolekcjami w Ruby. Te kolekcje miały bardzo podobne metody do przeszukiwania względem nazwy. W tym konkretnym przypadku zdecydowałam się na skorzystanie z lambdy. Zobaczcie jak to wyglądało.
Tak wyglądał kod przed zmianą:
@first_collection.select do |activity|
activity.name == 'name'
end
To nie jest zły kod, ale w innych miejscach można było spotkać coś bardzo podobnego. Przykładowo:
@second_collection.select do |activity|
activity.name == 'name1' || activity.name == 'name2'
end
Zdecydowałam się na użycie lambda. Stworzyłam metodę, która generowała mi lambdę dla różnych kolekcji a jako argument otrzymywała nazwy, po których miała przeszukiwać kolekcję. Oto ta metoda:
def prepare(collection)
lambda do |*names|
collection.select { |activity| names.include?(activity.name) }
end
end
Jak można tego użyć?
@collection = prepare(collection)
@collection.call('name')
@collection.call('name1', 'name2')
To rozwiązanie zmniejszyło znacznie ilość powtórzeń pokazanego na początku kodu. I co najważniejsze kolekcja jest deklarowana tylko w jednym miejscu. Mówiąc szczerze ten sposób rozwiązania był tylko przejściowy, ponieważ końcowym etapem było wyodrębnienie kolekcji do osobnej klasy. Jednak na ten konkretny moment było to rozwiązanie dla mnie zupełnie satysfakcjonujące i przede wszystkim proste.
Jeżeli chcielibyście się dowiedzieć czegoś więcej o lambdach i programowaniu funkcyjnym, zapraszam do przejrzenia mojej prezentacji na ten temat jest dostępna tutaj.
Mam nadzieje, że było to dla Was interesujące. Zostawcie komentarz i do zobaczenia następnym razem.
Potrzebujesz pomocy?
Jeśli szukasz doświadczonej programistki Ruby z ponad dziesięcioletnim stażem, śmiało skontaktuj się ze mną.
Mam doświadczenie w różnych domenach, a szczególną wagę przykładam do szybkiej reakcji na opinie użytkowników i pracy zespołowej. Pomogę Ci stworzyć świetny produkt.