5

在这个论坛上阅读了几周后,我认为是时候做我的第一篇文章了。

我目前正在重读 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();

但是话又说回来,您的例程没有逻辑联系。

我个人认为这篇文章中的所有三个例子都很糟糕。这是我没有想到的其他方式吗?

4

3 回答 3

7

您缺少逻辑连接:

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();
于 2010-03-11T17:04:42.080 回答
1

现在付款与以后付款。

您可以预先编写委托和包装函数(立即付款),然后减少更改 employee.IsZipCodeValid() 内部的工作。或者,您可以通过编写隧道通过 IsZipCodeValid

员工.GetAddress().GetZipCode().IsValid();
在代码中您需要它的任何地方,但如果您决定以破坏此代码的方式更改您的类设计,请稍后付费。

你可以选择你的毒药。;)

于 2010-03-11T17:08:19.147 回答
0

由于 Employee 类和邮政编码验证之间没有逻辑联系,因此您可以将邮政编码验证放入更符合逻辑的 Address 类中。然后,您可以要求 Address 类为您验证邮政编码。

class Address
{
    public:
        static IsZipValid(ZipCode zip) { return zip.isValid(); }
};

然后你做

Address::IsZipValid(employee.GetAddress().GetZipCode());

我认为这在你的逻辑关联和得墨忒耳法则的约束下是令人满意的。

于 2010-03-11T17:27:37.933 回答