在这个论坛上阅读了几周后,我认为是时候做我的第一篇文章了。
我目前正在重读 Code Complete。我想距离上次已经 15 年了,我发现我仍然不会写代码 ;-)
无论如何,在 Code Complete 的第 138 页上,您会发现这个编码恐怖示例。(我已经删除了一些代码)
class Emplyee {
public:
FullName GetName() const;
Address GetAddress() const;
PhoneNumber GetWorkPhone() const;
...
bool IsZipCodeValid( Address address);
...
private:
...
}
史蒂夫认为不好的是这些功能之间的关系松散。或者他是否写过“员工和检查邮政编码、电话号码或工作分类的例程之间没有逻辑联系”
好的,我完全同意他的看法。也许像下面的例子更好。
class ZipCode
{
public:
bool IsValid() const;
...
}
class Address {
public:
ZipCode GetZipCode() const;
...
}
class Employee {
public:
Address GetAddress() const;
...
}
在检查 zip 是否有效时,您需要执行类似的操作。
employee.GetAddress().GetZipCode().IsValid();
而那对于得墨忒耳法则来说是不好的。
因此,如果您想删除三个点中的两个,则需要使用委托和几个像这样的包装函数。
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();
但是话又说回来,您的例程没有逻辑联系。
我个人认为这篇文章中的所有三个例子都很糟糕。这是我没有想到的其他方式吗?