成员函数的设计问题
A design issue of a member function
基类有一个具有此签名的成员函数
virtual void method(A &a, B &b, C &c, D& d);
用户定义一个派生类来覆盖这个方法。
我们发现方法的代码是有误导性的,因为它有不好的设计:
- a只是一个输入,不应该修改
- b只是一个输出,必须设置
- c只是一个输出,可以设置或不设置
- d同时是输入和输出,所以它应该被读取,并且可以在方法中设置一个值。
代码的其余部分将使用给定给b的值,如果c和d的值已设置,则从c和d的值中获益。
显然这是一个糟糕的设计,例如a应该声明为const。
问题:
对象b、c和d呢?在考虑不同行为的情况下声明这个方法是不是更好的方法?
我们应该如何弃用这个方法并替换它而不影响当前使用这个方法的代码?
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"警告消息到控制台或日志文件。
我会绕过必须是单一方法的"错误限制":显然这是不正确的,因为需求似乎差异如此之大。
分裂成多个方法,有不同数量的参数,当然还有合适的参数名称
相关文章:
- Visual Studio中的函数声明和函数定义问题
- C++quit()函数中可能存在作用域问题
- 类似于strcat()的函数出现问题
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 类C++中的函数问题(LNK2019和LNK1120错误)
- c++binary_search函数排序数组(流行名称搜索)出现问题
- 关于简单C++函数(is_palindrome)的逻辑的问题
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- constexpr构造函数需要常量成员函数时出现问题
- 添加存储在向量中的大整数的函数出现问题
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 关于 c++ 函数中指针赋值的简单问题
- 如何在标头中声明(或定义)函数的问题
- 有关 c++ 构造函数的问题
- 模板类转换问题 - 无法推断调用的函数
- 从 C++ 中的函数返回数组地址问题
- 关于复制构造函数的一个棘手问题
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- Arduino:在 loop() 和自定义函数中运行相同的代码时出现问题