Как избежать если - PullRequest
       1

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

1 голос
/ 17 апреля 2019

У меня есть объект Request с полем request_type и количеством других полей.Аргумент request_type может представлять собой «AdditionalRequest», «DeletetionRequest», «InformationRequest».На основании request_type другие поля в объекте Request обрабатываются по-разному.

Мой простой подход:

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

Как я могу избежать этого, если утверждения и все еще применяют правильный алгоритм?

Ответы [ 5 ]

4 голосов
/ 17 апреля 2019

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

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

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

Result result = parsers.get(request.request_type).apply(request);
0 голосов
/ 17 апреля 2019

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

Что-то вроде

public interface Request {
    Response apply();
}

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

0 голосов
/ 17 апреля 2019

Мне кажется, что здесь может пригодиться шаблон командования. Если вы создаете объектную структуру этих команд и инкапсулируете алгоритм, который вы хотите выполнить внутри объекта, то вы можете создать конкретные подобъекты, а затем использовать метод «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

0 голосов
/ 17 апреля 2019

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

Пример:

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

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

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

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

0 голосов
/ 17 апреля 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...