ที่สำคัญของภาชนะ DI เป็นนามธรรม ภาชนะ DI นามธรรมการออกแบบนี้เกี่ยวข้องกับคุณ ในขณะที่คุณอาจเดาได้ว่ามันมีผลกระทบต่อโค้ดที่เห็นได้ชัดซึ่งมักจะแปลเป็นตัวสร้างจำนวนน้อยกว่าตัวตั้งค่าโรงงานและผู้สร้าง ด้วยเหตุนี้พวกเขาทำให้รหัสของคุณเพิ่มเติมอย่างหลวม ๆ (เนื่องจากพื้นฐานIoC ) สะอาดและเรียบง่ายขึ้น แม้ว่าจะไม่ได้โดยไม่มีค่าใช้จ่าย
พื้นหลัง
ปีที่ผ่านมาสิ่งที่เป็นนามธรรมเช่นต้องให้เราเขียน config ไฟล์ต่างๆ ( การเขียนโปรแกรมที่เปิดเผย ) มันวิเศษมากที่เห็นจำนวน LOC ลดน้อยลงอย่างมาก แต่ในขณะที่ LOCS ลดลงจำนวนของไฟล์กำหนดค่าก็เพิ่มขึ้นเล็กน้อย สำหรับโครงการขนาดกลางหรือขนาดเล็กมันไม่ได้เป็นปัญหา แต่สำหรับโครงการขนาดใหญ่ที่มี "แอสเซมบลีของโค้ด" กระจายอยู่ 50% ระหว่างโค้ดและตัวอธิบาย XML กลายเป็นความเจ็บปวดใน ... อย่างไรก็ตามปัญหาหลักคือ กระบวนทัศน์ของตัวเอง มันค่อนข้างยืดหยุ่นเนื่องจากตัวอธิบายใช้พื้นที่น้อยในการปรับแต่ง
กระบวนทัศน์เลื่อนไปที่การประชุมมากกว่าการกำหนดค่าซึ่งมีการซื้อขายไฟล์กำหนดค่าสำหรับคำอธิบายประกอบหรือแอตทริบิวต์ มันช่วยให้โค้ดของเราสะอาดและง่ายขึ้นในขณะที่มอบความยืดหยุ่นที่ XML ไม่สามารถทำได้
อาจเป็นความแตกต่างที่สำคัญที่สุดเกี่ยวกับวิธีการทำงานของคุณจนถึงขณะนี้ รหัสน้อยลงและความมหัศจรรย์มากขึ้น
ที่ด้านล่าง ...
อนุสัญญาการตั้งค่าคอนฟิกทำให้สิ่งที่เป็นนามธรรมหนักจนคุณแทบไม่รู้วิธีการทำงาน บางครั้งดูเหมือนว่าเวทมนตร์และนี่ก็เป็นข้อเสียเปรียบอีกหนึ่ง เมื่อทำงานแล้วนักพัฒนาหลายคนไม่สนใจว่ามันทำงานอย่างไร
นี่เป็นแต้มต่อสำหรับผู้ที่เรียน DI ด้วย DI container พวกเขาไม่เข้าใจความเกี่ยวข้องของรูปแบบการออกแบบการปฏิบัติที่ดีและหลักการที่ถูกยึดไว้โดยคอนเทนเนอร์ ฉันถามนักพัฒนาว่าพวกเขาคุ้นเคยกับ DI และข้อดีของมันหรือไม่และพวกเขาตอบว่า: - ใช่ฉันใช้ Spring IoC - (มันหมายถึงอะไรนรก!?)
หนึ่งสามารถเห็นด้วยหรือไม่กับแต่ละ "ข้อเสีย" เหล่านี้ ในความเห็นต่ำต้อยของฉันมันต้องรู้ว่าเกิดอะไรขึ้นในโครงการของคุณ มิฉะนั้นเราจะไม่เข้าใจอย่างถ่องแท้ นอกจากนี้ยังต้องรู้ว่า DI คืออะไรและมีความคิดว่าจะนำไปใช้เป็นประโยชน์ได้อย่างไร
ในด้านบวก ...
ผลผลิตคำเดียว กรอบการทำงานให้เรามุ่งเน้นไปที่สิ่งที่สำคัญจริงๆ ธุรกิจของแอพพลิเคชั่น
แม้จะมีข้อบกพร่องแสดงความคิดเห็นสำหรับเราหลายคน (ซึ่งงานถูกกำหนดโดยกำหนดเวลาและค่าใช้จ่าย) แต่เครื่องมือเหล่านี้เป็นทรัพยากรที่ทรงคุณค่า ในความคิดของฉันนี้ควรเป็นอาร์กิวเมนต์หลักของเราในความโปรดปรานของการใช้ภาชนะ DI ผลผลิต
การทดสอบ
ไม่ว่าเราจะใช้ DI บริสุทธิ์หรือภาชนะบรรจุการทดสอบจะไม่เป็นปัญหา ค่อนข้างตรงกันข้าม ภาชนะเดียวกันมักจะให้เรา mocks สำหรับการทดสอบหน่วยออกจากกล่อง ตลอดหลายปีที่ผ่านมาฉันใช้การทดสอบของฉันเป็นเครื่องวัดอุณหภูมิ พวกเขาบอกฉันว่าฉันไว้ใจสิ่งอำนวยความสะดวกในตู้คอนเทนเนอร์หรือไม่ ฉันพูดแบบนี้เพราะภาชนะเหล่านี้สามารถเริ่มต้นคุณลักษณะส่วนตัวโดยไม่ต้องตั้งค่าหรือตัวสร้าง พวกเขาสามารถฉีดส่วนประกอบได้เกือบทุกที่!
ฟังดูน่าดึงดูดใช่มั้ย ระวัง! อย่าตกหลุมพราง !!
ข้อเสนอแนะ
หากคุณตัดสินใจที่จะใช้ตู้คอนเทนเนอร์ฉันขอแนะนำอย่างยิ่งให้ยึดมั่นกับแนวปฏิบัติที่ดี หมั่นสร้างนวกรรมิกเซ็ตเตอร์และอินเตอร์เฟส บังคับใช้กรอบ / ภาชนะที่จะใช้พวกเขา มันจะทำให้การโยกย้ายที่เป็นไปได้ง่ายขึ้นไปยังเฟรมเวิร์กอื่นหรือเพื่อลบเฟรมจริง มันสามารถลดการพึ่งพาอย่างมีนัยสำคัญบนภาชนะ
เกี่ยวกับการปฏิบัตินี้:
ควรใช้ DI คอนเทนเนอร์เมื่อใด
คำตอบของฉันจะต้องลำเอียงจากประสบการณ์ของตัวเองซึ่งส่วนใหญ่ชอบคอนเทนเนอร์ DI (ตามที่ฉันแสดงความคิดเห็นฉันเน้นหนักในการผลิตดังนั้นฉันไม่เคยมีความต้องการบริสุทธิ์ DI ค่อนข้างตรงข้าม)
ฉันคิดว่าคุณจะพบที่น่าสนใจบทความมาร์ค Seeman ของเกี่ยวกับเรื่องนี้ซึ่งยังตอบคำถามเกี่ยวกับวิธีการใช้ DI
สุดท้ายหากเรากำลังพูดถึง Java ผมจะพิจารณาก่อนการมองไปที่JSR330 - พึ่งพาการฉีด
สรุป
ประโยชน์ :
- ลดต้นทุนและประหยัดเวลา ผลผลิต
- ส่วนประกอบจำนวนน้อย
- รหัสจะง่ายขึ้นและสะอาดขึ้น
ข้อเสีย :
- DI ถูกมอบให้แก่ libs บุคคลที่สาม เราควรตระหนักถึงการแลกเปลี่ยนจุดแข็งและจุดอ่อนของพวกเขา
- โค้งการเรียนรู้
- พวกเขาทำให้คุณลืมนิสัยที่ดีไปอย่างรวดเร็ว
- เพิ่มการพึ่งพาของโครงการ (libs มากขึ้น)
- ภาชนะบรรจุที่มีการสะท้อนกลับต้องการทรัพยากรมากขึ้น นี่เป็นสิ่งสำคัญหากเราถูก จำกัด โดยทรัพยากร
ความแตกต่างกับ DI บริสุทธิ์ :
- รหัสน้อยลงและไฟล์การกำหนดค่าเพิ่มเติมหรือคำอธิบายประกอบ