Я предпочитаю читать и писать чистый код - как описано в «Чистом коде» Роберта К. Мартина. Следуя его кредо, вы не должны требовать, чтобы разработчик (как пользователь вашего API) знал (внутреннюю) структуру вашего массива.
Пользователь API может спросить: это массив только с одним измерением? Распространены ли объекты по всем уровням многомерного массива? Сколько вложенных циклов (foreach и т. Д.) Мне нужно для доступа ко всем объектам? Какие типы объектов «хранятся» в этом массиве?
Как вы обрисовали в общих чертах, вы хотите использовать этот массив (содержащий объекты) как одномерный массив.
Как указано Ниши, вы можете использовать:
/**
* @return SomeObj[]
*/
для этого.
Но опять же: имейте в виду - это не стандартная нотация докблока. Это обозначение было введено некоторыми производителями IDE.
Хорошо, хорошо, как разработчик вы знаете, что «[]» привязан к массиву в PHP. Но что означает «что-то []» в обычном контексте PHP? «[]» означает: создать новый элемент внутри «чего-то». Новый элемент может быть чем угодно. Но вы хотите выразить следующее: массив объектов одного и того же типа и его точного типа. Как видите, производитель IDE вводит новый контекст. Новый контекст, который вам нужно было изучить. Новый контекст, который пришлось изучить другим PHP-разработчикам (чтобы понять ваши док-блоки). Плохой стиль (!).
Поскольку ваш массив действительно имеет одно измерение, вы, возможно, захотите назвать этот «массив объектов» «списком». Имейте в виду, что «список» имеет особое значение в других языках программирования. Было бы лучше называть это, например, "сбором".
Помните: вы используете язык программирования, который позволяет вам использовать все возможности ООП. Используйте класс вместо массива и сделайте свой класс проходимым, как массив. Например.:
class orderCollection implements ArrayIterator
Или, если вы хотите хранить внутренние объекты на разных уровнях в рамках многомерной структуры массива / объекта:
class orderCollection implements RecursiveArrayIterator
Это решение заменяет ваш массив объектом типа «orderCollection», но пока не включает автозавершение кода в вашей среде IDE. Хорошо. Следующий шаг:
Реализуйте методы, представленные интерфейсом, с помощью docblocks, в частности:
/**
* [...]
* @return Order
*/
orderCollection::current()
/**
* [...]
* @return integer E.g. database identifier of the order
*/
orderCollection::key()
/**
* [...]
* @return Order
*/
orderCollection::offsetGet()
Не забывайте использовать подсказку типов для:
orderCollection::append(Order $order)
orderCollection::offsetSet(Order $order)
Это решение перестает вводить много:
/** @var $key ... */
/** @var $value ... */
во всех ваших файлах кода (например, внутри циклов), как подтвердил Захимака своим ответом. Ваш пользователь API не обязан вводить эти докблоки для завершения кода. Наличие @return только в одном месте максимально снижает избыточность (@var). Если добавить в docBlocks @var, код будет хуже читаться.
Наконец-то все готово. Выглядит сложно? Похоже, чтобы сломать орех кувалдой? Не совсем так, поскольку вы знакомы с этими интерфейсами и с чистым кодом. Помните: ваш исходный код пишется один раз / читается много раз.
Если автозавершение кода вашей IDE не работает с этим подходом, переключитесь на более подходящий вариант (например, IntelliJ IDEA, PhpStorm, Netbeans) или отправьте запрос функции в средство отслеживания проблем вашего производителя IDE.
Спасибо Кристиану Вайсу (из Германии) за то, что он был моим тренером и научил меня такому замечательному материалу. PS: Встретимся с ним на XING.
person
DanielaWaranie
schedule
16.10.2012