Чья ответственность должна быть для проверки предварительных условий? - PullRequest
0 голосов
/ 13 октября 2018

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

Соглашение выглядит примерно так: «если вызывающая сторонаобеспечивает выполнение предварительных условий функции, тогда она будет вести себя ожидаемым образом и / или будет возвращать ожидаемые значения. "

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

Что касается наилучшего подхода к архитектуре и дизайну программного обеспечения?

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Как говорил Нил, проверка является обязанностью звонящего.Вы сказали:

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

Чтобы описать, почему это не идеальный подход, я остановлюсь наПример Нейла, в котором использовалась проверка на нулевые указатели, передаваемые strlen, представляет два сценария:

  1. Функция, которая вызывает strlen, предварительно проверяет ввод.
  2. strlen проверяетсвои аргументы внутренне, прежде чем оперировать ими.

Нет никакой разницы в эффективности между этими двумя методами, если вы делаете один вызов strlen.Однако представьте, что вместо одного вызова strlen вы вызываете strlen, strstr и другие строковые функции несколько раз подряд.В сценарии 1, независимо от того, совершаете ли вы 1, 2, 10 или 100 вызовов функций из строковой библиотеки, вы должны проверять наличие неправильных входных данных только один раз.В сценарии 2 каждый вызов вынужден проверять ввод, что значительно замедляет процесс.

0 голосов
/ 13 октября 2018

Это ответственность звонящего.Например, что может сделать реализация strlen, если передан нулевой указатель?Единственное, что он может сделать, - это прервать программу - что является жизнеспособным, хотя и радикальным вариантом в C. В C ++ он может вызвать исключение (но не в том случае, если он соответствует стандарту C ++), но работа с этим исключением будет оченьсложно.Таким образом, единственное разумное решение, которое позволяет программе продолжать работу в известном состоянии, заключается в том, чтобы strlen не вызывался с нулевым указателем в качестве параметра, что возлагает ответственность за проверку этого на вызывающий код.

...