Является ли производительность даже проблемой?
Краткий ответ: Производительность по проверке нулей никогда не будет проблемой в обычном приложении. Это только вопрос читаемости и ремонтопригодности.
Производительность:
Да, у вас есть 3 "явные" чеки против 1. Но вы должны иметь в виду, что:
- Система выполняет операцию "неявное" null-check каждый раз, когда вы ссылаетесь на экземпляр объекта, как объясняется here, а afaik JIT не оптимизирует нулевые проверки вообще. Таким образом, в вашем случае ставка не равна 3 от 1.
- Нулевая проверка - очень (действительно, очень) дешевой операцией по сравнению с большинством операций, которые вы выполняете в обычном потоке программного обеспечения (распределение кучи экземпляра, математическое вычисления, запрос linq, рендеринг графического объекта, синтаксический анализ строк, ...).
Я вижу лишь отдаленную возможность существенных отличий производительности: если child
или Mother
или Father
не являются локальными переменными или простые простые свойства, но методы и свойства с очень долго время выполнения.Например, метод GetChild()
, который выполняет 2 секунды для выполнения. Вы видите реалистичный сценарий для этого? Я не могу. Даже если это так, вы можете позвонить GetChild()
один раз и назначить его локальной переменной, а затем позвонить child?
3 раза.
Читаемость:
Один начальный if
позволяет мысленно отдельные разные куски кода. Притворись читателем кода, не зная ничего другого: спросите себя, проще ли читать «если ребенок не является нулевым, выполните все эти операции и прочее, иначе просто перейдите на«, или », если ребенок не является null проверить имя. Если снова ребенок не является нулевым, проверьте Мать. Если мать не является нулевой, получите имя матери. Затем, если снова ребенок не является нулевым, проверьте Отца. Если отец не является нулевым ... ... .. . ".
ремонтопригодность:
Ака, в этом случае DRY principle. Например, почему бы вы повторить нулевую проверку 3 раза? Представьте, что в определенный момент в будущем ваш босс попросит вас изменить код: требуется не только проверить недействительность дочернего элемента, но также и его Id
- 0 (такие вещи случаются очень часто в любом процессе разработки программного обеспечения). В первом разделе кода вы должны исправить 3 строки. В вашем втором разделе кода вы должны исправить только одну строку: начальную if
.
И поэтому всегда лучше централизовать алгоритмы и логические потоки в любом месте.
EDIT:
Для обсуждения безопасности потоков на нуль условного оператора, см this question.
Они не эквивалентны - последний код не присваивает * ничего * переменным, если «child» имеет значение null, тогда как прежний код будет присваивать значения null всем переменным в этом случае. Определите, какое поведение вы хотите в первую очередь, затем выберите то, что вы считаете наиболее читаемым, а затем подтвердите, что производительность соответствует вашим требованиям. (Если вы еще не определили свои требования к производительности, это первое, что нужно сделать ...) –
Эти два эквивалента в том смысле, что они дают одинаковый результат. Результат гарантированно будет таким же, если, как я уже указывал, локальные вары уже нулевые. – GDS
Ах, я не заметил, что «все локальные вары уже нулевые». В этом случае, который вы предпочитаете читать, и соответствует ли эта версия вашим критериям эффективности? (Вы не должны просто слепо идти на «лучшую» производительность - большинство кода на самом деле не критично, но * является критически важным для чтения.) –