不仅是没有为这类问题的解决方案。
布尔具有非常低的语义。如果你想在未来添加一个新的条件,你将不得不添加一个新的参数...
经过四年的维护,你的方法可能有六个参数,如果这些参数都是布尔值,那么它是非常好的陷阱为维护者。
枚举是一个不错的选择,如果情况是排他的。枚举可以很容易地迁移到位掩码或上下文对象。
位掩码:C++包含C语言,您可以使用一些普通的旧做法。有时候,unsigned int上的位掩码是一个不错的选择(但是你会丢失类型检查),并且你可以错误地传递一个不正确的掩码。这是从布尔或枚举参数平滑移动到这种模式的一种便捷方式。 位掩码可以通过一些努力迁移到上下文对象。如果您必须保持构建时兼容性,则可能必须实施某种按位运算,如operator |
和operator &
。
传承有时是一个不错的选择,如果行为的分裂是大,这种行为是与实例的生命周期。注意你也必须使用多态,如果这个方法被大量使用,这可能会减慢方法。
最后的继承引起你的所有工厂代码改变...如果你有几个方法,独特的时尚改变你会怎么办?你会混乱你的代码的特定类... 其实,我认为这通常不是一个很好的主意。
方法拆分:另一种解决方案是有时将该方法拆分为几个私有方法,并提供两个或多个公共方法。
语境对象:C++和C缺乏命名参数的可通过添加上下文参数进行旁路。我经常使用这种模式,特别是当我必须跨越复杂框架级别传递大量数据时。
class Context{
public:
// usually not a good idea to add public data member but to my opinion this is an exception
bool setup:1;
bool foo:1;
bool bar:1;
...
Context() : setup(0), foo(0), bar(0) ... {}
};
...
Context ctx;
ctx.setup = true; ...
MyObj.foo(ctx);
注: ,这也是有用的,以尽量减少访问(或使用)静态数据或查询的独居对象,TLS ... 上下文对象可以包含与算法的缓存数据的多很多。 ... 我让你的想象力自由...
反模式
我在这里补充几个反模式(阻止签名的一些变化): * 永远不要这样做*
- * 永远不要这样做*使用参数传递的静态INT /布尔(一些人这样做,这是一个噩梦去除这种东西)。打破至少多线程...
- * 永远不要这样做*添加数据成员参数传递给方法。
来源
2011-05-24 07:56:41
VGE
恕我直言,不要启动。随着时间的推移将难以维持。那么最终的重构要困难得多。 – Keith 2011-05-24 07:51:57
@凯斯 - 对不起,我不清楚你的意思。不要开始什么? – LeopardSkinPillBoxHat 2011-05-24 07:52:50
不要开始使用像那样的条件方法。调用者可以决定的子类或单独的方法。 – Keith 2011-05-24 07:55:43