Как избежать, если

#java #oop

#java #ооп

Вопрос:

У меня есть объект запроса с полем request_type и количеством других полей. request_type может быть ‘additionRequest’, ‘deletionRequest’ ‘informationRequest’. На основе request_type другие поля в объекте запроса обрабатываются по-разному.

Мой простой подход заключается в

 if additionRequest
algorithm1
else if deletionRequest
algorithm2
else if deletionRequest
algorithm3
end
  

Как я могу избежать этих операторов if и при этом применять правильный алгоритм?

Комментарии:

1. Как насчет switch инструкции? Но почему вы хотите избежать an if statement ?

2. request_type не должен быть частью объекта запроса. В зависимости от того, куда вы «отправляете» запрос, он должен быть отправлен в соответствующую конечную точку / функцию для addition , deletion и information .

3. Это Request ваш собственный объект? Если это так, вы можете использовать полиморфизм, чтобы иметь AdditionalRequest , DeletionRequest и InformationRequest . Или, в качестве альтернативы, должно request_type быть перечисление, в котором также есть алгоритм.

4. Я использую java 8, и причина, по которой я хочу избегать операторов if, заключается в том, что другие люди в команде говорят, что это неправильный OO-код.

Ответ №1:

Если вы хотите избежать условных операторов, вы можете использовать объектно-ориентированные функции, такие как:

 Map<String, Function<Request, Result>> parsers = new HashMap<>();

parsers.put("additionRequest", request -> {
  // parse and generate Result here
  return resu<
});

Result result = parsers.get(request.request_type).apply(request);
  

Ответ №2:

Мне кажется, что, возможно, здесь может пригодиться шаблон Command. Если вы создадите объектную структуру из этих команд и инкапсулируете алгоритм, который хотите выполнить внутри объекта, то вы можете создать конкретные подобъекты, а затем использовать метод «execute» команды для вызова алгоритма. Просто убедитесь, что вы используете полиморфные ссылки:

 if additionRequest
  algorithm1
else if deletionRequest
  algorithm2
else if deletionRequest
  algorithm3
end
  

станет

 void theRequestExecutor(Reqest req) {
    req.executeAlgorithm()
}
  

https://en.wikipedia.org/wiki/Command_pattern

Ответ №3:

Используйте HashMap<RequestType, RequestHandler> для этого случая. RequestHandler может быть интерфейсом, который будет реализован для каждой ситуации, которую вы хотите обработать.

Надеюсь, это поможет.

Ответ №4:

Вы можете создать сопоставление ключа: строки, значения: функции RequestType ReturnType . В зависимости от типа запроса он вызовет соответствующую функцию.

Пример:

   Map<String, Function<RequestType, ResponseType> requestProcessors = new HashMap<>;
  requestProcessors.add("additionRequest", this::methodToHandleAddRequest);
  requestProcessors.add("deletionRequest", this::methodToHandleDeleteRequest);
  

Внутри обработчика запроса выполните

  return this.requestProcessors.get(request.request_type).apply(request);
  

Обратите внимание, что вам может потребоваться создать интерфейс ответа, если разные ответы отличаются. Другой тип ответа будет наследоваться от интерфейса ответа

Ответ №5:

Объектно-ориентированное решение всегда должно включать логику с данными. В этом случае включите все, что вы хотите, чтобы запрос выполнял в самом объекте запроса, вместо (предположительно) передачи чистых данных.

Что-то вроде

 public interface Request {
    Response apply();
}
  

Все остальное, например, создание карты функций, создание тонкого слоя абстракции или применение некоторого шаблона, является обходным путем. Они подходят только в том случае, если первое решение не может быть применено. Это может иметь место, если Request объекты не находятся под вашим контролем, например, генерируются автоматически или сторонними классами.