有遇到一个程式流程中 某些步骤可能要检查或不检查的问题 想请问该
怎么写比较好. 语言是使用C++
首先我有一个computing class, 里面有个member function,
专门负责做计算的动作 而里面有七个步骤:
class Engine::compute(...arguments...)
1. compute1
2. compute2
3. if checking fails this return pre-condition is not satisfied
4. compute3
5. foreach cofig in allowed_user_configurations
6 if checking succeed then store this configuration
7. return allowed_configuration
步骤3)跟步骤6)的检查是由一个complianceChecker的class来做的:
bool compliance.check(....arguments....)
现在呢 为了一些原因 提供了一个选项 可以让步骤3.)跟步骤6.)的检查不做-也就是
永远检查成功, 请问要怎么在不动到主流程的状况下, 来达成这件事情呢?
因为这边是简化版本 但其实检查的地方大概十多处....
全部都加if-else好像不是太好 如果考虑到未来在其他部分需要加检查 或是未来
流程异动 这样if-else很容易漏掉 或是忘记要加if-else
目前我的想法是 加一个wrapper class在compliance checker上 ctor吃一个要不要
做检查的boolean, 然后有一个perfect forwarding的 member function取代掉
原本的 compliance checker的check function(转call):
class wrapper {
public:
wrapper(bool doCheckIn): doCheck(doCheckIn) {}
template <typename ... Args>
bool check(Args&& ... args){
return !doCheck || checker.check(std::forward<Args>(args) ... );
}
private:
compliance checker
bool doCheck;
}
然后在第一行之前生成这个wrapper, 用这个wrapper取代掉步骤3.)跟步骤6.)的
compliance class:
class Engine::compute(...arguments...)
==> 0. wrapper newChecker(doCheckOrNot);
1. compute1
2. compute2
=> 3. if (!newChecker.check(...)) return the pre-condition is not satisfied
......................
5. foreach cofig in allowed_user_configurations
==> 6. if (newChecker.check(....)) then store this configuration
7. return allowed_configuration
目前这个做法有一些好处:
1. 不动到compliance checker, 而且也不用怕compliance checker的interfance of
check function会改变(用template+perfect forwarding处理掉了)
2. 整个流程不变 逻辑上也很分明 就是有检查跟永远成功这两种
但是有些不顺的地方:
1.这个wrapper class定位很尴尬, 不知道要当作一个放出来给大家用的class 或是该
跟谁绑在一起 绑在一起是指逻辑关系上.......现在wrapper class九成像syntax sugar
我直接放在CPP file的 anonymous的namespace里 XDDDDD
未来 若别的地方遇到同一种状况 是不是又要写一次? 要不然就要把这个有template的
wrapper class放在header, 但这样会引进compliance class的dependency.....
2. 要改写成virtual function的形式吗? 这样可继承之类的
但因为有用到template所以 没法用virtual function, 而且只有两种状况
用virtual是否有效益呢?
3. wrapper class生成后 就决定他的行为了(由ctor的参数决定) 要动态变化就得再多
一组setter/getter. 想要动态变化的理由是 这样wrapper可当作一个member variable..
不知道要当作local variable还是member variable比较好......
其实觉得这种状况应该是一个非常标准且常见的状况(二选一) 只是不晓得一般是怎么
处理的 觉得应该是继承+virtual function处理居多吧? 但个人比较倾向少用继承
先尝试template + 组合的方式, 或是virtual function是做在别的地方的方式
P.S. compliance checker是我们动不了的一个class.......
在此 想请各位给一些想法跟建议~~~谢谢~~~