Le preoccupazioni è un concetto semplice ma potente. Esiste per la riutilizzabilità del codice. Fondamentalmente, l'idea è quella di estrarre blocchi di codice comuni e / o specifici al contesto per ripulire i modelli ed evitare che diventino troppo grassi e ingestibili.
Vorrei specificare esplicitamente che è necessario utilizzare oggetti di servizio per fornire funzionalità che non sono di interesse per l'oggetto specifico. Ad esempio, un'organizzazione ha molti utenti. Ora l'amministratore dell'organizzazione deve esportare un CSV di tutti gli utenti per questa organizzazione. Questo codice può essere inserito nel modello di organizzazione ma poiché non è responsabilità dell'oggetto dell'organizzazione, questo codice deve essere inserito in una classe in cui si passa semplicemente l'oggetto dell'organizzazione e restituisce il CSV di tutti gli utenti.
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
Ogni volta che hai bisogno della generazione CSV, puoi inserire quella logica nella classe sopra. Questo approccio mantiene l'oggetto (in questo caso, il modello di organizzazione) pulito dal codice che non dovrebbe essere di sua responsabilità. Un principio generale che seguo è: se il codice sta modificando l'oggetto self, sposta il codice in un oggetto servizio.
Nota: la tua domanda riguardava le preoccupazioni, ma ho pensato di aggiungere alcune cose extra che seguo per mantenere la base di codice pulita e gestibile poiché potrebbe aiutare gli altri programmatori. Questo approccio di cui sopra è discutibile.