Может ли Проектирование по контракту (DbC) быть способом защитного программирования?
Является ли один способ программирования лучше в некоторых случаях, чем другой?
Может ли Проектирование по контракту (DbC) быть способом защитного программирования?
Является ли один способ программирования лучше в некоторых случаях, чем другой?
Ответы:
Проектирование по контракту и защитное программирование в некотором смысле противоположны друг другу: в DbC вы определяете контракты между соавторами и программируете в предположении, что соавторы соблюдают свои контракты. В защитном программировании вы программируете, предполагая, что ваши сотрудники нарушают свои контракты.
Подпрограмма реального квадратного корня, написанная в стиле DbC, в контракте утверждает, что вы не можете передавать отрицательное число, а затем просто предполагает, что она никогда не встретит отрицательное число. Реальная процедура квадратного корня, написанная с защитой, предполагает, что ей передано отрицательное число, и принимает соответствующие меры предосторожности
Примечание: конечно, возможно, что в DbC кто-то еще проверит контракт. Например, в Eiffel система контрактов проверяет наличие отрицательного числа во время выполнения и выдает соответствующее исключение. В Spec # средство проверки теорем проверит наличие отрицательных чисел во время компиляции и завершит сборку, если не сможет доказать, что подпрограмма никогда не получит отрицательное число. Разница в том, что программист не делает эту проверку.
Может ли Проектирование по контракту (DbC) быть способом защитного программирования?
Да.
«Оборонительное программирование» часто является поводом тратить время. Часто тратится время на проверку вещей, которые вызовут обычные исключения. Вместо исключений вместо операторов обработки исключений пишутся дополнительные операторы IF.
Определите договор и покончите с ним.
Когда кто-то нарушает контракт, программа - в нормальном ходе событий - ломается и вызывает обычные исключения, которые обычно обрабатываются.
Можно показать, что «Защитное программирование» и «Предотвращение ошибок» добавляют ошибки (потому что проверки предотвращения ошибок сами по себе ошибочны), а не предотвращают ошибки.
Обработка исключений может заставить замолчать, регистрировать и обрабатывать исключение гораздо лучше, чем «Защитное программирование».