Temiz kod okumayı ve yazmayı tercih ediyorum - Robert C. Martin tarafından "Clean Code" da belirtildiği gibi. Kredisini takip ederken geliştiricinin (API'nızın kullanıcısı olarak) dizinizin (dahili) yapısını bilmesini istememeniz gerekir.
API kullanıcısı şunu sorabilir: Bu yalnızca bir boyutu olan bir dizi mi? Nesneler çok boyutlu bir dizinin tüm düzeylerine yayılmış mı? Tüm nesnelere erişmek için kaç tane iç içe döngü (foreach vb.) Gerekir? Bu dizide ne tür nesneler "depolanır"?
Ana hatlarıyla belirttiğiniz gibi, o diziyi (nesneleri içeren) tek boyutlu bir dizi olarak kullanmak istersiniz.
Nishi tarafından belirtildiği gibi şunları kullanabilirsiniz:
/**
* @return SomeObj[]
*/
bunun için.
Ama tekrar: farkında olun - bu standart bir docblock gösterimi değildir. Bu gösterim bazı IDE üreticileri tarafından tanıtıldı.
Tamam, tamam, bir geliştirici olarak "[]" in PHP'deki bir diziye bağlı olduğunu biliyorsunuz. Ancak normal PHP bağlamında bir "şey []" ne anlama gelir? "[]" şu anlama gelir: "bir şey" içinde yeni bir öğe yaratmak. Yeni unsur her şey olabilir. Ancak ifade etmek istediğiniz şey: aynı türdeki nesnelerin dizisi ve tam türü. Gördüğünüz gibi, IDE üreticisi yeni bir bağlam sunuyor. Öğrenmeniz gereken yeni bir bağlam. Diğer PHP geliştiricilerinin öğrenmesi gereken yeni bir bağlam (docblock'larınızı anlamak için). Kötü stil (!).
Dizinizin bir boyutu olduğundan, "nesne dizisi" ni "liste" olarak adlandırmak isteyebilirsiniz. "Liste" nin diğer programlama dillerinde çok özel bir anlamı olduğunu unutmayın. Mesela "koleksiyon" demek daha iyi olurdu.
Unutmayın: tüm OOP seçeneklerini sağlayan bir programlama dili kullanırsınız. Dizi yerine bir sınıf kullanın ve sınıfınızı bir dizi gibi gezilebilir yapın. Örneğin:
class orderCollection implements ArrayIterator
Veya dahili nesneleri çok boyutlu bir dizi / nesne yapısı içinde farklı düzeylerde saklamak istiyorsanız:
class orderCollection implements RecursiveArrayIterator
Bu çözüm dizinizi "orderCollection" türündeki bir nesne ile değiştirir, ancak şu ana kadar IDE'nizde kod tamamlamayı etkinleştirmeyin. Tamam. Sonraki adım:
Arayüz tarafından tanıtılan yöntemleri docblocks ile uygulayın - özellikle:
/**
* [...]
* @return Order
*/
orderCollection::current()
/**
* [...]
* @return integer E.g. database identifier of the order
*/
orderCollection::key()
/**
* [...]
* @return Order
*/
orderCollection::offsetGet()
Aşağıdakiler için tür ipucunu kullanmayı unutmayın:
orderCollection::append(Order $order)
orderCollection::offsetSet(Order $order)
Bu çözüm aşağıdakileri sunmayı bırakır:
/** @var $key ... */
/** @var $value ... */
Zahymaka'nın yanıtıyla doğruladığı gibi, kod dosyalarınızın her yerinde (örn. döngüler içinde). API kullanıcısı, kod tamamlama için bu docblock'ları tanıtmak zorunda değildir. @ Geri dönüşünün tek bir yerde olması yedekliliği (@var) mümkün olduğunca mutch azaltır. Serpin "@var ile docBlocks" kodunuzu en kötü okunabilir yapar.
Sonunda bitti. Başarmak zor görünüyor mu? Bir ceviz kırmak için balyoz almak gibi mi? O arayüzlere ve temiz kodlara aşina olduğunuzdan, gerçek değil. Unutmayın: kaynak kodunuz bir kez yazılır / çok okunur.
IDE'nizin kodunun tamamlanması bu yaklaşımla çalışmazsa, daha iyi olana geçin (örn. IntelliJ IDEA, PhpStorm, Netbeans) veya IDE üreticinizin sorun izleyicisine bir özellik isteği gönderin.
Eğitmenim olduğu ve bana çok güzel şeyler öğrettiği için Christian Weiss'a (Almanya'dan) teşekkürler. PS: Ben ve onunla XING'de buluş.