การฉีดขึ้นรูปแบบพึ่งพาจะเพิ่มการมีเพศสัมพันธ์ได้อย่างไร


32

ในหน้า Wikipedia เกี่ยวกับการฉีดพึ่งพาส่วนข้อเสียบอกเรานี้:

การฉีดพึ่งพาเพิ่มการมีเพศสัมพันธ์โดยกำหนดให้ผู้ใช้ระบบย่อยเพื่อให้ความต้องการของระบบย่อยที่

มีการเชื่อมโยงไปยังบทความกับฉีดพึ่งพา

การพึ่งพาการฉีดทำให้คลาสใช้อินเทอร์เฟซแทนการใช้งานที่เป็นรูปธรรม นั่นน่าจะส่งผลให้ข้อต่อลดลงไม่ใช่เหรอ?

ฉันพลาดอะไรไป การพึ่งพาการฉีดเพิ่มการมีเพศสัมพันธ์ระหว่างชั้นเรียนเป็นอย่างไร


2
ฉันไม่แน่ใจว่าใครเป็นคนเขียนรายการข้อเสียนั้น แต่ฉันจะเอามันไปด้วยเม็ดเกลือ ตัวอย่างเช่นฉันเคยเห็น DI ลดขนาดของรหัสฐานลง 2/3 โดยกำจัดรหัสการตั้งค่าซ้ำซ้อนมากมาย
Rob

@RobY ฉันส่วนใหญ่ใช้โรงงานเพื่อฉีดการพึ่งพาและประสบการณ์ของฉันคือมันเพิ่มขนาดรหัส แต่ทำให้การทดสอบง่ายขึ้น
BЈовић

ลองใช้ทางเลือกอื่น ๆ เช่น Registry หรือ Context Passing;) หรือโค้ดอื่นที่เพิ่งยกตัวอย่างวัตถุและดึงคุณสมบัติจาก config ส่วนใหญ่ฉันกำลังพูดถึงความแตกต่างระหว่างตอนนี้และ 15 ปีที่แล้ว
Rob

ที่เกี่ยวข้อง: stackoverflow.com/a/9503612/264697 คำตอบของ Mark Seemann อธิบายว่าการลดการคัปปลิ้งโดยรวมทำได้อย่างไรด้วยการใช้ Dependency Injection
Steven

คำตอบ:


42

แล้วฉันจะพลาดอะไร

การพึ่งพาการฉีดลดการมีเพศสัมพันธ์ระหว่างชั้นเรียนและการพึ่งพา แต่มันจะเพิ่มการเชื่อมต่อระหว่างคลาสและผู้บริโภค (เนื่องจากผู้บริโภคต้องการข้อมูลเพิ่มเติมเพื่อสร้างมัน) และการพึ่งพาและผู้บริโภค (เนื่องจากผู้บริโภคต้องการทราบการพึ่งพาที่จะใช้)

บ่อยครั้งนี่เป็นการแลกเปลี่ยนที่ดี ชั้นไม่ควรจะรู้รายละเอียดเกี่ยวกับการอ้างอิงที่เกินอินเตอร์เฟซและมันควรจะเป็นความรับผิดชอบของโปรแกรมที่จะผูกบิตที่เฉพาะเจาะจงของรหัสด้วยกัน


ใช่การมีเพศสัมพันธ์ลดลงทางเดียวและเพิ่มอีกวิธีหนึ่ง
พอลเดรเปอร์

แต่ผู้บริโภคไม่ได้สร้างมันขึ้นมา นั่นเป็นประเด็น
Casey

@emodendroket - เอ๊ะ การผกผันของการควบคุมช่วยให้ผู้บริโภคไม่ได้สร้างมันขึ้นมา ฉีดพึ่งพาเป็นมุมฉากที่
Telastyn

คุณสร้างความแตกต่างที่ฉันไม่คุ้นเคยเพราะโดยปกติแล้วคำเหล่านี้จะใช้แทนกันได้
Casey

22

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

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

  • ด้วยการสร้างคอนสตรัคผู้สร้างSความต้องการพึ่งพาDและความรู้วิธีการสร้าง
  • ด้วยการฉีดระดับวิธีผู้โทรแต่ละวิธีSที่Dได้รับการฉีดต้องพึ่งพาDและความรู้วิธีการสร้าง

ไม่ว่าในกรณีใดจำนวนของคลาสที่ขึ้นอยู่กับการDเพิ่มขึ้นและความรู้เกี่ยวกับวิธีการสร้างDภาพนิ่งจะต้องมีอยู่ในระบบ สิ่งนี้สร้างการมีเพศสัมพันธ์โดยรวมที่เพิ่มขึ้น


โอเคมันสมเหตุสมผลสำหรับการสร้างและฉีด setter แต่ถ้าใครใช้รูปแบบโรงงานหรือกลยุทธ์การสร้างจะถูกย้ายไปที่นั่นและคลาสใช้เพียงวัตถุที่ถูกแทรก หรือว่าไม่ใช่การฉีดพึ่งพา (การผกผันของการควบคุมเท่านั้น)?
BЈовић

แม้จะมีการฉีดในโรงงานผู้สร้างSความต้องการในการจัดหาโรงงานDซึ่งหมายความว่ามันจำเป็นต้องรู้ว่าSใช้D(หรืออย่างน้อยก็อินเทอร์เฟซของมัน)
Idan Arye

7

ฉันไม่เห็นด้วยอย่างยิ่งที่จะเพิ่มการแต่งงาน

คุณจะมีการเชื่อมต่ออย่างแน่นหนาระหว่างระบบย่อยและการใช้งานที่เป็นรูปธรรมของการพึ่งพา

ด้วยการฉีดพึ่งพาคุณได้แยกระบบย่อยจากการใช้งานของการพึ่งพา

ทำให้การโต้แย้งว่ามันจะเพิ่มการมีเพศสัมพันธ์ระหว่างผู้บริโภคและระบบย่อยนี้เป็นที่น่าสงสัยมากเพราะมันหมายถึงว่าผู้บริโภคอยู่ในขณะนี้ควบคู่ไปกับการพึ่งพาที่จำเป็นโดยระบบย่อยอย่างแน่นหนา ทั้งหมดนั้นหมายความว่าคุณกำลังเขียนโค้ดคู่ที่แน่นหนาที่จับคู่ผู้บริโภคของคุณกับการพึ่งพา นึกคิดALLรหัสของคุณหลุดพ้น

ตัวสร้างการฉีด:

การแก้ปัญหาการพึ่งพาถูกจัดการโดยคอนเทนเนอร์ฉีดพึ่งพาหรือโรงงาน ผู้บริโภคสามารถใช้งานระบบย่อยได้อย่างเป็นรูปธรรมจากถังฉีดพึ่งพาหรือโรงงาน

ผู้บริโภคไม่จำเป็นต้องรู้ว่านวกรรมิกของระบบย่อยนั้นเป็นอย่างไร ไม่มีการเชื่อมต่อกับการพึ่งพาระบบย่อย

วิธีการฉีด:

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

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

กรณีที่ดีที่สุดคือตอนนี้ทุกระบบมีการเชื่อมต่อกันอย่างหลวม ๆ และการฉีดขึ้นอยู่กับการควบคุมจะถูกควบคุมผ่านภาชนะหรือโรงงานฉีด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.