我正在写这样的逻辑:
我需要根据2条特定消息(字符串值)处理或跳过一段代码 字符串消息基本上是一个类别和一个子类别
所以逻辑是这样的: 假设我们不打算处理块 如果类别== XXX或YYY或...则查看子类别 如果子类别与pretedermined列表匹配,则不处理块
基本上 - 它仅适用于某些类别,并且仅当子类别与预定的"阻止"子类
使用if / then / else很容易实现 - 但我正在尝试使代码更容易更新和维护,因为我们在逻辑中添加了类别和子类别。
我估计最多可能有10-15个类别,每个类别包含5-10个"阻止"子类别。 category和subcategory是std :: string
这是伪代码:
bool process = false; //assume we are skipping block
if ( category == "XXX")
{
process = true;
if (( subcategory == "A") || (subcategory == "B"))
{
process = false;
}
}
else if (category == "YYY")
}
process = true;
if (( subcategory == "C") || (subcategory == "D") || (subcategory == "E"))
{
process = false;
}
}
if (process)
{
// Execute this code block
}
所以 - 我们处理块的唯一方法是满足这两个条件
我想制作一个表或其他一些可能使这个更容易维护的数据结构。有关如何实现这一点的任何想法,以便更新表格,因为需要新的类别和子类别?
由于
答案 0 :(得分:0)
是的,您可以将其划分为更好维护的方法。我会做的是: -
bool isProcessableCategory(std::string category);
对于要启用处理的所有类别,这将返回true。所有其他类别都是假的。
bool isProcessbleSubCategory(std::string category, std::string subCategory);
然后将检查specifec子类别。
这样,您只能将这些功能的所有更改本地化。
答案 1 :(得分:0)
在挖掘之后 - 这是我的最终代码,它运行良好,而且更易于维护。 如果您有任何建议或改进,请告诉我
感谢上面的评论和建议 - 他们让我思考不同的方向,这最终促成了我的解决方案。
-mleega
#include <map>
#include <vector>
#include <algorithm>
using std::find;
...snip...
std::string strCategoryName;
std::string strSubCategoryName;
std::map<std::string, std::vector<std::string>> mCategoryMap;
mCategoryMap["Category-A"];
mCategoryMap["Category-A"].push_back("A1");
mCategoryMap["Category-A"].push_back("A2");
mCategoryMap["Category-B"];
mCategoryMap["Category-B"].push_back("B1");
mCategoryMap["Category-B"].push_back("B2");
mCategoryMap["Category-B"].push_back("B3");
mCategoryMap["Category-C"];
mCategoryMap["Category-C"].push_back("C1");
mCategoryMap["Category-C"].push_back("C2");
mCategoryMap["Category-C"].push_back("C3");
if ( mCategoryMap.find( strCategoryName ) != mCategoryMap.end() ) // If the current category is contained in mCategoryMap then Proceed
{
if ( std::find(mCategoryMap[strCategoryName].begin(),mCategoryMap[strCategoryName].end(), strSubCategory) == mCategoryMap[strCategoryName].end() ) // If the current Sub-Category is NOT contained in the map then Proceed
{
// EXECUTE CODE BLOCK
}
}