gpt4 book ai didi

ruby-on-rails - 得墨忒耳法则 : create delegates to access attributes on associated objects or not?

转载 作者:行者123 更新时间:2023-12-04 11:54:16 25 4
gpt4 key购买 nike

得墨忒耳法则似乎是一个非常强大的概念。我可以理解它如何帮助编写良好且可维护的面向对象代码。

Some people suggest每次需要访问 View 中关联对象的属性时编写委托(delegate)方法。而不是在 View 中写这样的东西

@order.customer.name

你会写这个代码:
# model
class Order < ActiveRecord::Base
belongs_to :customer
delegate :name, :to => :customer, :prefix => true
end

#view
@order.customer_name

另一方面, people argue that you views should not dictate models and you should not add methods such as delegate to a model only for the sake of trading a dot for an underscore in a view .

当在 View 中违反得墨忒耳定律时,在模型中编写委托(delegate)方法是否被认为是最佳实践?

最佳答案

我看到你的 customer_name自动生成的委托(delegate)方法是目前最简单的方法。由于它是一个方法调用(而不是一系列方法链),因此以后很容易重构(或者,比某些链式方法更容易重构)

想象一下,无论出于何种原因,将许多客户添加到订单中,其中一个是主要客户。现在您的订单类可能看起来像

class Order < ActiveRecord::Base

has_many :customers

def customer_name
if customers.first.primary?
customers.first.name
else
customers.last.name
end
end

很容易用我们自己的一种方法替换方便委托(delegate)生成的方法。

(第一次编写也非常容易,因为 delegate 负责所有样板文件。很有可能你会在你的应用程序中永远以这种形式使用 customer_name。这很难知道。但是代码很容易/第一次自动写很便宜,扔掉:))

当然,您必须避免使用诸如 customer_streetaddress_is_united_states? 之类的方法名称的情况。 (是的,不是用点编码对象图,而是用下划线编码。)

如果您的 View 确实需要知道用户是否位于美国,那么这样的方法可能会起作用:
class Order < ActiveRecord::Base

belongs_to :customer

def shipping_to_us?
customer.shipping_country == "USA"
# Law of Demeter violation would be:
# customer.addresses.first.country == "USA"
end
end

class Customer < ActiveRecord::Base
has_many :addresses

def shipping_country
addresses.first.country
end
end

注意这里 OrderCustomer对象为送货地址,而不是告诉客户获取客户的第一个地址所在的国家/地区。就像一个告诉你做某事并让你独自一人的老板与一个对你的日常工作进行微观管理的老板。 (要获得额外的启发,请阅读问题,不要告诉 Ruby 开发的方法 :))

关于使用演示者、装饰器方法或助手来避免这些可能只是显示逻辑代码乱扔模型,有一些话要说。我将把它作为练习留给读者:)

关于ruby-on-rails - 得墨忒耳法则 : create delegates to access attributes on associated objects or not?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16868797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com