У меня недавно было несколько сценариев, когда небольшие изменения в коде приводили к изменению предварительных условий для нескольких классов, и мне было интересно, должен ли проект по контракту быть таким или нет.
public Goal getNextGoal() {
return goalStack.pop();
}
Если у goalStack.pop()
есть предварительное условие, что стек не пустой, то нужно ли getNextGoal()
явно иметь такое же предварительное условие?Кажется, что наследование предусловий сделало бы вещи хрупкими, а переход в очередь или другую структуру изменил бы предусловия на getNextGoal()
, его вызывающих и вызывающих абонентов.Но кажется, что не наследование предварительных условий скрыло бы контракты, и вызывающие абоненты, и вызывающие абоненты, не знали бы о предварительных условиях.
То есть хрупкий код, когда все вызывающие абоненты знают и наследуют предусловия и постусловия кода, который они вызывают, или таинственный код, когда вызывающие абоненты никогда не знают, какие более глубокие предусловия и постусловия есть?