Должны ли методы иметь те же предпосылки, что и методы, которые они вызывают?

StackOverflow https://stackoverflow.com/questions/4491693

  •  11-10-2019
  •  | 
  •  

Вопрос

Недавно у меня было несколько сценариев, в которых небольшие изменения в коде привели к изменению предварительных условий по нескольким классам, и мне было интересно, должен ли дизайн по контракту таким образом или нет.

public Goal getNextGoal() {
    return goalStack.pop();
}

Если goalStack.pop() имеет предварительное условие, что стек не пуст, а затем getNextGoal() Нужно явно иметь такое же предварительное условие? Похоже, что унаследование предварительных условий сделает вещи хрупкими, а переход на очередь или другую структуру изменит предварительные условия на getNextGoal(), это вызывающие абоненты, и это вызывающие абоненты. Но кажется, что не унаследование предварительных условий будет скрывать контракты и абонентов, а вызывающие абоненты не знали бы о предварительных условиях.

Итак, хрупкий код, в котором все вызывающие абоненты знают и наследуют предварительные условия и пост -кондиционирования кода, который они называют, или загадочный код, где вызывающие звонки никогда не знают, каковы более глубокие предварительные условия и пост -кондиционирования?

Это было полезно?

Решение

Это зависит от того, что делает ваш метод вызова. Важным вещью с предварительными условиями является то, что звонящий несет ответственность за выполнение предварительных условий.

Поэтому, если вызывающие абоненты вашего метода GetNextGoal должны нести ответственность за предоставление непустого стека, то вы действительно должны также установить предварительные условия на вашем методе GetNextGoal. Ясность предварительных условий является одним из огромных преимуществ договоров с кодами, поэтому я бы посоветовал вам поместить их во всех местах, где абоненты должны выполнить предварительные условия.


Если ваш код кажется хрупким, однако, Это может быть признаком того, что вам нужно рефакторировать какой -то код.

Похоже, что унаследование предварительных условий сделает вещи хрупкими, а переход на очередь или другую структуру изменит предварительные условия на GetNextGoal (), его вызывающие абоненты и его вызывающие абоненты.

Если вы выставите очередь вызывающим абонентам и измените ее позже (на другую структуру, как вы сказали), его вызывающие абоненты также должны будут измениться. Обычно это признак хрупкого кода.

Если бы вы разоблачили интерфейс вместо конкретной реализации очереди, ваши предварительные условия также могут использовать интерфейс, и вам не придется менять предварительные условия каждый раз, когда ваша реализация меняется. Таким образом, что приводит к менее хрупкому коде.

Другие советы

Исключения являются одним из решений, но, возможно, невозможным для вашей ситуации.

Документирование того, что происходит, если нет целей нормально. Это то, что делает Malloc () в C

Я не могу сказать, используете ли вы Java, C ++ или что -то еще, так как каждый язык может иметь немного более естественные способы для этого конкретного языка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top