成员函数的设计问题

A design issue of a member function

本文关键字:问题 函数 成员      更新时间:2023-10-16

基类有一个具有此签名的成员函数

virtual void method(A &a, B &b, C &c, D& d);

用户定义一个派生类来覆盖这个方法。

我们发现方法的代码是有误导性的,因为它有不好的设计:

  • a只是一个输入,不应该修改
  • b只是一个输出,必须设置
  • c只是一个输出,可以设置或不设置
  • d同时是输入和输出,所以它应该被读取,并且可以在方法中设置一个值。

代码的其余部分将使用给定给b的值,如果c和d的值已设置,则从c和d的值中获益。

显然这是一个糟糕的设计,例如a应该声明为const

问题:

  1. 对象b、c和d呢?在考虑不同行为的情况下声明这个方法是不是更好的方法?

  2. 我们应该如何弃用这个方法并替换它而不影响当前使用这个方法的代码?

c++不像其他语言(如c#, ref, out, [Obsolete]标签)那样提供任何方便的工具。

我见过一些人这样做:

#define in
#define out
#define optional
// DEPRECATED
virtual void method(const A& a, out B& b, optional out C& c, in out D& d);

这当然不会对编译器产生任何行为上的不同,也没有任何意义,只是对人类读者来说很漂亮。

除此之外,我认为使第一个参数const是你能做的最好的。从语义上讲,没有什么比让它们保持非const引用更好的了。

对于标记为已弃用,最好的方法是在上面加上注释,或者在使用该函数时打印出"I'm deprecated, don't use me"警告消息到控制台或日志文件。

我会绕过必须是单一方法的"错误限制":显然这是不正确的,因为需求似乎差异如此之大。

分裂成多个方法,有不同数量的参数,当然还有合适的参数名称