ทำไมเราต้องมีกรอบสำหรับการฉีดพึ่งพา? [ปิด]


42

ฉันได้อ่านเพิ่มเติมเกี่ยวกับหลักการผกผันของการควบคุมและการพึ่งพาการฉีดเพื่อนำไปใช้และฉันค่อนข้างมั่นใจว่าฉันเข้าใจมัน

ดูเหมือนว่าโดยทั่วไปแล้วจะพูดว่า 'อย่าประกาศให้อินสแตนซ์ของสมาชิกชั้นเรียนของคุณ' ในชั้นเรียน ' ค่อนข้างว่าอินสแตนซ์ควรจะถูกส่งผ่านและได้รับมอบหมายผ่านตัวสร้าง; 'ฉีด' เข้าสู่ชั้นเรียนจากแหล่งภายนอก

ถ้ามันง่ายนี่มันน่าจะเป็นเหตุผลทำไมเราต้องใช้เฟรมเวิร์กเช่นสปริงหรือ guice ที่ใช้มันกับหมายเหตุประกอบ? ฉันขาดพื้นฐานบางอย่างที่นี่หรือไม่? ฉันกำลังดิ้นรนจริงๆที่จะเข้าใจว่าการใช้กรอบการฉีดพึ่งพาคืออะไร

แก้ไข: เกี่ยวกับความซ้ำซ้อนที่เป็นไปได้ฉันเชื่อว่าคำถามของฉันไม่เหมือนใครเพราะถามเกี่ยวกับกรอบ DI โดยทั่วไปไม่ใช่เฉพาะฤดูใบไม้ผลิ Spring ไม่ได้เป็นเพียงกรอบ DI ดังนั้นจึงมีหลายเหตุผลที่บางคนต้องการใช้ Spring ที่ไม่เกี่ยวข้องกับ DI



11
ซึ่งมีประโยชน์สำหรับการเปลี่ยนข้อผิดพลาดเป็นรันไทม์แทนที่จะรวบรวมเวลา
Den

1
@den ทำไมเราต้องการทำเช่นนั้น? ดูเหมือนว่าการละเมิดจะล้มเหลวอย่างรวดเร็ว
นี้ต้องการความช่วยเหลือ

คำตอบ:


26

เราไม่ต้องการกรอบ เป็นไปได้ทั้งหมดที่จะใช้การฉีดขึ้นต่อกันด้วยตนเองแม้สำหรับโครงการที่ค่อนข้างใหญ่

ในทางกลับกันการใช้เฟรมเวิร์กทำให้ง่ายขึ้นโดยเฉพาะอย่างยิ่งเฟรมอ้างอิงจากคำอธิบายประกอบหรือการตรวจจับการพึ่งพาโดยอัตโนมัติเนื่องจากมันทำให้กระบวนการง่ายขึ้น: ถ้าฉันตัดสินใจว่าฉันต้องการการพึ่งพาใหม่ในชั้นเรียนสิ่งที่ฉันต้องทำคือเพิ่ม ตัวสร้างมัน (หรือประกาศ setter) และวัตถุถูกฉีด - ฉันไม่จำเป็นต้องเปลี่ยนรหัสการเริ่มต้นใด ๆ

นอกจากนี้กรอบมักจะมีฟังก์ชั่นที่มีประโยชน์อื่น ๆ ยกตัวอย่างเช่น Spring มีกรอบการทำงานที่เป็นประโยชน์สำหรับการวางแนวโปรแกรมรวมถึงการกำหนดขอบเขตการทำธุรกรรมที่ประกาศ (ซึ่งมีประโยชน์อย่างยิ่ง) และความหลากหลายของการปรับใช้อะแดปเตอร์ที่ทำให้หลาย ๆ


8
แทงใจดำ. เราไม่ต้องการพวกเขา พวกเขาทำให้ชีวิตง่ายขึ้นสำหรับโครงการขนาดใหญ่ สุจริตฉันพบว่ากรอบงานมีความยุ่งยากมากกว่าที่พวกเขามีค่าสำหรับโครงการขนาดเล็ก ฉันขอแนะนำให้ OP เพื่อไม่สับสนการพึ่งพาการฉีดกับกรอบที่สนับสนุน
RubberDuck

1
พูดได้ดี. และทำไมต้องบูรณาการล้อเมื่อมีคนสร้างหนึ่งที่ดีและรอบแล้ว?
jwenting

ตรงนั้น ยกเว้นว่าฉันไม่จำเป็นต้องเปลี่ยนรหัสการเริ่มต้นแน่นอนไม่มีรหัส instantiation ;-)
Mathieu Guindon

ดูเหมือนห้องสมุด DI ของคุณจะดูด คนดีสามารถเดาคลาสเพื่อสร้างอินสแตนซ์โดยใช้การสะท้อน
Florian Margaine

