5

Diese Frage entstand aus meiner Arbeit an einer Grails-Anwendung, aber sie gilt für so ziemlich jede Web-Anwendung, die in Schichten entwickelt wurde. Hier ist ein einfaches Beispiel:Sollten Service-Layer-Methoden Instanzen oder IDs erwarten?

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) 
     // ... 
    } 

} 

Ist eine dieser Optionen als besser als die andere dokumentiert?

+1

Wie immer mit diesen Fragen hängt es ab. Dies ist keine gute Frage für SO und wird wahrscheinlich geschlossen werden. – Gregg

+0

Hm, habe das nicht bemerkt. Ich habe die Frage etwas geändert, um sie weniger abhängig von der Meinung zu machen. –

Antwort

9

Ich neige dazu, ids zu bevorzugen, da Sie manchmal pessimistische Sperren verwenden möchten, und dann ist es einfach, Order.get(orderId) zu Order.lock(orderId) zu ändern. Die Sperrung muss in einer Transaktion erfolgen, also verwenden Sie die erste Methode, die Sie nach dem Lesen sperren würden, wobei das kleine Risiko einer Aktualisierung dazwischen besteht.

Manchmal ist es erforderlich, die Instanz außerhalb des Dienstes zu laden, z. um die Existenz in der Steuerung zu testen, so kann sich der zweite Ansatz so anfühlen, als ob er einen Datenbankaufruf verschwendet. Aber Sie können den get() Anruf zu einem exists() Anruf ändern und nur auf das Vorhandensein der ID überprüfen, anstatt die gesamte Instanz nur zu laden, um zu sehen, ob es dort ist.

Beachten Sie, dass Sie in Ihrer Methodensignatur long orderId verwenden sollten, da das Zulassen einer Null-ID nicht sinnvoll ist.

+0

+1 Absolute postmortem des Anwendungsfalles. Vor allem 'exists()', das sehe ich an meinem Arbeitsplatz. :) – dmahapatro

+1

Interessant. Ich wusste nichts über 'exists()'. –

+0

Ich auch nicht. Außerdem hörte ich Groovy lange und Long das gleiche (anders als Java). Jetzt habe ich gerade bestätigt, dass Long nicht wirklich Null sein kann! Der obige Code wurde geändert. Vielen Dank! –

Verwandte Themen