c++ - 代码完成 2ed,组合和委托(delegate)

标签 c++ delegates composition code-complete

在这个论坛上看了几个星期后,我觉得是时候发表我的第一篇文章了。

我目前正在重读 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/

相关文章:

c++ - 复制构造函数中的递归调用

c++ - 支持三元 NURBS 的 NURBS 库

c++ - 如何在 C++ 中打印 int 的 ASCII 值?

c# - 转换 Action <委托(delegate)>

c++ - 结构新手,我对如何从 void 函数返回值并将其放入另一个函数感到困惑

vb.net - 委托(delegate)如何解决跨线程问题?

c# - 有没有人有使用 cglib MulticastDelegate 来执行 C# 事件之类的示例代码?

Haskell - 将返回仿函数的函数应用到仿函数上

c++ - 必要时违反继承之上的组合可以吗?

java - 组合与减少耦合?