Я думаю, это легче увидеть на диаграмме классов. Как видите, действительно существует круговая зависимость между Sheet
конкретным классом и Expr
интерфейсом. Я бы не сказал, что это ОЧЕНЬ плохо, потому что я считаю, что круговая зависимость между двумя конкретными классами является наихудшей ... тем не менее, делать это, по возможности, не рекомендуется.
Ваш код
Итак, возможно, один из способов, с помощью которого вы можете подумать о рефакторинге, это заставить ваш AddressExpr
зависеть от SuperSheet
вместо Sheet
и Expr
от SuperSheet
вместо Sheet
: -
public class AdressExpr implements Expr {
private Address address;
private SuperSheet sheet;
public double value(SuperSheet sheet) {
return sheet.value(address);
}
}
public interface Expr {
public double value(SuperSheet sheet);
}
...
...
... и это удалит все нежелательные циклические зависимости.
Возможный исправленный код
ПРИМЕЧАНИЕ : Я не имею в виду, что это решение. Я просто говорю, что вы, безусловно, можете найти способы реорганизации вашего кода для минимизации или удаления циклических зависимостей, потому что циклические зависимости затрудняют ваш код для модульного тестирования. Кодирование на основе интерфейсов всегда помогает удалить нежелательные циклические зависимости. Это также облегчит ваш код для модульного тестирования, потому что вы можете легко макетировать объекты.