簡體   English   中英

繼承和少量參數

[英]Inheritance and small number of parameters

Bob叔叔在他的“ 清潔代碼”中建議,函數獲得的參數不應超過3個:

與三元組相比,帶有三個參數的函數很難理解。 排序,暫停和忽略的問題增加了一倍以上。 我建議您在創建三合會之前要仔細考慮。

但是類繼承層次結構中的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添加兩個參數。 那么我們應該如何處理呢?

有幾種方法。

將多個參數組合成一個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) {}

默認初始化數據成員,並使用setter實用程序進行設置

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; }

我會說這只是一個建議。 這完全取決於您-函數應獲取多少個參數。

但是,如果您喜歡遵循規則,請設置某種參數持有人,例如:

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

您正在混淆單詞function兩個不同含義。

第一個含義與該單詞的原始數學含義更多相關。 在這種情況下, function是一個或多個輸入與一個輸出之間的命名關系。 “清潔代碼”規則指的是這個含義,並告訴您更多信息應限制為3個輸入。

C ++中的替代含義是指代碼塊,可以包含或可以具有輸入,可以具有或可以具有輸出,可以具有或可以具有名稱。

是的,即使在后一種意義上,構造函數也是不尋常的函數。 它們從沒有返回類型,甚至沒有void ,也沒有名稱。 因此,可以合理地認為它們在輸入參數數量方面也很特殊。

暫無
暫無

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

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