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



我是一名编程初学者,我正在学习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} }; 

你认为书籍的初始化太长了吗?如果我想创建一个图书矢量呢?你将如何解决这个问题?请记住,我不是专家,所以我仍然不能理解关于课程及其设计的一切,这只是一个试图提高我的技能和更好地了解课程的问题。

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

首先。切勿执行using namespace std;。命名空间std之所以被放在适当的位置是有原因的,这并不是为了让你在每个文件的开头都键入那些神奇的单词。这是为了避免名称冲突。有了这个习惯,你很快就会遇到一个非常令人困惑的编译错误,当std命名空间中有一个名称,而你自己的命名空间或其他命名空间中也有used时。长话短说,不要这样做:(。

第二。在函数原型中给出参数名称。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}
       }; 

实际上,您将多重责任放在了您的类中,这体现了单一责任原则。听起来不熟悉,对吧?

应该是。作为一个初学者,你正在学习OOP的一些基础知识,这很好。您还关心代码的可维护性。我建议首先学习OOP的所有特性,并学会在代码中实现它们。当你认为自己适合去的时候,学习以下主题:

  1. 代码重构
  2. 代码气味
  3. 关注点分离
  4. SOLID原理

慢慢来,不要着急。当你认为你有扎实的知识,可以为上述主题编写代码时,就开始学习设计模式。

这些话题不是一个镜头就能抓住的。它需要许多实践、失败、试错的方法。

相关内容

最新更新