การผกผันของการควบคุมเกี่ยวข้องกับการพึ่งพาการผกผันอย่างไร


12

ในบทความจำนวนมากทั่วทั้งเว็บคำว่า Inversion of Control และ Dependency Inversion Principle ดูเหมือนจะสับสนและถูกนำมาใช้เป็นคำพ้องความหมาย (ความสับสนเพิ่มเติมถูกบังคับใช้โดยเครื่องมือที่เรียกว่า "ตู้คอนเทนเนอร์ DI" และ "IoC บทความ Wikipediaทำงานได้ดีมากที่พยายามอธิบายว่า IoC นั้นไม่เหมือนกับ DI:

inversion of control (IoC) อธิบายถึงการออกแบบที่ส่วนที่กำหนดเองของโปรแกรมคอมพิวเตอร์ได้รับการไหลของการควบคุมจากไลบรารีทั่วไปที่สามารถใช้ซ้ำได้

ดังนั้น DIP จึงเกี่ยวกับการมีโมดูลของคุณขึ้นอยู่กับ abstractions มากกว่าการใช้งานที่เป็นรูปธรรม

และ IoC กำลังควบคุมการไหลของโปรแกรมของคุณไปยังโมดูลอื่น และสิ่งหนึ่งที่คุณสามารถมีโมดูลนี้คือแก้ไขการพึ่งพาที่รันไทม์

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

ดังนั้นนี่เป็นคำถามที่ฉันยังไม่สามารถเข้าใจได้:

  • ความสัมพันธ์ที่แท้จริงระหว่าง IoC และกรมทรัพย์สินทางปัญญาคืออะไร? IoC ทำหน้าที่เป็นเครื่องมือในการดำเนินการของ DIP หรือไม่?
  • ทำไมเครื่องมือสำหรับการแก้ปัญหาการพึ่งพาที่เรียกว่าทั้ง DI- และ IoC-container นี่ก็หมายความว่า DI และ IoC เป็นสิ่งเดียวกัน

หมายเหตุ : คำถามนี้ไม่ได้ซ้ำซ้อนกับ DI และ IoC ต่างกันเพราะคำถามหลังถามเกี่ยวกับการฉีดการพึ่งพาไม่ใช่การพึ่งพาการพึ่งพา



@gnat ไม่ได้โปรดดูการแก้ไขของฉัน
Andre Borges

เห็นด้วย, ฉันพลาดไปขอโทษ
gnat

2
IMO คำตอบง่ายๆคือ "พวกเขาเหมือนกัน" IoC เป็นอีกชื่อหนึ่งสำหรับการผกผันของการพึ่งพาและทั้งสองเป็นวิธีการบรรลุการฉีดพึ่งพา ฉันเห็นว่า "การพึ่งพาการกลับกัน" เป็นคำที่ไม่ช่วยเหลืออย่างลึกล้ำเพราะมันสับสนง่ายเกินไปกับการฉีด ดังนั้นจึงมี DI (การฉีด) และ IoC เป็นวิธีการบรรลุการผกผันของการพึ่งพา / การควบคุมผ่านการฉีด
David Arno

คำตอบ:


6

มีบทความดีในเว็บไซต์ของมาร์ตินฟาวเลอร์ที่มีเป็นบทเฉพาะเกี่ยวกับความแตกต่างระหว่างกรมทรัพย์สินทางปัญญา, DI และ IoC ส่วนสำคัญของมัน (ตามที่คัดลอกมาจากเว็บไซต์นั้น) คือ

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

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


2
IoC เป็นเรื่องเกี่ยวกับผู้ที่เริ่มต้นการโทร - ใครที่กำลังโทรหาอะไร ถ้าฉันเขียนISomeInterface object = container.Resolve<ISomeInterface>()ว่า IoC หรือไม่
Andre Borges

1
สิ่งที่คุณเขียนคือการนำไปใช้ในรูปแบบ locater ของบริการ นี่คือ IoC ด้วย ไม่ใช่ IoC คือ ISomeInterface object = new MyClass () ดังนั้นการโทรที่มีความหมายก็คือ "การเรียกไปสู่การสร้างอินสแตนซ์" (หรือผู้ที่โทรหา 'ใหม่')
Sjoerd222888

1
"DIP ตรงกันข้ามกับระดับของ abstraction ในข้อความที่ส่งจากโค้ดของคุณไปยังสิ่งที่กำลังเรียก" ฟังดูไร้สาระสำหรับฉัน การผกผันอยู่ที่ไหน เขาอธิบายถึงสิ่งที่เป็นนามธรรมที่ไม่พึ่งพิง
David Arno

@DavidArno คุณกำลังบอกว่าเราไม่สามารถไว้วางใจเว็บไซต์ของ Martin Fowler ได้หรือไม่?
holdenmcgrohen

@holdenmcgrohen มันเป็นความคิดเห็นของเขาต่อสิ่งต่างๆ เพียงเพราะมันเป็น Martin Fowler ไม่ได้ทำให้เป็นจริง เขาผิดในบางครั้ง IMO เช่นเกี่ยวกับ "โมเดลข้อมูลโลหิตจาง" บางครั้งเขาก็ฉลาดมาก ในโอกาสนี้ฉันคิดว่าเขาผิดเหมือนกันเพราะมันไม่สมเหตุสมผล
David Arno
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.