2016-08-16 7 views
2

アンクルボブは3つ以下の引数が関数を取得する必要ことを示唆している少数のパラメータ:3つの引数を取る継承と彼の<em>クリーンコード</em>で

機能がダイアドより理解 にかなり困難です。 の発注、一時停止、および無視の問題は2倍以上になります。私はあなたが非常に慎重に考える前にお勧めします トライアドを作成する前に。

しかし、クラス継承階層のCTOR引数はどうでしょうか?階層の各クラスが新しいフィールドを追加し、CTORでそれらを初期化する必要がある場合

class Person 
{ 
private: 
    std::string m_name; 
    int m_age; 

public: 
    Person(const std::string& name, const int age); 
    std::string getName() const { return m_name; } 
    int getAge() const { return m_age; } 
    ~Person(); 
}; 


class Student : public Person 
{ 
private: 
    std::string m_university; 
    int m_grade; 

public: 
    Student(const std::string& name, const int age, const std::string& university, const int grade); 
    std::string getUniversity() const { return m_university; } 
    int getGrade() const { return m_grade; } 
    ~Student(); 
}; 

Studentは4つの引数を取得する方法Personが取得する一方で、参照のみ2とStudentさらに2つを追加します。以下の例を参照してください。だから私たちはこれをどのように扱うべきですか?

答えて

4

いくつかの方法があります。

私はこれがちょうどだったと言うだろうデータメンバを初期化struct

struct PersonInfo { 
    std::string name; 
    int age; 
}; 

struct StudentInfo { 
    PersonInfo person_info; 
    std::string university; 
    int grade; 
}; 

Person::Person(const PersonInfo &info) :m_name(info.name), m_age(info.age) {} 
Student::Student(const StudentInfo &info) : Person(info.person_info), m_university(info.university), m_grade(info.grade) {} 

デフォルトに複数のパラメータを組み合わせて、セッターユーティリティ

Person::Person() : m_age(0) {} 
void Person::set_age(int age) { m_age = age; } 

Student() : m_grade(0) {} // Person is default constructed. 
void Student::set_grade(int grade) { m_grade = grade; } 
1

でそれらを設定します提案。それはあなた次第です - あなたの関数がいくつの引数を取るべきか?

ていますが、ルールに従うように、パラメーターホルダーのいくつかの並べ替えをすることを好む場合:あなたは言葉function 2つの異なる意味が混乱している

class Student 
{ 
    public: 
    struct StudentParameters 
    { 
     ... 
    }; 
    Student(name, age, const StudentParameters &sp); 
... 
}; 
+1

あなたはそれにちょうど 'Parameters'という名前をつけたいので、それは外部から' Student :: Parameters'としてスコープされています。 – Quentin

+0

私はちょうどソリューションの抽象的なビューを与えた:) – fgrdn

0

最初の意味は、単語の元の数学的意味に関連しています。この場合、functionは、1つまたは以上、の入力と1つの出力の間の名前付きの関係です。 "クリーンコード"ルールはこの意味を指し、以上は3つの入力に制限する必要があることを伝えます。

C++の別の意味は、コードブロックであり、入力を持つこともあれば、出力を持つこともあるし、名前を持つこともあります。

そして、後者の意味でも、コンストラクタは異常な機能です。彼らは戻り値の型を持たず、voidさえありません。名前はありません。だから、彼らは入力引数の数になると特別なことも合理化することができます。

関連する問題