Недавно я читал книгу «Чистый код» Роберта Мартина, и в главе 7 был раздел, где он сказал, что вы должны попытаться заменить нулевые проверки, используя специальный шаблон разработки случая. Я подумал, что это отличная идея, но потом подумал о следующем примере.
foreach(thing in someCollection) {
value = getValue();
if(value == null) {
break;
}
value.doSomething();
}
Вы можете сделать так, чтобы объект, возвращаемый getValue
, был полиморфным, создать интерфейс с принудительным применением метода doSomething()
и реализовать его для объекта, который вы хотите вернуть, и класс «mock» для специального случая ( если значение равно нулю). Это исключило бы необходимость в выражении gaurd, поскольку на самом деле не имеет значения, вызывается ли doSomething()
для нашего «фиктивного» объекта, поскольку это фактический объект, имеющий метод doSomething()
:
function doSomething(){
return;
}
Единственная проблема в том, что цикл не прерывается. Насколько я могу судить, нет способа вырваться из цикла с использованием полиморфного класса, если возвращается «фиктивный» объект, если только у вас нет проверки на фиктивный объект, но тогда это побеждает точку.
У меня вопрос: есть ли чистый способ иметь дело с нулями, которые не влекут за собой эти вычислительные потери? Или я что-то неправильно понимаю о том, что сказано в главе 7 о проверках на ноль?