Obawy to prosta, ale potężna koncepcja. Istnieje w celu ponownego wykorzystania kodu. Zasadniczo chodzi o wyodrębnienie wspólnych i / lub specyficznych dla kontekstu fragmentów kodu w celu oczyszczenia modeli i uniknięcia ich zbytniego i niemożliwego do zarządzania.
Chciałbym wyraźnie określić, że należy używać obiektów usług w celu zapewnienia funkcjonalności, która nie dotyczy konkretnego obiektu. Np. Organizacja ma wielu użytkowników. Teraz administrator organizacji musi wyeksportować plik CSV wszystkich użytkowników tej organizacji. Ten kod można umieścić w modelu organizacyjnym, ale ponieważ obiekt organizacyjny nie jest za to odpowiedzialny, kod ten należy umieścić w klasie, w której wystarczy przekazać obiekt organizacji i zwrócić CSV wszystkich użytkowników.
class Services::GenerateCsv
def self.get_users org
#add logic the fetch users for the org and generate the CSV and return the CSV data
end
end
Ilekroć potrzebujesz generowania CSV, możesz umieścić tę logikę w powyższej klasie. Takie podejście utrzymuje obiekt (w tym przypadku model organizacji) przed kodem, za który nie powinien odpowiadać. Ogólna zasada, którą się kieruję, brzmi: jeśli kod modyfikuje obiekt self, przenieś kod do obiektu usługi.
Uwaga: Twoje pytanie dotyczyło obaw, ale pomyślałem o dodaniu kilku dodatkowych rzeczy, które śledzę, aby kod był czysty i łatwy w zarządzaniu, ponieważ może to pomóc innym programistom. To powyższe podejście jest dyskusyjne.