Ваше предположение о том, что код является утечкой, может быть или не быть правдой в зависимости от языка, который вы используете. В коде C это может быть проблемой (особенно потому, что в C булево значение - это просто int, отличное от нуля или нуля), но в наиболее строго типизированных языках (например, проверка типа во время выполнения), если passwordCheck
переменная была объявлена как логическое значение, нет никакого способа назначить что-то еще этому. Фактически, все в if
предикате должно разрешаться до логического значения, используете ли вы логические операторы или просто используете значение. Если вам удалось привязать другой объект к passwordCheck
среде выполнения, то возникнет недопустимая исключительная ситуация приведения.
Простые конструкции if / else гораздо легче читать, чем конструкции if / if, и они менее подвержены непредвиденным проблемам, если кто-то попытается перевернуть конструкцию. Давайте возьмем тот же пример на секунду:
if(passwordCheck == false) {
denyAccess();
}
if(passwordCheck) {
letThemIn();
}
Смысл взаимоисключающих предложений, которые вы хотите выполнить выше, теряется. Вот что передает конструкция if / else. Две взаимоисключающие ветви исполнения, где всегда будет работать одна из них. Это важная часть безопасности - обеспечение того, чтобы letThemIn
после вашего звонка не было никакого способа denyAccess
.
Для ясности кода и обеспечения максимальной защиты критических секций они должны находиться внутри основного предложения ( if
части). Неподходящее поведение по умолчанию должно быть в альтернативном предложении ( else
часть). Например:
if(passwordCheck) {
letThemIn();
} else {
denyAccess();
}
ПРИМЕЧАНИЕ: работая с разными языками, я разработал привычку кодирования, которая помогает избежать вопроса "что если это строка?" По сути, это поставить константу на первое место в логическом выражении. Например, вместо проверкиpasswordCheck == false
я проверяю false == passwordCheck
. Это также позволяет избежать случайной проблемы присваивания, возможной в C ++. Используя этот подход, компилятор будет жаловаться, если я наберу =
вместо ==
. В таких языках, как Java и C #, компилятор будет рассматривать присвоение в предложении if как ошибку, но C ++ с радостью примет это. Вот почему я также склонен делать нулевую проверку сnull
первым.
Если вы регулярно меняете языки, очень полезно сначала поместить константу в первую очередь. Тем не менее, в моей команде это противоречит стандарту кодирования, и компилятор все равно решает эти проблемы. Это может быть трудным привычкой, чтобы сломать.