成员函数的设计问题

时间:2014-03-25 14:19:58

标签: c++

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

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

用户定义一个覆盖此方法的派生类。

我们发现方法代码具有误导性,因为它的设计很糟糕:

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

其余的代码将使用给定给b的值,并且如果已设置,将从c和d的值中受益。

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

问题:

  1. 对象b,c和d怎么样?他们是一种以考虑不同行为的方式声明这种方法的更好方法吗?

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

2 个答案:

答案 0 :(得分:2)

我会绕过"虚假限制"它必须是一种单一的方法:显然这是不正确的,因为要求似乎差别很大。

分为多个方法,参数数目不一,当然还有合适的参数名称。

答案 1 :(得分:2)

C ++没有提供任何方便的工具,就像其他一些语言一样(例如在C#,refout[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引用更好了。

至于标记它已被弃用,你可以做的最好就是对它进行评论,或者打印出一个“我不赞成,不要使用我”警告消息到控制台或日志文件时的功能使用。