Наше приложение построено несколько вокруг Context класса со многими примитивными полями и булевы Контекст пропускают вокруг почти весь поток, и решения принимаются на основе логических флагов. Теперь, чтобы реализовать новую функциональность, в контекст добавлено новое логическое значение, и его нужно проверить в 10 разных местах. Общий поток имеет структуру, подобную этому примеру.Refactor булево на основе потока
public void handle(context) {
if (context.isBig())
drawBigThing(context)
else
drawSmallThing(context)
//more code
...... handleColor(context) //somewhere deeper in the flow/stack
}
private void handleColor(context) {
if (context.isBig())
takeMoreColor(context.getColor())
else
takeLessColor(context.getColor())
}
Как вы видите в разных частях кода, мы оглядываемся на один и тот же флаг, но принимаем различные решения на его основе. Теперь, если я добавлю context.isVeryBig(), вы можете увидеть, как это может взорваться.
Каковы некоторые идеи (по инструментам java 8) для рефакторинга булевского флага, который запрашивается из методов/классов с разными обязанностями, но все еще интересуется одним и тем же флагом?
Одна из идей заключалась бы в том, чтобы сделать контекст более умным, а не содержать логические флаги, но государство/стратегию для каждой из обязанностей, но это устраняет обязанности в контексте (может быть, каким-то образом они могут быть отделены?), Я все равно имеют IFs, но по крайней мере они будут сгруппированы в одном месте и до начала потока
А) да , вам лучше избавиться от такого подхода. У вас в основном много глобального состояния, и прямой доступ к полям не делает его лучше. B) State и Statemachine, а полиморфизм - это «общие» ответы в OO здесь. – GhostCat
См. Https://sourcemaking.com/refactoring/smells/switch-statements, который относится к вашему делу IMO. – JnRouvignac