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