2
ทุกคนที่ใช้ภาพสะท้อนในการประมวลผลแบบรันไทม์กำลังทำสิ่งที่ผิด การสะท้อนกลับเป็นหนึ่งในเทคโนโลยีเหล่านั้นที่เพียงเพราะคุณสามารถทำสิ่งที่ไม่ได้หมายความว่าคุณควร
gbjbaanb

12
  1. ทำไมเราต้องมี DI (การพึ่งพาการฉีด) เลย?

    กลไก DI แยกการผลิตวัตถุจากการใช้วัตถุ การพึ่งพาวัตถุที่ต้องการส่งมอบอย่างโปร่งใสจากภายนอก ข้อดีของกลไกมีความชัดเจน: คุณสามารถสลับการอ้างอิงได้ตลอดเวลาเช่นใช้วัตถุ Nullเพื่อวัตถุประสงค์ในการทดสอบ

  2. เป็นอย่างไรบ้าง?

    มีหลายวิธีในการบรรลุเป้าหมาย:

    • การฉีดการพึ่งพาผ่านการสร้างคอนสตรัค
    • ฉีดผ่านทะลุ / setter
    • อินเตอร์เฟสการฉีด
  3. เราจำเป็นต้องมี DI Frameworks หรือไม่?

    ไม่เลย. คุณสามารถส่งอินสแตนซ์ทั้งหมดไปยังวัตถุอื่นด้วยตนเองได้ หากคุณมีแอปพลิเคชั่นขนาดเล็กไม่จำเป็นต้องใช้สปริงสำหรับจัดเก็บ

    แต่ในทางกลับกันกรอบการทำงานจะช่วยคุณจัดการวัตถุ:

    • พวกเขาช่วยคุณเดินสายสัมพันธ์ของวัตถุที่ซับซ้อน คุณต้องเขียนโค้ดสำเร็จรูปเพื่อสร้างอินสแตนซ์และส่งไปยังวัตถุที่เหมาะสม

    • พวกเขาช่วยคุณควบคุมเมื่อวัตถุถูกสร้างขึ้น: คุณสามารถสร้างอินสแตนซ์ระหว่างการบูตแอปพลิเคชันได้ แต่ในบางกรณีการสร้างแบบขี้เกียจ - เมื่อจำเป็น - ดีกว่า

    • พวกเขาช่วยคุณควบคุมจำนวนอินสแตนซ์ที่สร้างขึ้น: หนึ่งรายการต่ออายุการใช้งานของแอปพลิเคชันหรือหนึ่งครั้งต่อคำขอ (ในกรณีที่คุณกำลังเขียนโปรแกรมเว็บ)

หากโครงการของคุณมีขนาดที่เหมาะสม - ถ้าคุณรู้สึกว่าจำเป็นต้องเขียนรหัสสำเร็จรูปน้อยลง - มันสมเหตุสมผลโดยใช้กรอบ (DI-) มีข้อดีมากกว่าข้อเสีย


2
คุณสามารถใช้ไลบรารี DI โดยไม่ต้องใช้เฟรมเวิร์กเลย
Florian Margaine

5

กับฤดูใบไม้ผลิมันเป็นเรื่องของความสะดวกสบายเป็นส่วนใหญ่

หากคุณมีคลาสTopLevelที่สร้างคลาสMiddleLevelที่สร้างคลาสLowLevelและคุณรู้ว่าคุณต้องการพารามิเตอร์ตัวสร้างใหม่LowLevelคุณต้องเพิ่มมันเข้าไปTopLevelและเพื่อให้MiddleLevelง่ายเมื่อถึงเวลาที่MiddleLevelจะสร้างLowLevelค่าจะมีให้ เพื่อที่จะสามารถส่งผ่านไปยังตัวสร้างของมัน เมื่อใช้สปริงคุณเพียงแค่เพิ่มคำอธิบายประกอบ

นอกจากนี้ด้วยสปริงคุณสามารถกำหนดการพึ่งพาในไฟล์กำหนดค่าภายนอกแทน xml และสิ่งนี้จะช่วยให้คุณสามารถสร้างระบบใหม่ที่มีการเดินสายที่แตกต่างกันโดยสิ้นเชิง "โดยไม่ต้องเปลี่ยนรหัสใด ๆ " (IMHO สิ่งนี้ผิดพลาดอย่างสมบูรณ์เนื่องจากการแก้ไข xml นั้นไม่ได้แตกต่างจากการแก้ไขโค้ดมากนักและจริงๆแล้วรหัสมักจะมีการตรวจสอบข้อผิดพลาดที่ดีกว่าและการตรวจสอบชนิดที่ไม่ใช่ xml)

อีกสิ่งหนึ่งคือหลายคนกลัวการก่อสร้าง พวกเขาไม่เข้าใจพวกเขาไม่ชอบพวกเขาพวกเขาไม่ต้องการใช้พวกเขา


3
ส่วนใหญ่เห็นด้วยโดยเฉพาะอย่างยิ่งกับคำพูด XML IMHO การกลัวผู้รับเหมาก่อสร้างอาจเป็นเหตุผลที่ไม่ดีที่ใช้กรอบ DI
Robert Harvey

