Защитное программирование, для меня, означает написание кода для обработки случаев, которые, как вы думаете, не произойдут или даже могут произойти, потому что вы уверены, что ваши собственные убеждения ненадежны.
Например (не скомпилировано или протестировано, применяются условия):
private String findSmallestString(Collection<String> strings) {
if (strings == null || strings.isEmpty()) return null;
Iterator<String> stringsIt = strings.iterator();
try {
String smallestString = stringsIt.next();
while (stringsIt.hasNext()) {
String candidateString = stringsIt.next();
if (candidateString == null) continue;
if (candidateString.compareTo(smallestString) < 0) {
smallestString = candidateString;
}
}
return smallestString;
}
catch (NoSuchElementException e) {
return null;
}
}
Там, возможно, защитные функции включают в себя:
- Пустое или охранное предложение вверху; это закрытый метод, поэтому вы должны быть уверены, что он никогда не будет вызываться с пустой или пустой коллекцией
- Try-catch для NoSuchElementException; вы можете доказать, что содержащийся в нем код никогда не вызовет это исключение, если итератор выполнит свой контракт.
- Предложение защиты от недействительности для строк (кроме первой!), Выходящих из итератора; опять же, поскольку это закрытый метод, вы, вероятно, должны быть в состоянии убедиться, что параметр коллекции не содержит нулей (и что бы вы делали, добавляя пустые значения в коллекции в любом случае?)
Не все согласны с тем, что нулевые проверки являются защитными. Попытка поймать до такой степени, что она совершенно бессмысленна.
Для меня кислотный тест защитного программирования состоит в том, что вы не думаете, что защита когда-либо будет использоваться.