当前位置:  开发笔记 > 编程语言 > 正文

避免了可选参数的单调乏味

如何解决《避免了可选参数的单调乏味》经验,为你挑选了2个好方法。

如果我有一个带有2个必需参数和4个可选参数的构造函数,如果我使用默认参数(我不喜欢因为它很差),我怎么能避免编写16个构造函数,甚至编写10个左右我必须编写的构造函数自文档)?有没有使用模板的习语或方法我可以使用它来减少繁琐?(更容易维护?)



1> Fred Larson..:

您可能对命名参数成语感兴趣.

总而言之,创建一个包含要传递给构造函数的值的类.添加一个方法来设置每个值,并让每个方法return *this;在最后执行.在类中有一个构造函数,它接受对这个新类的const引用.这可以这样使用:

class Person;

class PersonOptions
{
  friend class Person;
  string name_;
  int age_;
  char gender_;

public:
   PersonOptions() :
     age_(0),
     gender_('U')
   {}

   PersonOptions& name(const string& n) { name_ = n; return *this; }
   PersonOptions& age(int a) { age_ = a; return *this; }
   PersonOptions& gender(char g) { gender_ = g; return *this; }
};

class Person
{
  string name_;
  int age_;
  char gender_;

public:
   Person(const PersonOptions& opts) :
     name_(opts.name_),
     age_(opts.age_),
     gender_(opts.gender_)
   {}
};
Person p = PersonOptions().name("George").age(57).gender('M');


@Robert重要的是要注意右侧以`PersonOptions`开头,而不是'Person`.这会创建一个可能是轻量级的对象,然后进行许多方法调用以将属性设置为非默认值.然后有一个名为`Person(const PersonOptions&)`和ta da的ctor.对象的实例化(例如`PersonOptions()`)在当前上下文中留下"*this",因此您可以立即使用.method().但是,每个方法仍然需要"返回*this"以便能够在它之后进行链接.
你不能在Person的定义中创建一个Options类吗?所以例子是`Person p = Person :: Options().name("George").age(57).gender('M');`
我认为代码示例在`name_ = n;`之后缺少`return*this`等等?

2> FrustratedWi..:

如果您创建了包含所有字段的参数对象,该怎么办?然后你可以通过它,只需设置你需要的任何字段.这个模式可能有一个名称,但不确定它是什么......

更新:

代码可能看起来像这样:

paramObj.x=1;
paramObj.y=2;
paramObj.z=3;
paramObj.magic=true;
... //set many other "parameters here"

someObject myObject = new someObject(paramObj);

someObject构造函数内部,您可以为尚未设置的事物设置默认值(如果是必需的话,则引发错误).

老实说,我不是这个解决方案的忠实粉丝,但是paramObj通过包含一组通常全部聚集在一起的数据(因此我们可以将其用于更多只是构造函数),我已经使用过一次或两次.它比多个构造函数更好.YMMV,我发现它很丑,但它很有用.


@Robert:优点是你的主对象可以是不可变的,这通常是在OO设计中努力的目标.此外,即使您的类是可变的,它也不需要验证这些"参数"的setter是否不按顺序调用,或者在给定对象的内部状态时它们没有意义的情况下.
...并且此参数对象将在其默认构造函数中设置默认值.
@Robert,当参数必须作为一组进行验证时,它也很有帮助,即某些组合无效.
推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有