2
IMHO การกลัวผู้สร้างเป็นเหตุผลที่ดีที่จะอยู่ห่างจากการเขียนโปรแกรม C -: =
Mike

5
แต่นี่เป็นข้อได้เปรียบเหนือโรงงาน (คงที่หรืออย่างอื่น) ได้อย่างไร? (ซึ่งมีความได้เปรียบของการเป็นตัวเลือกที่คุณสามารถใช้ตามความเหมาะสมในขณะที่ฤดูใบไม้ผลิที่น่าจะเป็นทั้งหมดหรือไม่มีอะไร afair นั้น)
ริชาร์ดซ่า

@RichardTingle Spring อาจแสดงถึงความได้เปรียบส่วนใหญ่เนื่องจากสิ่งอื่น ๆ ทั้งหมดที่มันทำนอกเหนือจาก DI เพราะเห็นได้ชัดว่าคุณสามารถบรรลุ DI ในหลาย ๆ ทางโรงงานคงที่เป็นหนึ่ง (หนึ่งในสิ่งที่เจ๋งที่สุด แต่ก็ยังอยู่) แต่สิ่งที่คำถามถามคือจำเป็นต้องใช้สปริงเพื่อให้ได้ DI หรือไม่และนั่นคือสิ่งที่ฉันพยายามตอบ: โดยพื้นฐานแล้วมันไม่จำเป็นเพียงแค่ความสะดวกสบาย .
Mike Nakis

นี่คือตัวอย่างของสิ่งที่ DI ไม่ได้ LTopLevel` ไม่ควรสร้างMiddleLevelแต่ควรได้รับเมื่อสร้างTopLevelเป็นอาร์กิวเมนต์สำหรับตัวสร้าง ในทำนองเดียวกันMiddleLevelควรได้รับLowLevelในตัวสร้าง
ชัดเจน

1

ไม่กี่ปีที่ผ่านมาฉันเขียนโปรแกรมเพื่อตรวจสอบหน้าเว็บ, เว็บพอร์ตเล็ต, แม้แต่ตารางฐานข้อมูลบางอย่าง, ที่ บริษัท ที่ฉันเคยทำงานด้วย ฉันต้องการให้ยืดหยุ่นพอที่ผู้ใช้สามารถระบุว่าจอภาพใดที่จะทำงานและมีพารามิเตอร์ใด (URL, การเข้าสู่ระบบ, เกณฑ์ความสำเร็จ ฯลฯ ) ดังนั้นฉันจึงเขียนมันเพื่ออ่านจากไฟล์ XML และใช้ Java reflection เพื่อยกตัวอย่างคลาสที่ระบุและใช้เมธอด setter เพื่อตั้งค่าพารามิเตอร์ที่ระบุ

หลังจากนั้นฉันก็พบว่าสปริงจะทำสิ่งเดียวกันกับคุณและอีกมากมาย

ดังนั้นในกรณีของฉันฉันพบว่า

  1. การใช้เฟรมเวิร์กการพึ่งพาอาศัยช่วยให้โปรแกรมมีความยืดหยุ่นและทำให้ง่ายต่อการระบุวิธีการทำงาน (ภายในพารามิเตอร์ที่กำหนดไว้แน่นอน)

  2. การใช้เฟรมเวิร์ก DI ของ บริษัท ภายนอกช่วยให้คุณไม่ต้องคิดค้นล้อใหม่


4
คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับสาเหตุที่กำหนดคลาสคอนกรีตที่จะใช้ดีกว่าใน xml แทนที่จะอยู่ในไฟล์ java นั่นคือสิ่งที่ฉันไม่เคยเข้าใจ
Richard Tingle

1
มันไม่ได้เป็น bullet Magic แต่ข้อดีอย่างหนึ่งของการใช้ไฟล์ config ก็คืออย่างน้อยในทางทฤษฎีแล้วมันง่ายต่อการแก้ไขมากกว่า code นอกจากนี้ผู้ใช้ที่กำลังเรียกใช้โปรแกรมของคุณสามารถเปลี่ยนแปลงได้ แต่ไม่สามารถเข้าถึงซอร์สโค้ดของคุณได้ ในตัวอย่างที่ฉันให้ไว้กับโปรแกรมการฉีดที่พึ่งพาของฉันบางครั้งฉันจะเปลี่ยนไฟล์กำหนดค่า XML เพื่อให้ฉันสามารถเปลี่ยนวิธีการทำงานของโปรแกรมแม้ว่าฉันจะเป็นคนที่เขียนมัน หากคุณไม่ต้องการการกำหนดค่าภายนอกสามารถทำได้ง่ายกว่าด้วยรหัส ฉันมีงานอื่นที่เราทำ DI ทั้งหมดในโค้ดและทำงานได้ดี
Paul J Abernathy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.