first-programmer
@first-programmer
Backend software engineer

Везде ли нужно проверять на существование элемента в массиве?

Всем привет коллеги.

Возник тут спор с коллегой. Я во всех местах, где обращаюсь к элементу массива, привык делать проверку, на то существует ли вообще этот элемент, хотя бы банальную проверку через

[
    'a' => $this->someParam['a'] ?? ''
]


Коллега говорит, что плохо код загрязнять лишними проверками. Типа ты и так знаешь, что у someParam всегда есть в массиве ключ 'a'. Мне кажется, что такие надежды на то что есть, а чего нету слишком смелые. С другой стороны уловить ошибку в таком случае сложнее. Допустим, кто-то зачем-то удалил ключ 'a' из массива, а у нас тут идет оператор ?? и просто подпихивает пустую строку. Код работает и ошибки не видно. С другой стороны, если обязательный параметр для передачи куда-то, то можно запихнуть все в dto и там делать проверки любые, валидацию и так далее, кидать грубый эксепшен, если нет нужного в массиве ключа. Но тут коллега опять ворчит, типа еще и dto создавать для такого пустяка. В общем его позиция, что пусть просто падает код и все, если нет нужного ключа в массиве, типа так понятней. Моя позиция что нужно такие вещи обрабатывать как-то.

Что думаете ребята?
  • Вопрос задан
  • 621 просмотр
Решения вопроса 5
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
Правы оба.
Лучше раньше упасть, чем обработать кривые данные так, как будто они нормальные. Но и просто бездумно падать в самую базовую ошибку неправильно - потом задолбаетесь выяснять при каких обстоятельствах код упал. Лучше провалидировать и кинуть осмысленное исключение, которое поможет отловить проблему.
Ответ написан
profesor08
@profesor08 Куратор тега PHP
На мой скромный взгляд, проблема несколько шире. Вот почему someParam это массив, а не осмысленный объект? Пока его суть остается неопределенной, будут возникать неопределенные ситуации, когда непонятно что делать, падать в ошибку или городить полотно проверок. А ведь можно вынести всю валидацию на этап создания объекта, там же выбрасывать ошибки, так будет явно понятно, что ошибка в данных, а не где-то в логике, где данные уже должны быть.
Ответ написан
@MikUrrey
Привет!
Если массив является частью входных данных, будь то user input, или какой-то файл, или БД, то всё верно - проверка нужна (даже обязательна). А вот в таком случае и подобных точно нет:
$this->someParam = [
     'a' => 1,
     'b' => 2,
];
//...
//...
//...
$a = $this->someParam['a'] ?? '';

Такая проверка уже сродни
if (TRUE !== FALSE) {
     //...
}
Ответ написан
@kot999
Backend software engineer
Точно такой же вопрос возникал неоднократно и у меня с коллегами. Кто-то за то, чтобы при каждой выборке из бд, (в случае когда работаешь с массивами, а не объектами) нужно проверять наличие полей, у меня это вызывает недопонимание.
ИМХО правил тут не может быть, нужно подходить с точки зрения благоразумности. И да, лучше использовать DTO по возможности.
Ответ написан
Комментировать
иногда такие проверки бессмысленны. Допустим, Вы обращаетесь к функции, которая возвращает список, каждый элемент которого - массив определённой структуры, например ['id'=> ..., 'name' => ..., 'timestamp'=> ...,]
Понятно, что не надо у каждого элемента проверять, есть ли там эти ключи - функция-источник гарантирует это.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@Vitsliputsli
Вы описываете 2 стандартных подхода:
1) падаем в ошибку при любой непонятной ситуации;
2) при непонятной ситуации пробуем продолжить работу, если это возможно.
1 подход применяется в тех местах которые работают критически важными бизнесово данными. 2 подход для маловажных вещей, которые не способны исказить вещи из предыдущего предложения.
Т.е. в большинстве случаев нужно падать в ошибку, и только если знаете, что ошибка не несет никакого серьезного аффекта (к примеру выводить текст на экран жирным шрифтом или нет), то можно продолжать работу.
Ответ написан
Комментировать
pOmelchenko
@pOmelchenko
php-developer
Посмотрите в сторону таких инструментов как phpstan psalm phan. Там можно объявлять какие ключи должны быть в массиве. Это поможет при написании кода - не забыть что-то важное. Но в рантайме, да - больше проверок к чему-то важному это всегда хорошо. Особенно если массивы кастить в дто. У объектов и api приятней. Всегда же удобней работать с методами/свойствами чем вспоминать корректное название ключа
Ответ написан
Комментировать
@Prizgost
Запретили Даже Отвечать!
Самый Правильный и Сжатый Ответ - Абсолютно Всегда!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы