Как я могу реорганизовать этот длинный метод устаревшего кода Java, загруженного побочными эффектами, в более чистую версию?Необязательно вызывать побочные эффекты в чистой функции
public Result nonPureMethod(String param1, String param2){
this.current_status = "running";
String s1 = step1(param1, param2);
this.logger.log("About to do step 2, this could take while");
String s2 = step2(s1);
this.logger.log("Completed step 2");
String s3 = step3(s2);
this.notifyOtherObject(s3);
if (this.UserPressedEmergencyStop){ this.current_status = "stopped"; return; }
String s4 = step4(s3);
this.current_status = "completed";
this.saveFile(s4);
return new Result(s4);
}
В производстве все эти побочные эффекты должны бежать. Однако иногда я хочу, чтобы вызвать «чистую» версию этого метода, который будет выглядеть примерно так:
public static Result pureMethod(String param1, String param2){
String s1 = step1(param1, param2);
String s2 = step2(s1);
String s3 = step3(s2);
String s4 = step4(s3);
return new Result(s4);
}
Примечания: Я не хочу, чтобы поддерживать два метода. Если возможно, я хотел бы иметь его. Кроме того, я хотел бы иметь возможность опционально иногда иметь некоторые побочные эффекты, такие как ведение журнала, но не другие. Каков наилучший способ рефакторинга этого кода, чтобы я мог его назвать и, возможно, иногда имел побочные эффекты, а иногда и нет?
В настоящее время я использую Java 8, но я думаю, что эта проблема довольно общая. До сих пор я думал о двух подходах к решению проблемы. Во-первых, я мог бы передать логическое значение методу: «runSideEffects». Если false, просто пропустите код, который запускает побочные эффекты. Альтернативным и более гибким решением было бы изменить функцию, требуя функции лямбда, переданные в качестве параметров, и вызывать их вместо вызова побочных эффектов. Например, в качестве параметра можно передать такой метод, как «void log (String msg)». Производственный вызов метода может передать функцию, которая будет записывать сообщение в регистратор. Другие вызовы могут передавать метод, который фактически ничего не делает при вызове журнала (msg). Ни одно из этих решений не чувствует себя прекрасно, поэтому я прошу сообщество предложить предложения.
Я не вижу, где ничего нового в Java 8 действительно поможет вам с этим методом. То, что вы предлагаете, - это [шаблон страха] (https://en.wikipedia.org/wiki/Strategy_pattern), где побочные эффекты против побочных эффектов = стратегии. Это то, что вы могли бы сделать все время (и я не могу себе представить, что это сделает ваш код лучше tbh) – zapl
Имея две реализации, определенно, способ пойти (как это предложил @zapl). Но вам нужно, чтобы сохранить статус и сохранить файл правильно? – TriCore
Кроме того, прочитайте Эффективный элемент Java «Стремитесь к отказу от атомарности». У этого есть несколько советов по организации кода для минимизации сбоев, которые могут оставить вещи в противоречивом состоянии. –