Podejrzewam, że odpowiedź na moje pytanie leży w jakimś POODR, ale nigdy nie miałem okazji go przeczytać.
Przypuśćmy, że mamy coś, co ludzie lubią nazywać use casem (czyli tak naprawdę normalną klasę wykonującą jakieś zadanie). Możemy przekazać do owej klasy potrzebne rzeczy na dwa sposoby:
1. Przekazać wszystko podczas inicjalizacji.
GenerateReport = Struct.new(:orders, :invoices, :formatter) do
def call
# do something
end
end
2. Przekazać część rzeczy podczas inicjalizacji, część przy wywoływaniu call
.
GenerateReport = Struct.new(:formatter) do
def call(orders, invoices)
# do something
end
end
Wszystkie use case’y w obecnym projekcie pisałem wg pierwszego sposobu, ale ostatnio coraz częściej zastanawiam się, czy nie poprawniej jest przekazywać przy inicjalizacji rzeczy, które należą do instancji i najpewniej się nie zmienią, a przy wywołaniu jakieś bardziej ruchome części.
W zasadzie nie wiem nawet, jak to dobrze uargumentować. Pierwszy sposób z pewnością słabo wypadłby przy operowaniu na danej instancji w wielu wątkach, ale powiedzmy sobie szczerze: czy gdybym musiał wykonać te akcje w wielu wątkach, to czy operowałbym na tym samym obiekcie? Najpewniej stworzyłbym nowe instancje (co mogłoby odbić się na pamięci, ale nie mam doświadczenia w pracy z takimi systemami).
Kiedy już zdecyduję się na drugi sposób, to w przypadku jakichkolwiek działań na zamówieniach lub fakturach, muszę nimi żonglować między metodami, ale czy nie o to w tym wszystkim chodzi? Dzięki temu przynajmniej unikam jakiegoś ukrytego stanu i wyraźnie widzę, które metody dotykają poszczególnych obiektów.
Interesujące opinie, linki do artykułów i tytuły książek bardzo mile widziane.