我有一个类,其成员 itemType 仅设置一次且从未修改过,但它在许多 if 语句中用于决定调用哪个函数。
由于 itemType 仅设置一次,因此可以避免在类中的其他地方使用 if 语句。这将简化和清理代码,而且还可以节省 if 检查的开销。
我在考虑函数是一个指针,我可以根据 itemType 值在构造函数中初始化。
有没有其他替代方法和更好的方法来做到这一点?
请注意原始类和代码库很大,我无法根据项目类型创建子类。
enum ItemTypes
{
ItemTypeA,
ItemTypeB,
};
class ItemProcessing
{
public:
//This function is called hundreds of times
void ProcessOrder(Order* order)
{
//This member itemType is set only once in the constructor and never modified again
//Is there a way to not check it all the time??
if (itemtype == ItemTypes::ItemTypeA )
{
ProcessTypeA(order)
}
else if (itemtype == ItemTypes::ItemTypeB )
{
ProcessTypeB(order)
}
}
ItemProcessing(ItemTypes itype)
{
itemtype = itype; //can I do something here like setting a function pointer so I dont have to check this property in ProcessOrder() and call the relevant function directly.
}
private:
ItemTypes itemtype;
void ProcessTypeA(Order*);
void ProcessTypeB(Order*);
};
最佳答案
使用由 itemtype
索引的函数指针数组,如下所示:
typedef void(*ProcessType_func_t)(Order *);
ProcessType_func_t processType_f[] = {
ProcessTypeA,
ProcessTypeB
};
然后你可以这样做:
void ProcessOrder(Order *order) {
ProcessType_f[itemtype](order);
}
如果你有很多不同的函数需要像这样调度,你可以使用结构。
struct {
ProcessType_func_t processType_f,
OtherType_func_t otherType_f,
...
} dispatchTable[] = {
{ ProcessTypeA, OtherTypeA, ... },
{ ProcessTypeB, OtherTypeB, ... }
};
然后你可以将它用作:
dispatchTable[itemtype].processType_f(order);
最后,您可以通过定义新类来实现完全面向对象的方法:
class Processor { // abstract base class
public:
virtual void Process(Order *order) = 0;
};
class ProcessorA {
public:
void Process(Order *order) {
ProcessTypeA(order);
}
}
class ProcessorB {
public:
void Process(Order *order) {
ProcessTypeB(order);
}
}
然后你可以有一个成员变量
Processor *processor;
并在设置
itemtype
时对其进行初始化ItemProcessing(ItemTypes itype)
{
itemtype = itype;
if (itemtype == ItemTypeA) {
processor = new ProcessorA;
} else {
processor = new ProcessorB;
}
}
那么你可以将它用作:
processor->Process(order);
这很容易扩展以支持更多需要在
itemtype
上调度的函数——它们都成为类中的方法。我希望我的语法正确,我自己实际上并没有做太多的 C++ OO 编程。
关于c++ - 避免在静态 bool 值上使用 if 语句进行逻辑决策,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34455930/