5

この質問は、私のGrailsアプリケーションの作業から得られたものですが、レイヤーで開発されたほとんどすべてのWebアプリケーションに当てはまります。ここに簡単な例があります:サービスレイヤメソッドはインスタンスまたは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) 
     // ... 
    } 

} 

これらのオプションのいずれかが他のものより優れていると文書化されていますか?

+1

いつものように、これらの種類の質問は、それに依存します。これはSOのための良い質問ではなく、閉鎖される可能性が高いです。 – Gregg

+0

ええ、それは分かりませんでした。意見に依存しにくくするために質問を少し変更しました。 –

答えて

9

私は、悲観的なロックを使いたい場合があり、Order.get(orderId)からOrder.lock(orderId)に変更するのが簡単なので、私はIDを好む傾向があります。ロックはトランザクション内で発生する必要があります。最初のアプローチを使用すると、読んだ後にロックし、小さな更新のリスクをその間に実行します。

場合によっては、サービスの外部にインスタンスを読み込む必要があります。コントローラーに存在をテストするため、2番目のアプローチはデータベース呼び出しを無駄にするように感じることができます。しかし、get()コールをexists()コールに変更し、インスタンスが存在するかどうかを確認するためだけにインスタンス全体をロードするのではなく、IDの存在を確認することができます。

ヌルIDを許可することは意味をなさないので、メソッドシグネチャにはlong orderIdを使用する必要があります。

+0

+1ユースケースの絶対的な死亡。特に 'exist()'は、私の職場ではそれが大変です。 :) – dmahapatro

+1

面白いです。私は 'exist()'について知りませんでした。 –

+0

私も。また、Groovyが長く扱っていると聞きました(Javaとは異なります)。さて、私はちょうど、長いことはnull、実際にはないことを確認した!上のコードを変更しました。ありがとう! –