#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
инструкции? Но почему вы хотите избежать anif 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()
}
Ответ №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
объекты не находятся под вашим контролем, например, генерируются автоматически или сторонними классами.