ฉันชอบอ่านและเขียนโค้ดสะอาด - ตามที่ระบุไว้ใน "Clean Code" โดย Robert C. Martin เมื่อติดตามลัทธิความเชื่อของเขาคุณไม่ควรกำหนดให้นักพัฒนา (ในฐานะผู้ใช้ API ของคุณ) รู้โครงสร้าง (ภายใน) ของอาร์เรย์ของคุณ
ผู้ใช้ API อาจถาม: นั่นคืออาร์เรย์ที่มีหนึ่งมิติเท่านั้นหรือไม่ วัตถุแพร่กระจายไปรอบ ๆ ในทุกระดับของอาเรย์หลายมิติหรือไม่? ฉันต้องมีลูปซ้อนกันกี่วง (foreach และอื่น ๆ ) ในการเข้าถึงวัตถุทั้งหมดหรือไม่ วัตถุประเภทใดที่ "เก็บไว้" ในอาเรย์นั้น?
ตามที่คุณระบุไว้คุณต้องการใช้อาร์เรย์นั้น (ซึ่งมีวัตถุ) เป็นอาร์เรย์หนึ่งมิติ
ตามที่ Nishi ระบุไว้คุณสามารถใช้:
/**
* @return SomeObj[]
*/
สำหรับการที่.
แต่อีกครั้ง: ระวัง - นี่ไม่ใช่เครื่องหมาย docblock มาตรฐาน สัญกรณ์นี้ถูกนำเสนอโดยผู้ผลิต IDE บางราย
ตกลงโอเคในฐานะนักพัฒนาที่คุณรู้ว่า "[]" เชื่อมโยงกับอาร์เรย์ใน PHP แต่ "บางอย่าง []" หมายถึงอะไรในบริบทของ PHP ปกติ? "[]" หมายถึง: สร้างองค์ประกอบใหม่ภายใน "บางสิ่ง" องค์ประกอบใหม่อาจเป็นทุกอย่าง แต่สิ่งที่คุณต้องการแสดงคืออาร์เรย์ของวัตถุที่มีประเภทเดียวกันและเป็นประเภทที่แน่นอน อย่างที่คุณเห็นผู้สร้าง IDE แนะนำบริบทใหม่ บริบทใหม่ที่คุณต้องเรียนรู้ บริบทใหม่ที่นักพัฒนา PHP คนอื่นต้องเรียนรู้ (เพื่อทำความเข้าใจ docblock ของคุณ) สไตล์ไม่ดี (!)
เนื่องจากอาเรย์ของคุณมีหนึ่งมิติคุณอาจต้องการเรียกว่า "อาเรย์ของวัตถุ" รายการ " โปรดระวังว่า "รายการ" มีความหมายพิเศษมากในภาษาการเขียนโปรแกรมอื่น มันจะดีกว่าที่จะเรียกว่า "คอลเลกชัน" ตัวอย่างเช่น
เตือนความจำ: คุณใช้ภาษาการเขียนโปรแกรมที่ช่วยให้คุณมีตัวเลือกทั้งหมดของ OOP ใช้คลาสแทนอาเรย์และทำให้คลาสของคุณ traversable เหมือนอาเรย์ เช่น:
class orderCollection implements ArrayIterator
หรือถ้าคุณต้องการจัดเก็บวัตถุภายในในระดับที่แตกต่างกันภายในโครงสร้างอาร์เรย์ / วัตถุหลายมิติ:
class orderCollection implements RecursiveArrayIterator
วิธีนี้จะแทนที่อาเรย์ของคุณด้วยวัตถุประเภท "orderCollection" แต่อย่าเปิดใช้งานการเติมโค้ดให้สมบูรณ์ภายใน IDE ของคุณ ตกลง. ขั้นตอนต่อไป:
ใช้วิธีการที่นำมาใช้โดยส่วนต่อประสานกับ docblock โดยเฉพาะ:
/**
* [...]
* @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 ... */
ทั่วทุกไฟล์รหัสของคุณ (เช่นภายในลูป) ตามที่ Zahymaka ยืนยันด้วยคำตอบของเขา / เธอ ผู้ใช้ API ของคุณไม่ได้ถูกบังคับให้แนะนำ docblock นั้นเพื่อให้ได้รหัสที่สมบูรณ์ หากต้องการให้ @return อยู่ในที่เดียวจะช่วยลดความซ้ำซ้อน (@var) เป็น mutch ให้มากที่สุด การโรย "docBlocks ด้วย @var" จะทำให้โค้ดของคุณอ่านง่ายที่สุด
สุดท้ายคุณเสร็จแล้ว ดูยากที่จะเข้าใจ ดูเหมือนว่าจะเอาค้อนขนาดใหญ่มาทุบแคร็กไหม? ไม่ใช่เรื่องจริงเนื่องจากคุณคุ้นเคยกับอินเทอร์เฟซนั้นและรหัสที่สะอาด ข้อควรจำ: ซอร์สโค้ดของคุณเขียนครั้งเดียว / อ่านหลายครั้ง
หากการทำให้โค้ดของ IDE ของคุณไม่ทำงานด้วยวิธีการนี้ให้เปลี่ยนไปใช้วิธีที่ดีกว่า (เช่น IntelliJ IDEA, PhpStorm, Netbeans) หรือยื่นคำขอคุณสมบัติในตัวติดตามปัญหาของผู้ผลิต IDE ของคุณ
ขอบคุณ Christian Weiss (จากเยอรมัน) ที่ได้เป็นครูฝึกของฉันและสอนฉันอย่างยอดเยี่ยม PS: พบกับฉันและเขาใน XING