Должна ли функция, которая в основном делегирует другим функциям, проверять все свои аргументы? - PullRequest
0 голосов
/ 13 марта 2011

Если есть внешняя функция, которая принимает набор параметров и вызывает несколько других функций (которые я буду называть внутренними функциями), передавая им подмножества своих параметров, лучше всего: 1) проверить все аргументы во внешней функции 2) просто передать подмножества аргументов внутренним функциям и проверить их там

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

1 Ответ

0 голосов
/ 13 марта 2011

Самое главное: проверьте ваши данные только один раз Если пользователь может получить доступ только к внешним функциям (вызывать их public ), проверьте входные данные на общедоступном уровне и предположите, что параметры верны на внутреннем ( private ) уровне. Поскольку пользователь не может напрямую вызывать слой private , нет вероятности попадания в него неверных данных. Вы можете на всякий случай добавить утверждения в слой private .

Эмпирическое правило: убедитесь, что всегда есть только одно место, где проверка выполняется для каждого пути. Это не смущает будущих читателей вашего кода. Они могут с уверенностью предположить, где параметры уже проверены и когда они должны проверять их. В противном случае это приведет к защитному программированию и множеству шаблонов (влияние нескольких проверок на производительность, вероятно, наименее важно). Более того, проверка одного и того же ввода дважды и более не добавляет дополнительной безопасности.

Важно пересечь границы и определить контракты - какие методы позволяют какой тип ввода. Я даже видел соглашение об именах, такое как суффикс orNull и префикс try для имен параметров / методов соответственно.

Если вы предпочитаете проверку на самом низком уровне ( частный - там, где данные фактически используются), это нормально. Но вы можете получить много дубликатов, поскольку одно и то же значение из слоя public распределяется по нескольким функциям в private area.

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