Жестко закодированные вложенные массивы в PHP? Хорошая или плохая практика?
Недавно я обсуждал с одним человеком пример кода, где человек использует вложение массивов. И мы начали обсуждать использование вложенных массивов в коде вообще.
Когда мы передаем параметры в генераторы и т. Д., Иногда проще использовать вложенные массивы. Я думаю, что в этих ситуациях можно использовать вложенные массивы, но лучше использовать классы и хорошую проверку.
И второе: когда у нас есть XML, HTML, JSON или другой синтаксический анализатор, они часто также возвращают вложенные массивы. Я думаю, что в этих сценариях также можно использовать вложенные массивы.
Итак, когда нельзя использовать вложенные массивы?
Я думаю, что это когда мы используем их без связи с вышеупомянутыми сценариями. Особенно, когда мы используем жестко закодированные вложенные массивы в исходном коде, как в этом примере:
$data = array(array('cat', 12),
array('dog', 15),
array('turtle', 4));
Я думаю, что это можно рассматривать как антипаттерн программирования, когда вы часто используете вложенные массивы. У вас нет проверки, испорченный код, вероятно, есть ошибки. И мой парень не такой, и говорит, что это не антипаттерн, потому что в программировании нормально использовать вложенные массивы, и нет причин говорить другим, что это не нормально.
Не могли бы вы помочь нам решить, можно ли обращаться с ним как с антипаттерном для использования жестко закодированных вложенных массивов или нет?
Все плюсы и минусы будут оценены!
2 ответа
Это зависит.
Есть ситуации, когда вложенные массивы подходят хорошо. Есть другие ситуации, когда вы не хотите явно создавать объект, и будет быстрее и короче использовать вложенные массивы.
Конечно, при использовании массивов вместо объектов значение элементов массива теряется. В вашем примере тот, кто читает код, понятия не имеет, является ли второй элемент во вложенном массиве возраст животного, или, может быть, его вес, или идентификатор владельца домашнего животного из базы данных. С другой стороны, если вы предоставите массив таких объектов:
class Animal
{
public $animal;
public $age;
}
смысл второго пункта становится намного легче понять.
Это не означает, что "проверка" будет проще, но это скорее проблема с языком. Например, ничего не запрещает делать:
$someDog = new Animal();
$someDog->animal = 12;
$someDog->age = 'Cat';
Вложенные массивы могут быть плохой вещью в строго типизированных языках. Например, в C#, имея Collection<object>
вероятно, это не лучшая вещь: вы не знаете, каковы свойства каждого объекта, каковы эти объекты и т. д. Когда у вас есть Collection<Animal>
:
- Вы уверены, что каждый элемент коллекции является
Animal
, - Вы знаете, какие точные свойства доступны для каждого элемента, и каковы их типы. Если
Animal
имеет свойствоAge
типаint
вы знаете, что у каждого элемента в коллекции есть это свойство, и его значение является целым числом. (Примечание: отдельные элементы могут иметь дополнительные свойства, еслиAnimal
объект наследуется другими объектами, которые расширяют его, но во всех случаяхAge
собственность будет доступна).
То же самое работает только частично в PHP. Например, вы не можете быть уверены, что тип одного и того же свойства всегда одинаков среди объектов в массиве, поэтому требуется проверка.
Мое личное мнение: в таких языках, как PHP, я бы предпочел использовать вложенные массивы, когда быстрее и проще использовать вложенные массивы, и объекты, когда есть причина использовать объекты.
Не знаю, сработает ли это, однако, основываясь на вашем фрагменте кода, я бы выбрал другой подход:
$data = array('cat'=>12,
'dog'=>15,
'turtle'=>4,
);
Или, если у животных есть больше атрибутов, вы можете сделать:
$data = array('cat'=>array(12, 'attr'),
'dog'=>array(15, 'attr'),
'turtle'=>array(4, 'attr'),
);
Все действительно зависит от данных, в какую сторону идти:
классы против массивов