简体   繁体   English

替代if-else语句或更好的方法

[英]Alternative to if-else statements or better approach

There are 4 different user input fields like Multiselect Drop downs on the UI. UI上有4个不同的用户输入字段,例如Multiselect Drops。 The user can provide different combinations of input fields to narrow the result set. 用户可以提供输入字段的不同组合以缩小结果集。 (Either select all/few options from the multi-select options). (从多选选项中选择全部/很少选项)。

Example: 2 Multiselect options 示例:2个多选选项

Multiselect Option A having elements{"10xyz1","11xyz1",...}, 具有元素{“ 10xyz1”,“ 11xyz1”,...}的多选选项A,

Multiselect Option B having elements{"xyz101","abc111",...} 具有元素{“ xyz101”,“ abc111”,...}的多选选项B

2^2 possible input combinations(Hint: Binary Truth Table ): 2 ^ 2种可能的输入组合(提示:Binary Truth Table ):

1) Select ALL elements from Multiselect Option A && Select ALL elements from Multiselect Option B, 1)从多重选择选项A中选择所有元素&&从多重选择选项B中选择所有元素,

2) Select ALL elements from Multiselect Option A && Select few elements from Multiselect Option B, 2)从多重选择选项A中选择所有元素&&从多重选择选项B中选择一些元素,

3) Select few elements from Multiselect Option A && Select ALL elements from Multiselect Option B, 3)从Multiselect选项A中选择少量元素&&从Multiselect Option B中选择所有元素,

4) Select few elements from Multiselect Option A && Select few elements from Multiselect Option B 4)从Multiselect选项A中选择一些元素&&从Multiselect Option B中选择一些元素

Note: At least one element must be selected from either options 注意:必须从这两个选项中至少选择一个元素

I have used if else statements to implement my logic(I have separate mongo collection for each possible selection, for 4 fields, 16 possible combinations, so 16 mongo collections), but the problem is the code looks very ugly with a lot of if-else statements moreover over if there is one more field added to the UI then I have to check add additional conditional statements. 我已经使用if else语句来实现我的逻辑(我对每个可能的选择都有单独的mongo集合,对于4个字段,有16个可能的组合,所以有16个mongo集合),但是问题是代码看起来非常难看,如果有if-如果没有另外一个字段添加到UI,则else语句还要检查添加其他条件语句。

For now the number of conditional if-else statements is 2^N (Where N is the number of Multiselect drop-down input fields). 目前,条件if-else语句的数量为2 ^ N(其中N是“多选”下拉输入字段的数量)。

Code Snippet: 代码段:

  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"); } 

You can create a tree of decisions, by grouping common conditions, for example, if every time A is true you would like to execute the method1(), instead of write this line code on each 'if' where A is true, you can first check if A is true, then execute this common block of code, then check other conditions, like : 您可以通过对常见条件进行分组来创建决策树,例如,如果每次A为true时,您都想执行method1(),而不是在A为true的每个'if'上编写此行代码,则可以首先检查A是否为真,然后执行此通用代码块,然后检查其他条件,例如:

instead of Writing: 而不是写作:

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
}

you could write: 你可以这样写:

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
     }
}

Your collection names seems to have a pattern based on the filter fields, if that's the case this approach may work. 您的集合名称似乎具有基于过滤器字段的模式,如果是这种情况,这种方法可能会起作用。

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.
*/

NOTE :- This approach will work only if your collection names are based on the filters. 注意:-仅当您的集合名称基于过滤器时,此方法才有效。

How about switch case or IIf expression? switch caseIIf表达式如何?

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/switch https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/switch

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/conditional-operator https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/operators/conditional-operator

switch case would be more legible, and separating the if-else contents into functions: 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());
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM