5

Questa domanda nasce dal mio lavoro su un'applicazione Grails, ma si applica praticamente a tutte le applicazioni Web sviluppate a strati. Ecco un semplice esempio:I metodi Service Layer dovrebbero prevedere istanze o id?

class OrderService { 

    // Option 1 
    def shipOrder(Order order) { 
     order.status = OrderStatus.SHIPPED 
     emailService.sendShipmentEmail(order) 
     // ... 
    } 

    // Option 2 
    def shipOrder(long orderId) { 
     def order = Order.get(orderId) 
     order.status = OrderStatus.SHIPPED 
     emailService.sendShipmentEmail(order) 
     // ... 
    } 

} 

Qualcuna di queste opzioni è documentata migliore dell'altra?

+1

Come sempre con questo tipo di domande, dipende. Questa non è una buona domanda per SO e probabilmente sarà chiusa. – Gregg

+0

Hm, non lo sapeva. Ho cambiato la domanda un po 'per renderla meno dipendente dall'opinione. –

risposta

9

Preferisco utilizzare id, poiché a volte si desidera utilizzare il blocco pessimistico e quindi è facile modificare Order.get(orderId) in Order.lock(orderId). Il blocco deve avvenire in una transazione, quindi utilizzando il primo approccio bloccherete dopo la lettura, correndo il piccolo rischio di aggiornamento intermedio.

volte è necessario caricare l'istanza di fuori del servizio, ad esempio per testare l'esistenza nel controller, quindi il secondo approccio può sembrare che sprechi una chiamata al database. Ma è possibile modificare la chiamata get() a una chiamata exists() e controllare solo l'esistenza dell'ID, anziché caricare l'intera istanza solo per vedere se è presente.

Si noti che è necessario utilizzare long orderId nella propria firma del metodo poiché consentire un ID nullo non ha senso.

+0

+1 Postmortem assoluto del caso d'uso. Soprattutto 'esiste()', lo vedo molto sul mio posto di lavoro. :) – dmahapatro

+1

Interessante. Non sapevo di 'exists()'. –

+0

Neanch'io. Inoltre, ho sentito Groovy trattato a lungo e lo stesso a lungo (diversamente da Java). Ora ho appena confermato che a lungo non può essere nullo, anzi! Modificato il codice sopra. Grazie! –

Problemi correlati