[英]Is output read from popen()ed FILE* complete before pclose()?
[英]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.