2013-05-01 3 views
2

Предпосылки и постусловия публичного метода образуют договор между этим методом и его клиентом.Должно ли клиент проверить постусловие/должен был вызвать предварительное условие проверки метода?

to 1. Согласно, абонент не должен проверить Постусловие и называемый метод не должен проверить предпосылки:

Давайте вспомним предусловие и постусловие квадрата root function sqrt, как показано в программе 49.2. Функция, которая вызывает sqrt, несет ответственность за передачу неотрицательного числа в функцию. Если передано отрицательное число, функция квадратного корня должна делать , чтобы ничего не поделать. Если, с другой стороны, неотрицательное число передается в sqrt, то ответственность за выполнение postcondition несет sqrt для доставки . Таким образом, вызывающий абонент sqrt ничего не должен делать, чтобы проверить или исправить результат.

Виноват абонент, если условие операции не удается Виновата вызываемая операция, если постусловие операции не удается

Но, как видно из кода, включенные в another article, называемого метод делает проверить предпосылку :

/// <summary>Gets the user for the given ID.</summary> 
public User GetUserWithIdOf(int id, 
     UserRepository userRepository) { 
    // Pre-conditions 
    if (userRepository == null) 
     throw new ArgumentNullException(
      "userRepository"); 
    if (id <= 0) 
     throw new ArgumentOutOfRangeException(
      "id must be > 0"); 

    User foundUser = userRepository.GetById(id); 

    // Post-conditions 
    if (foundUser == null) 
     throw new KeyNotFoundException("No user with " + 
      "an ID of " + id.ToString() + 
      " could be located."); 

    return foundUser; 
} 

а) Поскольку это ответственность в клиента к е Предположим, что условия метода, должен по методу также проверить, выполнены ли предварительные условия?

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

2.One из преимуществ, упомянутых в первой статье, что «Предпосылки и постусловия могут быть использованы, чтобы разделить ответственность между классами в ООП», что я понимаю, как и говорил, что это не ответственность вызванный метод для проверки предварительных условий и не является ответственным лицом для проверки postcondition.

Но не придерживаясь такой философии сделать наш код более уязвимым, так как он слепо верит, что другая сторона (другая сторона является либо абонентом или методом) будет выполнять свои обещания?

3.Если абонент/называемый метод не слепо доверять другой стороне, то не мы теряем большую часть преимуществ, предоставляемых постусловий и предпосылок, поскольку теперь называемый метод должен взять на себя ответственность также проверить предпосылку и звонящий должен взять на себя ответственность за проверку постусловия?

благодаря

EDIT

3.

Если абонент/называемый метод не слепо доверять другой стороне, то не мы теряем большую часть преимуществ предоставляемые постоперациями и предварительных условий, так как теперь называемый метод должен взять на себя ответственность , чтобы также проверить precon dition и caller должны взять на себя ответственность за проверить условие postcondition?

Caller не должен проверять пост-условия, так как они должны быть , обеспечиваемые вызываемым методом. Вызываемый метод должен подтвердить предварительные условия , потому что нет другого способа обеспечить выполнение контракта.

а) Вы предположив, что Постусловие должны только когда-либо состояние/гарантировать, что значение возврата имеет указанного типа или null (если значение возвращение является обнуляемым)? Кроме того, что ввести возвращаемое значение будет, могут не постусловий также указать и другие вещи (которые не могут быть проверены с помощью системы типа), как ли возвращаемого значения находится в пределах указанного диапазона (например: может 't postcondition также заявить, что возвращаемое значение типа int будет в диапазоне 10-20)? Не было бы в этом случае клиенту также необходимо проверить на постусловие?

б) Можно ли тогда сказать, что первая статья неправильно с его утверждает, что называемый метод не должен проверять предпосылки?

2. EDIT

Нет, пост условие может быть что угодно, а не только нулевой чек. Либо способ, клиент может предположить, что пост-условие было подтверждено , так что, например, вам не нужно проверять интервал int, если договор заявляет, что он был обеспечен.

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

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

ответ

2

а) Так как это является обязанностью клиента выполнить предпосылки метода, следует назвать метод также проверить, выполнены ли предпосылки?

Да, клиент несет ответственность за соблюдение предварительных условий, однако вызываемый метод должен проверить это, а значит, и нулевые проверки в примере.

б) Так как это отвечает вызываемый метод, чтобы доставить результат который выполняет постусловие, если вызывающий абонент проверить постусловие?

Вызывающий абонент должен быть в состоянии зависеть от договора вызываемого метода. В приведенном примере метод GetUserWithIdOf обеспечивает выполнение пост-условия, иначе исключая исключение. Сам репозиторий не имеет пост-состояния, что он всегда будет возвращать пользователя, так как пользователь может не найти его.

2.One из преимуществ, упомянутых в первой статье, что «Предпосылки и постусловия могут быть использованы, чтобы разделить ответственность между классами в ООП», которые я понимаю, как и говорим, что это не ответственность вызванного метода для проверки условий и не является обязанностью вызывающего абонента подтвердить состояние .

По-прежнему ответственность за вызываемый метод заключается в проверке предварительных условий, поскольку они обычно не могут быть проверены системой типов. Языки, такие как Eiffel, обеспечивают большую степень статической проверки контрактов, и в этом случае можно использовать язык для принудительного применения предварительных условий. Как и в Java/C#, вы можете обеспечить, чтобы параметр метода имел заданный тип, Eiffel расширяет этот тип проверки до более сложных объявлений контракта.

Но не придерживаясь такой философии сделать наш код более уязвимой, так как она слепо доверяет, что другая сторона (другая сторона является либо вызывающего абонента или метод) будет выполнять свои обещания?

Да, поэтому предварительные условия должны быть проверены.

3.Если вызывающего абонента/вызывается метод не слепо доверять другой стороне, то не мы теряем большую часть преимуществ, предоставляемых постусловий и предпосылок, так как теперь называется метод должен взять на себя ответственность также проверьте предварительное условие, и вызывающий должен взять на себя ответственность за проверить условие postcondition?

Caller не должен проверять пост-условия, потому что они должны обеспечиваться вызываемым методом. Вызываемый метод должен проверять предварительные условия, потому что нет другого способа обеспечить выполнение контракта.

UPDATE

а) Нет, пост условие может быть что угодно, а не только нулевой чек. В любом случае клиент может предположить, что пост-условие было проверено, так что, например, вам не нужно проверять интервал int, если в контракте указано, что оно было обеспечено.

b) Я бы так сказал. Цитируйте:

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

Если предлагает, что вызываемый метод уже выполняет некоторую проверку. Ничего не делать - это молчаливый провал, который может быть anti-pattern.

Последующая цитата:

Виноват абонент, если условие операции не удается Виновата под названием операции, если постусловие операции не удается

Единственного способа обвинить вызывающую для неудачное предварительное условие заключается в том, чтобы сначала определить, что предварительное условие потерпело неудачу. Поскольку вызываемый метод «владеет» этим предварительным условием, он должен быть последней остановкой, чтобы отметить отказ.

ОБНОВЛЕНИЯ 2

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

+0

Прочтите исправленное мной письмо – EdvRusj

+0

Если вы можете, прочитайте мое второе обновление – EdvRusj

+0

Это разумный аргумент. Но если ваш код называется методом класса, написанным каким-то новичком-программистом, доверяете ли вы вызываемому методу (т. Е. Доверяете этому программисту-новичку) выполнять обещанные постусловии или доверяете ли вы (т.е. вы, вызывающий, не проверяете постусловия) только в методах, написанных «выдержками»? – EdvRusj