Альтернатива операторам if-else или лучшему подходу - PullRequest
0 голосов
/ 15 мая 2018

В пользовательском интерфейсе есть 4 различных поля ввода пользователя, например выпадающий список Multiselect.Пользователь может предоставить различные комбинации полей ввода, чтобы сузить набор результатов.(Либо выберите все / несколько опций из опций множественного выбора).

Пример: 2 варианта множественного выбора

Вариант множественного выбора A с элементами {"10xyz1", "11xyz1", ...},

Вариант множественного выбора B с элементами {" xyz101 "," abc111 ", ...}

2 ^ 2 возможных комбинаций ввода (Подсказка: двоичныйТаблица истинности ):

1) Выберите ВСЕ элементы из варианта Multiselect A && Выберите ВСЕ элементы из варианта Multiselect B,

2) Выберите ВСЕ элементы из параметра Multiselect Option A && Выберите несколько элементовиз Multiselect Option B,

3) Выберите несколько элементов из Multiselect Option A && Выберите ВСЕ элементы из Multiselect Option B,

4) Выберите несколько элементов из Multiselect Option A && Выберите несколько элементов из MultiselectОпция B

Примечание: по крайней мере один элемент должен быть выбран из любой опции

Я использовал операторы if else для реализации моей логики (у меня есть отдельная коллекция монго для каждоговозможный выборна, для 4 полей, 16 возможных комбинаций, то есть 16 коллекций монго), но проблема в том, что код выглядит очень некрасиво с большим количеством операторов if-else, более того, если в пользовательский интерфейс добавлено еще одно поле, то я должен проверитьдобавить дополнительные условные операторы.

На данный момент количество условных операторов 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");

}

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Вы можете создать дерево решений, сгруппировав общие условия, например, если каждый раз, когда A истинно, вы хотите выполнить method1 (), вместо того, чтобы писать этот строковый код в каждом «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
     }
}
0 голосов
/ 16 мая 2018

Кажется, что имена вашей коллекции имеют шаблон, основанный на полях фильтра, в этом случае этот подход может работать.

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

ПРИМЕЧАНИЕ. - Этот подход будет работать, только если имена вашей коллекции основаны нафильтры.

0 голосов
/ 15 мая 2018

Как насчет 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());
}
...