gpt4 book ai didi

oop - 我打破了 "Law of Demeter"吗?

转载 作者:行者123 更新时间:2023-12-04 02:00:44 25 4
gpt4 key购买 nike

我最近才知道 Law of Demeter .

像很多事情一样,我意识到这是我已经在做但没有名字的事情。虽然有几个地方我似乎违反了它。

例如...

我可能有一个地址对象:

public class Address : IAddress
{
public string StreetAddress { get; set; }
public string City { get; set; }
public int Zip { get; set; }
}

和一个客户对象:
public class Customer : ICustomer
{
private IAddress address;

Customer()
{
Address = null;
}
public string Name { get; set; }
public IAddress
{
get
{
if (address == null)
{
address = new Address();
}
return address;
}
set
{
address = value;
}
}
}

好的,这是假代码,所以你可能不必跳到我身上来使用 IoC 来消除 new Address()或其他任何东西,但这几乎是我正在做的事情的一个例子。我没有包括接口(interface),因为我希望它们是显而易见的。

然后我会在我的代码中使用它来处理 int zip = customer.Address.Zip; 之类的东西。和 customer.Address.City = "Vancouver";
据我了解,我通过操纵客户地址的详细信息违反了得墨忒耳定律。

话又说回来,框架似乎也是如此。毕竟,address.City.Length 不是违规行为吗?我应该向地址添加方法来处理访问字符串属性吗?可能不是。那么,为什么要弄乱地址呢?

我真的不能只向地址添加仅与客户相关的方法。我有 Member、Employee、Dependent、Vendor、Employer 等对象,它们也都有地址。

有没有更好的方法来处理这个?如果我以现在的方式使用 Address,我会面临什么样的问题?

对于 Java 人来说,如果有帮助的话,Address 类可能看起来更像以下内容:
public class Address extends AddressInterface
{
private String m_city;

public String getCity() { return m_city; }
public void setCity(String city) { m_city = city; }
}

我必须承认 customer.getAddress().setCity("Vancouver");响起的警报比 customer.Address.City = "Vancouver"; 更多为我做了。也许我应该改用 Java 一段时间。

最佳答案

本文:http://haacked.com/archive/2009/07/14/law-of-demeter-dot-counting.aspx对您正在讨论的问题有很好的解释。

正如他所指出的,这不是一个点计数练习,而是一个耦合问题。目前您的CustomerAddress类耦合太紧。对于初学者,Customer不应该创建新地址,也许通过 Address在使用构造函数。至于您是否应该使用多个点来访问地址的一部分,请阅读文章...

马丁·福勒:“I'd prefer it to be called the Occasionally Useful Suggestion of Demeter.

关于oop - 我打破了 "Law of Demeter"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3706463/

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