繁体   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