Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 服务层方法是否应该期望实例或id';s_Design Patterns_Web Applications_Grails_Service Layer_Code Design - Fatal编程技术网

Design patterns 服务层方法是否应该期望实例或id';s

Design patterns 服务层方法是否应该期望实例或id';s,design-patterns,web-applications,grails,service-layer,code-design,Design Patterns,Web Applications,Grails,Service Layer,Code Design,这个问题源于我在Grails应用程序上的工作,但它几乎适用于每一个分层开发的web应用程序。下面是一个简单的例子: class OrderService { // Option 1 def shipOrder(Order order) { order.status = OrderStatus.SHIPPED emailService.sendShipmentEmail(order) // ... } // Opt

这个问题源于我在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)
        // ...
    }

}

这些选项中有哪一个被记录为比另一个更好吗?

我倾向于选择ID,因为有时您希望使用悲观锁定,然后很容易将
Order.get(orderId)
更改为
Order.lock(orderId)
。锁定必须发生在事务中,因此使用读取后锁定的第一种方法,在两者之间运行更新的小风险

有时,有必要在服务之外加载实例,例如,测试控制器中是否存在实例,因此第二种方法可能会感觉浪费了数据库调用。但是您可以将
get()
调用更改为
exists()
调用,只检查id是否存在,而不是加载整个实例以查看它是否存在


请注意,您应该在方法签名中使用
long orderId
,因为允许空id没有意义。

与此类问题一样,这取决于具体情况。这对SO来说不是一个好问题,可能会结束。嗯,我没意识到。我稍微改变了这个问题,使它不那么依赖于意见。+1用例的绝对事后分析。尤其是
存在()
,我在我的工作场所看到了很多有趣。我不知道
存在()
,我也不知道。另外,我听说Groovy对long和long的处理是一样的(不同于Java)。现在我确认了long不能为null,真的!更改了上面的代码。谢谢@AndréValenti对象可以为空,而基本数据类型不能为空。如果您提供了
长id
,则有可能将
id
作为
null
发送。当使用
长id
时,这种可能性就被消除了。@dmahapatro我知道Java是这样的,但我认为Groovy把所有东西都当作对象处理。