Wolę czytać i pisać czysty kod - jak opisano w „Clean Code” Roberta C. Martina. Podążając za jego credo, nie powinieneś wymagać od programisty (jako użytkownika twojego API) znajomości (wewnętrznej) struktury twojej tablicy.
Użytkownik interfejsu API może zapytać: Czy to tablica z tylko jednym wymiarem? Czy obiekty są rozmieszczone na wszystkich poziomach tablicy wielowymiarowej? Ile zagnieżdżonych pętli (foreach itp.) Muszę uzyskać dostęp do wszystkich obiektów? Jakie obiekty są „przechowywane” w tej tablicy?
Jak opisano, chcesz użyć tej tablicy (która zawiera obiekty) jako tablicy jednowymiarowej.
Jak opisano w Nishi, możesz użyć:
/**
* @return SomeObj[]
*/
za to.
Ale znowu: bądź świadomy - to nie jest standardowa notacja docblock. Notacja ta została wprowadzona przez niektórych producentów IDE.
Dobra, dobra, jako programista wiesz, że „[]” jest powiązane z tablicą w PHP. Ale co oznacza „coś []” w normalnym kontekście PHP? „[]” oznacza: utwórz nowy element w „czymś”. Nowym elementem może być wszystko. Ale to, co chcesz wyrazić, to: tablica obiektów tego samego typu i dokładny typ. Jak widać, producent IDE wprowadza nowy kontekst. Nowy kontekst, którego musiałeś się nauczyć. Nowy kontekst, którego musieli się nauczyć inni programiści PHP (aby zrozumieć twoje docblocks). Zły styl (!).
Ponieważ twoja tablica ma jeden wymiar, możesz nazwać tę „tablicę obiektów” „listą”. Pamiętaj, że „lista” ma szczególne znaczenie w innych językach programowania. Na przykład lepiej byłoby nazwać to „kolekcją”.
Pamiętaj: używasz języka programowania, który udostępnia wszystkie opcje OOP. Użyj klasy zamiast tablicy i spraw, aby Twoja klasa mogła przechodzić jak tablica. Na przykład:
class orderCollection implements ArrayIterator
Lub jeśli chcesz przechowywać obiekty wewnętrzne na różnych poziomach w wielowymiarowej strukturze tablicy / obiektu:
class orderCollection implements RecursiveArrayIterator
To rozwiązanie zastępuje tablicę obiektem typu „orderCollection”, ale jak dotąd nie włącza uzupełniania kodu w IDE. W porządku. Następny krok:
Zaimplementuj metody wprowadzane przez interfejs za pomocą docblocks - w szczególności:
/**
* [...]
* @return Order
*/
orderCollection::current()
/**
* [...]
* @return integer E.g. database identifier of the order
*/
orderCollection::key()
/**
* [...]
* @return Order
*/
orderCollection::offsetGet()
Nie zapomnij użyć podpowiedzi typu dla:
orderCollection::append(Order $order)
orderCollection::offsetSet(Order $order)
To rozwiązanie przestaje wprowadzać wiele:
/** @var $key ... */
/** @var $value ... */
w całym pliku kodu (np. w pętli), jak Zahymaka potwierdził swoją odpowiedzią. Użytkownik interfejsu API nie jest zmuszony do wprowadzenia tych bloków dokumentów w celu ukończenia kodu. Posiadanie @ powrotu tylko w jednym miejscu zmniejsza nadmiarowość (@var) tak bardzo, jak to możliwe. Posypanie „docBlocks @var” sprawi, że twój kod będzie najgorzej czytelny.
W końcu skończone. Wygląda na trudny do osiągnięcia? Wygląda na to, że bierzesz młot, żeby zgnieść orzecha? Nie do końca, ponieważ znasz te interfejsy i czysty kod. Pamiętaj: Twój kod źródłowy jest zapisywany raz / przeczytany wiele.
Jeśli uzupełnianie kodu w twoim IDE nie działa z tym podejściem, przełącz się na lepsze (np. IntelliJ IDEA, PhpStorm, Netbeans) lub złóż żądanie funkcji na monitorze problemów producenta IDE.
Podziękowania dla Christiana Weissa (z Niemiec) za bycie moim trenerem i za nauczenie mnie tak wspaniałych rzeczy. PS: Spotkajmy się ze mną na XING.