【发布时间】:2011-04-12 00:16:09
【问题描述】:
我最近才知道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() 或任何东西,但这几乎是我正在做的一个例子。我没有包括接口,因为我希望它们是显而易见的。
然后我会在我的代码中使用它来处理 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 一段时间。
【问题讨论】:
-
C++ 的少数人呢? ;(
-
对不起Kornel。我没有不尊重的意思。帖子变得很长。我可以使用一百万种语言作为示例。不过,Java 人似乎很喜欢他们的模式,我认为如果有帮助的话,添加一个 sn-p 是值得的。对我的问题有任何见解吗?
-
@Hightechrider - 为什么不作为答案发布?我可能会接受。
-
我是否违反了“得墨忒耳法则”?更新地址中的城市而不更新其他内容是否有意义?
标签: oop refactoring object