9

この質問は、Grails アプリケーションでの作業から生じましたが、レイヤーで開発されたほとんどすべての Web アプリケーションに当てはまります。簡単な例を次に示します。

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

}

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

4

1 に答える 1

9

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

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

long orderIdnull id を許可しても意味がないため、メソッド シグネチャでを使用する必要があることに注意してください。

于 2013-07-03T18:33:25.053 に答える