替代 if-else 语句或更好的方法
Alternative to if-else statements or better approach
UI 上有 4 个不同的用户输入字段,例如 Multiselect 下拉菜单。用户可以提供不同的输入字段组合来缩小结果集。 (来自多 select 选项的 select all/few 选项)。
示例:
2 多select 选项
多项select 选项 A 具有元素{"10xyz1","11xyz1",...},
多项select 选项 B 具有元素{"xyz101","abc111",...}
2^2 种可能的输入组合(提示:二进制真值Table):
1) Select Multiselect 选项 A 中的所有元素 && Select Multiselect 选项 B 中的所有元素,
2) Select Multiselect 选项 A 中的所有元素 && Select Multiselect 选项 B 中的一些元素,
3) Select Multiselect 选项 A 中的几个元素 && Select Multiselect 选项 B 中的所有元素,
4) Select Multiselect 选项 A 中的几个元素 && Select Multiselect 选项 B 中的几个元素
注意:至少有一个元素必须select来自任一选项
我已经使用 if else 语句来实现我的逻辑(我有单独的 mongo 集合用于每个可能的 selection,对于 4 个字段,16 种可能的组合,所以 16 mongo集合),但问题是代码看起来非常丑陋,有很多 if-else 语句,而且如果在 UI 中添加了一个字段,那么我必须检查添加额外的条件语句。
目前条件 if-else 语句的数量为 2^N(其中 N 是 Multiselect 下拉输入字段的数量)。
代码片段:
private void constructQuery(MongoQuEry query, AnalysisFilter filter)
{
query.addFilterField("_id.operator", MongoQuEry.OP_EQUALS, "alpha");
query.addFilterField("_id.month_year", MongoQuEry.OP_IN, getListOfMonthYear(filter));
String collectionName;
if (filter.getAllMarket() && filter.getAllCmts() && filter.getAllNode() && filter.getAllPackage()) {
collectionName = CollectionNames.ME_USAGE_MONTH_YEAR.toString();
} else if (filter.getAllMarket() && filter.getAllCmts() && filter.getAllNode()) {
collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_PACKAGE.toString();
query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage());
} else if (filter.getAllMarket() && filter.getAllCmts() && filter.getAllPackage()) {
collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_NODE.toString();
query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode());
} else if (filter.getAllMarket() && filter.getAllCmts()) {
collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_NODE_PACKAGE.toString();
query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode());
query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage());
} else if (filter.getAllMarket() && filter.getAllNode() && filter.getAllPackage()) {
collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_CMTS.toString();
query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts());
} else if (filter.getAllMarket() && filter.getAllNode()) {
collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_CMTS_PACKAGE.toString();
query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts());
query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage());
} else if (filter.getAllMarket() && filter.getAllPackage()) {
collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_CMTS_NODE.toString();
query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts());
query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode());
} else if (filter.getAllMarket()) {
collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_CMTS_NODE_PACKAGE.toString();
query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts());
query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode());
query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage());
} else if (filter.getAllCmts() && filter.getAllNode() && filter.getAllPackage()) {
collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET.toString();
query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket());
} else if (filter.getAllCmts() && filter.getAllNode()) {
collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET_PACKAGE.toString();
query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket());
query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage());
} else if (filter.getAllCmts() && filter.getAllPackage()) {
collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET_NODE.toString();
query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket());
query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode());
} else if (filter.getAllCmts()) {
collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET_NODE_PACKAGE.toString();
query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket());
query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode());
query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage());
} else if (filter.getAllNode() && filter.getAllPackage()) {
collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET_CMTS.toString();
query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket());
query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts());
} else if (filter.getAllNode()) {
collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET_CMTS_PACKAGE.toString();
query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket());
query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts());
query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage());
} else if (filter.getAllPackage()) {
collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET_CMTS_NODE.toString();
query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket());
query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts());
query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode());
} else {
collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET_CMTS_NODE_PACKAGE.toString();
query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket());
query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts());
query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode());
query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage());
}
query.setCollection(collectionName);
query.addGroupByFields("_id.operator", "_id.month_year");
query.addAliasAggregateField("count", MongoQuEry.AGGR_SUM, "subscriber_count");
int order = MongoQuEry.ORDER_ASC;
query.addOrderByFields(order, "_id.month_year");
}
switch case
或 IIf
表达式怎么样?
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/switch
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/conditional-operator
switch case
会更清晰,将 if-else
内容分成函数:
void FunctionName()
{
collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_NODE_PACKAGE.toString();
query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode());
query.addFilterField("_id.package", MongoQuEry.OP_IN,
filter.getSubscriberPackage());
}
您可以通过对常见条件进行分组来创建决策树,例如,如果每次 A 为真时您都希望执行方法 1(),而不是在每个 'if' 上编写此行代码其中 A 为真,您可以先检查 A 是否为真,然后执行此公共代码块,然后检查其他条件,例如:
而不是写作:
if(a && b) {
example.method1();
example.method2();
// more code 1
} else if(a && !b) {
example.method1();
// more code 2
} else if(!a && b) {
example.method2();
// more code 3
} else if(!a && !b) {
// more code 4
}
你可以这样写:
if(a) {
example.method1();
if(b) {
example.method2();
// more code 1
} else {
// more code 2
}
} else {
if(b) {
example.method2();
// more code 3
} else {
// more code 4
}
}
您的 collection 名称似乎具有基于过滤字段的模式,如果是这种情况,此方法可能会奏效。
Object marketFilter = filter.getAllMarket();
Object cmtsFilter = filter.getAllCmts();
Object packageFilter = filter.getAllPackage();
Object nodeFilter = filter.getAllNodes();
if(marketFilter != null){
query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket());
}
.
.
. upto filter N
String collectionName = getCollectionName(marketFilter, ... filter N)
/*
create a function getCollectionName(filter1, ... filterN)
in this function you can generate collection name by checking which
filters are not null.
*/
注意:- 只有当您的 collection 名称基于过滤器时,此方法才有效。
UI 上有 4 个不同的用户输入字段,例如 Multiselect 下拉菜单。用户可以提供不同的输入字段组合来缩小结果集。 (来自多 select 选项的 select all/few 选项)。
示例: 2 多select 选项
多项select 选项 A 具有元素{"10xyz1","11xyz1",...},
多项select 选项 B 具有元素{"xyz101","abc111",...}
2^2 种可能的输入组合(提示:二进制真值Table):
1) Select Multiselect 选项 A 中的所有元素 && Select Multiselect 选项 B 中的所有元素,
2) Select Multiselect 选项 A 中的所有元素 && Select Multiselect 选项 B 中的一些元素,
3) Select Multiselect 选项 A 中的几个元素 && Select Multiselect 选项 B 中的所有元素,
4) Select Multiselect 选项 A 中的几个元素 && Select Multiselect 选项 B 中的几个元素
注意:至少有一个元素必须select来自任一选项
我已经使用 if else 语句来实现我的逻辑(我有单独的 mongo 集合用于每个可能的 selection,对于 4 个字段,16 种可能的组合,所以 16 mongo集合),但问题是代码看起来非常丑陋,有很多 if-else 语句,而且如果在 UI 中添加了一个字段,那么我必须检查添加额外的条件语句。
目前条件 if-else 语句的数量为 2^N(其中 N 是 Multiselect 下拉输入字段的数量)。
代码片段:
private void constructQuery(MongoQuEry query, AnalysisFilter filter) { query.addFilterField("_id.operator", MongoQuEry.OP_EQUALS, "alpha"); query.addFilterField("_id.month_year", MongoQuEry.OP_IN, getListOfMonthYear(filter)); String collectionName; if (filter.getAllMarket() && filter.getAllCmts() && filter.getAllNode() && filter.getAllPackage()) { collectionName = CollectionNames.ME_USAGE_MONTH_YEAR.toString(); } else if (filter.getAllMarket() && filter.getAllCmts() && filter.getAllNode()) { collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_PACKAGE.toString(); query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage()); } else if (filter.getAllMarket() && filter.getAllCmts() && filter.getAllPackage()) { collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_NODE.toString(); query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode()); } else if (filter.getAllMarket() && filter.getAllCmts()) { collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_NODE_PACKAGE.toString(); query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode()); query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage()); } else if (filter.getAllMarket() && filter.getAllNode() && filter.getAllPackage()) { collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_CMTS.toString(); query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts()); } else if (filter.getAllMarket() && filter.getAllNode()) { collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_CMTS_PACKAGE.toString(); query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts()); query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage()); } else if (filter.getAllMarket() && filter.getAllPackage()) { collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_CMTS_NODE.toString(); query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts()); query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode()); } else if (filter.getAllMarket()) { collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_CMTS_NODE_PACKAGE.toString(); query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts()); query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode()); query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage()); } else if (filter.getAllCmts() && filter.getAllNode() && filter.getAllPackage()) { collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET.toString(); query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket()); } else if (filter.getAllCmts() && filter.getAllNode()) { collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET_PACKAGE.toString(); query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket()); query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage()); } else if (filter.getAllCmts() && filter.getAllPackage()) { collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET_NODE.toString(); query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket()); query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode()); } else if (filter.getAllCmts()) { collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET_NODE_PACKAGE.toString(); query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket()); query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode()); query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage()); } else if (filter.getAllNode() && filter.getAllPackage()) { collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET_CMTS.toString(); query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket()); query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts()); } else if (filter.getAllNode()) { collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET_CMTS_PACKAGE.toString(); query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket()); query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts()); query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage()); } else if (filter.getAllPackage()) { collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET_CMTS_NODE.toString(); query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket()); query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts()); query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode()); } else { collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET_CMTS_NODE_PACKAGE.toString(); query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket()); query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts()); query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode()); query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage()); } query.setCollection(collectionName); query.addGroupByFields("_id.operator", "_id.month_year"); query.addAliasAggregateField("count", MongoQuEry.AGGR_SUM, "subscriber_count"); int order = MongoQuEry.ORDER_ASC; query.addOrderByFields(order, "_id.month_year"); }
switch case
或 IIf
表达式怎么样?
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/switch
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/conditional-operator
switch case
会更清晰,将 if-else
内容分成函数:
void FunctionName()
{
collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_NODE_PACKAGE.toString();
query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode());
query.addFilterField("_id.package", MongoQuEry.OP_IN,
filter.getSubscriberPackage());
}
您可以通过对常见条件进行分组来创建决策树,例如,如果每次 A 为真时您都希望执行方法 1(),而不是在每个 'if' 上编写此行代码其中 A 为真,您可以先检查 A 是否为真,然后执行此公共代码块,然后检查其他条件,例如:
而不是写作:
if(a && b) {
example.method1();
example.method2();
// more code 1
} else if(a && !b) {
example.method1();
// more code 2
} else if(!a && b) {
example.method2();
// more code 3
} else if(!a && !b) {
// more code 4
}
你可以这样写:
if(a) {
example.method1();
if(b) {
example.method2();
// more code 1
} else {
// more code 2
}
} else {
if(b) {
example.method2();
// more code 3
} else {
// more code 4
}
}
您的 collection 名称似乎具有基于过滤字段的模式,如果是这种情况,此方法可能会奏效。
Object marketFilter = filter.getAllMarket();
Object cmtsFilter = filter.getAllCmts();
Object packageFilter = filter.getAllPackage();
Object nodeFilter = filter.getAllNodes();
if(marketFilter != null){
query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket());
}
.
.
. upto filter N
String collectionName = getCollectionName(marketFilter, ... filter N)
/*
create a function getCollectionName(filter1, ... filterN)
in this function you can generate collection name by checking which
filters are not null.
*/
注意:- 只有当您的 collection 名称基于过滤器时,此方法才有效。