簡體   English   中英

代碼完成2ed,組成和委托

[英]Code Complete 2ed, composition and delegation

在這個論壇上看了幾個星期后,我覺得是時候做我的第一篇文章。

我目前正在重讀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;
    ...
}

檢查拉鏈是否有效時,您需要執行類似的操作。

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();

但是,你再次擁有沒有邏輯連接的例程。

我個人認為這篇文章中的所有三個例子都很糟糕。 這是我沒想過的其他方式嗎?

您缺少邏輯連接:

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();

這是現在支付與后期支付。

您可以預先編寫委托和包裝函數(立即付款),然后更少的工作更改employee.IsZipCodeValid()的內部。 或者,您可以通過寫入隧道傳輸到IsZipCodeValid

employee.GetAddress().GetZipCode().IsValid();
您需要在代碼中的任何地方,但如果您決定以破壞此代碼的方式更改您的類設計,請稍后付款。

你可以選擇你的毒葯。 ;)

由於Employee類和zip-code驗證之間沒有邏輯連接,因此您可以將Zip代碼驗證放入更符合邏輯的Address類中。 然后,您可以要求Address類為您驗證Zip代碼。

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

然后你做

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

我認為在你的邏輯關聯和德米特定律的約束下,這是令人滿意的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM