2016-01-06 2 views
-2

Существует два типа групп - частные и общедоступные. Каждая группа может иметь в ней членов. У меня есть три параметра id, includePrivate, includePublic, которые должны быть переданы в метод для возврата групп в соответствии с приведенными ниже правилами. Для примера.Сложная if/else логика в java с несколькими переменными

public List<Group> getListofGroups(String id, Boolean isPrivate, Boolean isPublic){} 
  1. Всех группы {}
  2. всех частных группы { "includePrivate": True}
  3. всех общественных групп { "includePublic": истина}
  4. всех частных групп с членством { "ID ":" ID1" , "includePrivate": истинный}
  5. все частные группы с членством + все общественные группы { "ID": "ID1", "includePrivate": правда, "includePublic": истинный}

Каков наилучший способ реализации этой сложной логики if/else? Это хороший вариант для создания механизма правил только для этого api?

For eg. if(isPrivate && isPublic && id=!null) { 
    return publicAndPrivateWIthMembership(); 
} else if(isPrivate && id=!null) { 
    return privateGroupsWithMembership(); 
} else if((isPublic && !isPrivate) ||(isPublic && isPrivate == null)) { 
    return allPublicGroups(); 
} else if((isPrivate && !isPublic) ||(isPrivate && isPublic == null)) { 
    return allPrivateGroups(); 
}........ 
+2

Это довольно непонятно, о чем вы просите, но это не выглядит таким сложным. Вы пытались просто написать это как несколько операторов if/else? –

+0

Я добавил несколько контекстов проблемы. Кроме того, каждая из этих переменных также может быть нулевой, что приводит к сложности. –

+0

@MeghashyamSandeepV, пожалуйста, обновите код в своем вопросе, чтобы он был более читабельным. – Atri

ответ

1

Что-то вроде этого, не так уж сложного, предполагая нуль означает ложь:

public List list(String id, Boolean includePrivate, Boolean includePublic) { 
    boolean inclPrivate = (includePrivate != null && includePrivate); 
    boolean inclPublic = (includePublic != null && includePublic); 
    List result = new ArrayList(); 
    if (inclPublic || ! inclPrivate) 
     result.addAll(getAllPublic()); 
    if (inclPrivate && id != null) 
     result.addAll(getPrivateMembers(id)); 
    else if (inclPrivate || ! inclPublic) 
     result.addAll(getAllPrivate()); 
    return result; 
} 

конечно, если вы на самом деле запрашивая базу данных, вы можете динамически построить пункт WHERE, но так как вы не говорите ....

+0

Булева переменная также может быть нулевой. Как это объяснить? –

+0

@MeghashyamSandeepV вы делаете параметры 'Boolean' вместо' boolean' и проверяете, являются ли их значения 'null 'или нет в условиях. –

+0

@MeghashyamSandeepV Обновлено для поддержки нулевых параметров 'Boolean'. – Andreas

0

Вы можете использовать парадигму «нулевые средства не заботятся». Что-то вроде:

private List<Group> groups; 

public List<Group> getGroups(String id, Boolean includePrivate, Boolean includePublic) { 
    return groups.stream() 
     .filter(g -> id == null || g.getId().equals(id)) 
     .filter(g -> includePrivate == null || g.isPrivate() == includePrivate) 
     .filter(g -> includePublic== null || g.isPublic() == includePublic) 
     .collect(Collectors.toList()); 
} 

выше делает AND логики. Если вы хотите OR логика, сделайте это в одном фильтре:

public List<Group> getGroups(String id, Boolean includePrivate, Boolean includePublic) { 
    return groups.stream() 
     .filter(g -> (id == null || g.getId().equals(id))) || 
      (includePrivate == null || g.isPrivate() == includePrivate)) || 
      (includePublic== null || g.isPublic() == includePublic))) 
     .collect(Collectors.toList()); 
} 

или отложить предикат вызывающих для полностью гибкого API:

public List<Group> getGroups(Predicate<Group> predicate) { 
    return groups.stream().filter(predicate).collect(Collectors.toList()); 
} 
Смежные вопросы