是否存在一个概念,确保在实现者忘记扩展应该处理所有成员的方法时,向现有类添加成员会产生某种错误/警告?
如果一个类实现了几个必须触及所有元素的方法(例如导入/导出),那么很容易忘记一个或多个适应方法。编译器不会识别它,并且在很多情况下行为会如预期的那样(当然,除了你有正确的测试。)
我目前的尝试是在每个可能被遗忘的方法中测试类的大小。但当然这不容易阅读,不安全,不是编译器/平台/构建类型独立(所以我不喜欢它)。
class C
{
int element1;
int element2;
int element3; <--- newly added without adapting operator==()
public:
void import_me();
void export_me();
bool operator== (const C&);
void dump();
};
实现可能隐藏在不同/大文件中:
void C::import_me(){
assert( sizeof( *this ) == 12 ); // this is my attempt of doing this
read_fn( element1 );
read_fn( element2 );
read_fn( element3 );
}
void C::export_me(){
assert( sizeof( *this ) == 12 ); // this is my attempt of doing this
write_fn( element1 );
write_fn( element2 );
write_fn( element3 );
}
/// the implementer forgot to adapt this method
bool C::operator==(const C &other) {
assert( sizeof( *this ) == 8 ); <--- this would fail
if( element1 != other.element1 ) return false;
if( element2 != other.element2 ) return false;
return true;
}
我的下一次尝试将是一个生成矩阵(成员X方法)的宏,必须在每个方法中手动填充,但这对我来说似乎不是很干净,我怀疑它表现良好..
答案 0 :(得分:2)
是否存在一个概念,确保在实现者忘记扩展应该处理所有成员的方法时,向现有类添加成员会产生某种错误/警告?
是:测试驱动设计。也就是说,在更改代码之前,添加检查新成员分配的测试。然后,运行测试(它们应该失败)。然后,修复实现。
不幸的是,这取决于你作为开发人员的注意力,所以它只有在你把它变成一种习惯时才有效:(
答案 1 :(得分:1)
这只是一个想法,而不是一个解决方案。
将所有成员打包成元组。编写一些模板元编程代码,将代码函数应用于元组的每个成员。在每个必须遍历所有成员的方法中使用该模板元函数,并使其应用于该方法的特定函数。
boost :: mpl可能是一个起点。
但请注意:这并不容易,这是先进的技术。根据您的经验,您的里程可能会有所不同。
答案 2 :(得分:0)
在这种情况下,我使用了python脚本+ clang库。 Python脚本通过解析生成import_me,export_me等方法 课程定义。