如何处理构造函数的过多参数?

时间:2015-10-06 14:15:57

标签: c++ class constructor arguments

我是编程的初学者,我正在使用本书学习C ++编程语言:使用C ++编程原理和实践。今天我来这里是因为我需要帮助来解决技术问题。在第9章中,我必须编写实现Book类的程序,例如我们可以将它想象为库软件的一部分。我们的书类将有4个成员:ISBN(用n-n-n-x表示,其中n是整数,x是字母或数字),作者姓名,书名,版权日期。

我刚刚开始使用课程,所以我还在学习程序员在编写代码时应该做些什么样的考虑,对于这门课程我不认为我们可以提供任何默认构造函数,因为没有默认给书的价值。因此,决定为Book构造函数设置4个参数,我们会像这样进行索引:

class Book {
public: 
Book(string, string, string, Date); 
private: 
string isbn; 
string author; 
string title; 
Date copyright_date; // I defined the Date class in a previous exercise
};

在编写了Book类的简短skecth后,我认为book类的构造函数可能是个问题,这是因为它需要4个参数才能使初始化列表真的很长:

Book b1{ "1,2,3,h", "Stroustrup", "Programming principles and practice using C++", {2015,Month::jan, 1} }; 

你觉得这本书的初始化时间太长了吗?如果我想创建一个图书矢量怎么办?你怎么解决这个问题?请记住,我不是专家,因此我仍然无法理解课程及其设计的所有内容,这只是一个尝试提高技能和更好地了解课程的问题。

2 个答案:

答案 0 :(得分:2)

既然你是一名学习者,我会给你一些你没有特别问过的建议。

首先。永远不要using namespace std;。命名空间std的存在是有原因的,这不是为了让你在每个文件的开头键入那些神奇的单词。这是为了避免名称冲突。有了这个习惯,你很快就会遇到一个非常令人费解的编译错误,当std命名空间中有一个名字和你自己的命名空间或其他命名空间时,你会以同样的方式use。长话短说,不要这样做:)。

二。在函数原型中提供参数名称。 Book(string, string, string, Date);应为Book(std::string isbn, std::string author...;。这将帮助您(或其他代码维护者)查看函数所期望的内容,而无需查看它的实现。

第三。字符串参数。通过价值或参考?关于它有很多话要说,就在上周我真的因为说我相信的事情而被嘲笑。我建议你稍后再深入研究这个问题,这很重要并且定义了你的编程习惯。现在你只需要了解当你按值传递字符串时会发生什么。

四。不,它不长:)(你的参数列表)。为了增强可读性,请将其拆分为多行。分裂的方式对于一个人的美学来说纯粹是主观的,我个人更喜欢这种形式:

Book b1{ "1,2,3,h", "Stroustrup",
         "Programming principles and practice using C++",
         {2015,Month::jan, 1}
       }; 

答案 1 :(得分:-3)

实际上,你在课堂上承担了多重责任,这就是单一责任原则。听起来不熟悉,对吗?

应该是。作为初学者,您正在学习一些OOP基础知识,这很不错。您还担心代码的可维护性。我建议首先学习OOP的所有功能,并学习如何在代码上实现它们。如果您认为自己很好,请研究以下主题:

  1. 代码重构
  2. Code Smell
  3. 分离关注
  4. SOLID原则
  5. 慢慢来,不要急。如果您认为自己具有良好的知识并且能够编写上述主题的代码,那么请开始学习设计模式。

    这个主题不是一次性掌握的。它需要许多练习,失败,试错法。