对正在做以下事情的类进行成像
class AClass
{
AClass() : mode(0) {}
void a()
{
if (mode != 0) throw ("Error mode should be 0");
// we pass the test, so now do something
...
mode = 1;
}
void b()
{
if (mode != 1) throw("Error mode should be 1");
// we pass the test, so now do something
...
}
int mode;
};
该类包含许多方法(容易超过20个),对于这些方法中的每一个,我们都需要检查模式的值,这显然是很多代码重复。此外,我们可以识别两类方法,如果模式!= 0将抛出错误的那些方法以及如果模式!= 1将抛出错误的那些方法。可能以某种方式将这些方法分为两类(类别A =模式!= 0时抛出错误的方法和模式时抛出错误的方法的类别B!= 1)?
编辑:看看当前的答案,我意识到我制定问题的方式,问题可能不够明确。我想避免的是必须在类的每个方法中调用一个函数。我们是在方法开头编写代码还是将此代码放在函数中并调用此函数不是问题。问题是我们是否可以一起避免这一切。是否有一种技术可以帮助根据某些上下文自动检查对类方法的调用是否有效。
AClass实际上是我项目环境中的API。 a(),b()等是程序员在想要使用API时可以调用的一些函数,但是其中一些方法只能以某种精确的顺序调用。例如,您可以在代码中看到a()设置mode = 1.因此程序员可以这样做:
a(); // mode = 0 so it's good
b(); // mode = 1 so it's good
但是这段代码需要失败(当然它会编译但是在执行时我需要抛出一个错误,提到调用b()的上下文是错误的。
b(); // mode 0 so it won't work
a(); // it will compile but throw an exception
我试图看看是否有任何模式可以用于这样做,但根本找不到任何东西。对我来说似乎不可能,我相信唯一的选择就是编写必要的代码。任何人都可以建议吗?非常感谢你。
答案 0 :(得分:3)
只需添加私有成员函数:
void assert_mode_0() {
assert_mode(0);
}
void assert_mode_1() {
assert_mode(1);
}
void assert_mode(int m) {
if (mode != m)
throw msg[m];
}
当然,具有msg
的合适定义。
答案 1 :(得分:2)
除了在专用方法(一个很好的建议)中实现检查之外,您还可以考虑将AClass
中的行为分解为两个不同的类,或者将特定部分委托给一对新类。如果mode
对于实例是不变的(如示例中所示),这似乎特别合适。
答案 2 :(得分:0)
嗯,我想最简单的解决方案是定义一个宏或一些内联函数,如下所示:
#define checkErrorMode0(x) \
if ((x) != 0) throw ("Error mode should be 0");
#define checkErrorMode1(x) \
if ((x) != 1) throw ("Error mode should be 1");
// or, probably within your class
inline void checkErrorMode0(int x){
if ( x != 0 ) throw ("Error mode should be 0");
}
inline void checkErrorMode1(int x){
if ( x != 1 ) throw ("Error mode should be 1");
}
所以你可以在需要它们的函数中调用其中一个方法。
但很可能有一个更优雅的解决方法,你想做什么。
答案 3 :(得分:0)
在仔细研究这个问题之后,似乎最接近的有用答案是(尼克):
尝试研究面向方面的软件开发en.wikipedia.org/wiki/Aspect-oriented_software_development - Nick
维基百科页面不易阅读,不提供C ++示例,因此它最初保持非常抽象,但如果您搜索面向方面编程和C ++,您将找到带示例的链接。
它背后的想法(它只是一个非常快速的总结)是找到一种方法来向类添加“服务”或“功能”。通过使用模板,可以在编译时特别添加这些服务。这就是我直觉地尝试解决我的问题的尝试,我很高兴看到这种技术已存在多年。
本文档是一个很好的参考:
面向方面的编程& C ++作者:Christopher Diggins,2004年8月1日。
我发现此链接的示例对理解这个概念非常有用:
Implementing Aspects using Generative Programming by Calum Grant.