在这个论坛上看了几个星期后,我觉得是时候发表我的第一篇文章了。
我目前正在重读 Code Complete。我想距离上次已经有 15 年了,我发现我仍然不会写代码;-)
无论如何,在 Code Complete 的第 138 页上,您会找到这个编码恐怖示例。 (我已经删除了一些代码)
class Emplyee {
public:
FullName GetName() const;
Address GetAddress() const;
PhoneNumber GetWorkPhone() const;
...
bool IsZipCodeValid( Address address);
...
private:
...
}
Steve 认为不好的地方在于功能松散相关。或者他是否写过“员工与检查邮政编码、电话号码或工作分类的例程之间没有逻辑联系”
好吧,我完全同意他的看法。也许像下面的例子更好。
class ZipCode
{
public:
bool IsValid() const;
...
}
class Address {
public:
ZipCode GetZipCode() const;
...
}
class Employee {
public:
Address GetAddress() const;
...
}
当检查 zip 是否有效时,你需要做这样的事情。
employee.GetAddress().GetZipCode().IsValid();
这对 Law of Demeter 来说并不好.
因此,如果您想删除三个点中的两个,则需要使用委托(delegate)和一些类似这样的包装函数。
class ZipCode
{
public:
bool IsValid();
}
class Address {
public:
ZipCode GetZipCode() const;
bool IsZipCodeValid() {return GetZipCode()->IsValid());
}
class Employee {
public:
FullName GetName() const;
Address GetAddress() const;
bool IsZipCodeValid() {return GetAddress()->IsZipCodeValid());
PhoneNumber GetWorkPhone() const;
}
employee.IsZipCodeValid();
但是话又说回来,您的例程没有逻辑联系。
我个人认为这篇文章中的三个例子都不好。是不是我没想到的其他方式?
最佳答案
您缺少逻辑联系:
class ZipCode
{
public:
bool IsValid();
}
class Address {
public:
ZipCode GetZipCode() const;
bool IsAddressValid();
bool IsValid() {return GetZipCode()->IsValid() && IsAddressValid());
}
class Employee {
public:
FullName GetName() const;
Address GetAddress() const;
bool IsEmployeeValid();
bool IsValid() {return GetAddress()->IseValid() && IsEmployeeValid());
PhoneNumber GetWorkPhone() const;
}
employee.IsValid();
关于c++ - 代码完成 2ed,组合和委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2426944/