Disclaimer Questo post è intenzionalmente cervellotico. Potrebbe risultare noioso o faticoso da leggere. Non perché parli di architettura, ma perché quando si esce dal perimetro della definizione formale e si entra nel campo empirico–cognitivo della progettazione, le cose diventano inevitabilmente complesse.
Se stai cercando regole, pattern pronti o diagrammi rassicuranti, questo non è quel post.
La contrapposizione tra Service e Use Case viene spesso trattata come una questione di architettura:
Ma questa lettura è riduttiva.
La dicotomia non nasce nel codice. Nasce prima, nel modo in cui pensiamo e modelliamo un dominio.
Service e Use Case sono solo tracce visibili di un problema cognitivo più profondo.
Quando iniziamo a modellare un dominio applicativo, non stiamo descrivendo la realtà.
Stiamo coprendola.
Scegliamo:
Questa copertura serve a ridurre la complessità e permetterci di agire.
Ma ogni copertura crea anche un recinto cognitivo:
Ed è dentro questo recinto che, quasi inevitabilmente, nascono i Service.
UserService, OrderService, PaymentService non nascono per errore.
Nascono perché:
Il Service diventa così il contenitore del modello iniziale.
Finché il dominio resta fermo, funziona.
Il problema è che il dominio non resta mai fermo.
Il business cambia. Le priorità cambiano. Gli obiettivi cambiano.
Il recinto, invece, tende a restare.
A quel punto:
Il codice smette di rappresentare il dominio.
Inizia a rappresentare la storia delle decisioni passate.
Un Use Case non è semplicemente “una funzione del sistema”.
È una unità di razionalità:
RegisterUser, ApproveLoan, CancelSubscription non descrivono dati.
Descrivono azioni con un senso.
Quando i Use Case vengono piegati per:
perdono la loro funzione principale: rendere leggibile il perché del sistema.
C’è un caso ancora più delicato, spesso ignorato.
Quello in cui non vogliamo implementare il dominio com’è, ma come dovrebbe diventare.
Succede quando:
In questi casi il modello non è descrittivo.
È prescrittivo.
E qui i Service diventano pericolosi, perché:
I Use Case, invece, possono rappresentare:
Un dominio sano non è uno stato stabile.
È una direzione nel tempo.
La futuribilità non è prevedere il futuro, ma:
I Use Case aiutano perché:
I Service, per loro natura, accumulano.
La vera distinzione non è architetturale.
È cognitiva.
I Service modellano ciò che sappiamo. I Use Case modellano ciò che vogliamo ottenere.
Il problema nasce quando smettiamo di distinguere le due cose.
E il codice, lentamente, smette di essere uno strumento di pensiero.
Diventa solo una traccia storica.