У меня есть метод, как это:Guarding мои методы против плохих входных
public function create (array $hash) {
$id = $hash[ID_KEY];
$this->store[$id] = $hash;
}
Я хочу, чтобы уберечь ее от ошибок, вызванных плохим входом. Например, мой код может ошибочно передать $hash
с
$id = '' or $id = null,
в этом случае она будет храниться молча ссылается null
. Вместо этого я хочу увидеть предупреждение и пересмотреть свой код, чтобы избавиться от него. Так что я думаю, лучший способ бросить исключение:
if (! $id) throw new Exception("Hash with empty id");
Обратите внимание, что я использую пустые строки в качестве значений по умолчанию для нескольких аргументов методы и возвращаемых значений по умолчанию, поэтому этот вид ошибки может легко произойти. (Использование null
вместо пустой строки здесь, похоже, ничего не меняет, даже если это не рекомендуется Дядю Бобу.)
Проблема в том, что существует много таких методов. Действительно ли лучше всего защищать каждый из них за каждый аргумент, который может стать null
, но не должен?
Например, другой способ делает только чтение. Тогда кажется, что нет необходимости защищать от null
, потому что ничего не будет храниться по ссылке null
, правильно? Или я все равно буду защищаться, чтобы подготовиться к делу, я могу где-то в будущем решить, что разрешить хранилище, на которое ссылаются null
, и забудьте настроить охранники?
Это звучит как самый безопасный способ, но будет загромождать все методы с помощью блоков защитного кода для всех используемых там индексов. Это действительно лучший способ?
EDIT. Я поставил больше стражей и действительно обнаружил несколько ошибок, которые я бы не нашел иначе. Также мои тесты не заметили их.
Кроме того, это помогло лучше понять роль методов чтения - вернуть значение, если найдено или return empty Array
если нет. Вход $id = null
не соответствует не найден и, следовательно, также возвращается empty Array
. Таким образом, метод является чистым и последовательным.
Это зависит от вас, насколько вы осторожны. Я не думаю, что большинство программистов ставят множество охранников, как это, они стараются в первую очередь называть свои функции. – Barmar
@Barmar Я пробовал именно это и в конечном итоге мучительно тратил слишком много времени на поиски ошибок. :( –
Тогда вперед, поставьте страж в начале каждой функции. – Barmar