このフォーラムを数週間読んだ後、最初の投稿をする時が来たと思いました。
現在コードコンプリートを読み直しています。前回から 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();
そして、それはデメテルの法則に関しては良くありません。
したがって、3 つのドットのうち 2 つを削除したい場合は、委任と、このようないくつかのラッパー関数を使用する必要があります。
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();
しかし、ここでも論理的なつながりのないルーチンがあります。
個人的には、この投稿の 3 つの例はすべて悪いと思います。それは私が考えていなかった他の方法ですか?