Это хорошо или плохо перестраховаться? - PullRequest
1 голос
/ 08 октября 2010

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

Пример (в своего рода C # -подобном псевдокоде с передачей аргументов по ссылке):


doSomething(vector v) {
  ...;
  v.clear;
  useCleanVector(v)
}

useCleanVector(vector v) {
  if(!v.isClean) v.clear;
  ...
}

Ответы [ 4 ]

4 голосов
/ 08 октября 2010

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

/**
 * precondition : id must be the id of a flarg.
 * 
 * myfunc will return -1 if value is outside the valid 0-10 range.
 */
int myfunc( int id, int value );

Это позволяет мне кодировать что-то вроде этого

 int flarg_id = ...
 if (! is_flarg( flarg_id ) ) { printf("Bad flarg"); exit(1); }
 int value = ...
 int rv = myfunc( flarg_id, value );
 if( rv == -1 )  { printf("Bad value"); exit(1); }
1 голос
/ 08 октября 2010

Есть избыточность (часто хорошая), и есть повторение.

Чтобы позаимствовать из примера Джоша, если функция Foo гарантирует, что она очищает вектор, нет причины очищать его заранее.Доверяйте и проверяйте гарантии, предоставляемые вашим API.

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

0 голосов
/ 08 октября 2010

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

Причина?Когда кто-то приходит за вами через n месяцев, он не собирается следовать вызовам функций до последнего пункта.Убедиться, что каждая функция защищена сама по себе, поможет устранить глупые ошибки или, еще хуже, ошибки, которые трудно отследить.

0 голосов
/ 08 октября 2010

Я бы сказал, что это дурной тон.Не ужасная форма, но такая же форма, которая приводит к этому:

 v.clear(); // clear the vector to be safe. 
 v = v2;

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

Лучше понять, что функция проверяет, а что нет, и использовать ее соответствующим образом.

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