Lambda w Ruby

Jak pozbyć się powtórzeń w swoim kodzie?

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.