Tôi thích đọc và viết mã sạch - như được nêu trong "Mã sạch" của Robert C. Martin. Khi theo dõi uy tín của anh ấy, bạn không nên yêu cầu nhà phát triển (với tư cách là người dùng API của bạn) biết cấu trúc (bên trong) của mảng.
Người dùng API có thể hỏi: Đó có phải là một mảng chỉ có một chiều không? Là các đối tượng trải rộng trên tất cả các cấp của một mảng đa chiều? Tôi cần bao nhiêu vòng lặp lồng nhau (foreach, v.v.) để truy cập tất cả các đối tượng? Loại đối tượng nào được "lưu trữ" trong mảng đó?
Như bạn đã phác thảo, bạn muốn sử dụng mảng đó (chứa các đối tượng) làm mảng một chiều.
Theo phác thảo của Nishi, bạn có thể sử dụng:
/**
* @return SomeObj[]
*/
cho điều đó
Nhưng một lần nữa: lưu ý - đây không phải là ký hiệu docblock tiêu chuẩn. Ký hiệu này được giới thiệu bởi một số nhà sản xuất IDE.
Được rồi, với tư cách là một nhà phát triển, bạn biết rằng "[]" được gắn với một mảng trong PHP. Nhưng "cái gì đó []" nghĩa là gì trong ngữ cảnh PHP bình thường? "[]" Có nghĩa là: tạo thành phần mới trong "cái gì đó". Yếu tố mới có thể là tất cả. Nhưng những gì bạn muốn thể hiện là: mảng các đối tượng có cùng loại và loại chính xác. Như bạn có thể thấy, nhà sản xuất IDE giới thiệu một bối cảnh mới. Một bối cảnh mới bạn phải học. Một bối cảnh mới mà các nhà phát triển PHP khác phải học (để hiểu các nguyên tắc của bạn). Phong cách xấu (!).
Bởi vì mảng của bạn có một chiều, bạn có thể muốn gọi "mảng đối tượng" đó là "danh sách". Xin lưu ý rằng "danh sách" có ý nghĩa rất đặc biệt trong các ngôn ngữ lập trình khác. Nó sẽ tốt hơn nếu gọi nó là "bộ sưu tập" chẳng hạn.
Hãy nhớ rằng: bạn sử dụng ngôn ngữ lập trình cho phép bạn tất cả các tùy chọn OOP. Sử dụng một lớp thay vì một mảng và làm cho lớp của bạn đi qua như một mảng. Ví dụ:
class orderCollection implements ArrayIterator
Hoặc nếu bạn muốn lưu trữ các đối tượng bên trong ở các mức khác nhau trong cấu trúc đối tượng / mảng đa chiều:
class orderCollection implements RecursiveArrayIterator
Giải pháp này thay thế mảng của bạn bằng một đối tượng thuộc loại "orderCollection", nhưng không cho phép hoàn thành mã trong IDE của bạn cho đến nay. Được chứ. Bước tiếp theo:
Thực hiện các phương thức được giới thiệu bởi giao diện với docblocks - cụ thể:
/**
* [...]
* @return Order
*/
orderCollection::current()
/**
* [...]
* @return integer E.g. database identifier of the order
*/
orderCollection::key()
/**
* [...]
* @return Order
*/
orderCollection::offsetGet()
Đừng quên sử dụng gợi ý loại cho:
orderCollection::append(Order $order)
orderCollection::offsetSet(Order $order)
Giải pháp này ngừng giới thiệu rất nhiều:
/** @var $key ... */
/** @var $value ... */
trên tất cả các tệp mã của bạn (ví dụ trong vòng lặp), như Zahymaka đã xác nhận với câu trả lời của cô ấy / anh ấy. Người dùng API của bạn không bị buộc phải giới thiệu các tài liệu đó, để hoàn thành mã. Để có @return trên một nơi duy nhất làm giảm sự dư thừa (@var) càng nhiều càng tốt. Rắc "docBlocks với @var" sẽ làm cho mã của bạn dễ đọc nhất.
Cuối cùng bạn đã hoàn thành. Có vẻ khó để đạt được? Hình như lấy búa tạ để bẻ đai ốc? Không thực sự, vì bạn đã quen thuộc với các giao diện đó và với mã sạch. Hãy nhớ rằng: mã nguồn của bạn được viết một lần / đọc nhiều.
Nếu việc hoàn thành mã IDE của bạn không hoạt động với phương pháp này, hãy chuyển sang một cách tốt hơn (ví dụ IntelliJ IDEA, PhpStorm, Netbeans) hoặc gửi yêu cầu tính năng về trình theo dõi vấn đề của nhà sản xuất IDE của bạn.
Cảm ơn Christian Weiss (từ Đức) vì đã trở thành huấn luyện viên của tôi và đã dạy tôi một thứ tuyệt vời như vậy. PS: Gặp tôi và anh ấy trên XING.