หลักการผกผันของการพึ่งพาและพึ่งพา“ โปรแกรมไปยังส่วนต่อประสานไม่ใช่การใช้งาน”


12

ฉันกำลังพยายามที่จะเข้าใจว่าหลักการการพึ่งพาการพึ่งพาแตกต่างจากหลักการของ "โปรแกรมไปยังส่วนต่อประสานไม่ใช่การใช้งาน"

ฉันเข้าใจว่า "โปรแกรมไปยังอินเทอร์เฟซไม่ใช่การใช้งาน" หมายถึงอะไร ฉันยังเข้าใจว่ามันช่วยให้การออกแบบมีความยืดหยุ่นและบำรุงรักษามากขึ้นได้อย่างไร

แต่ฉันไม่เข้าใจว่าหลักการการพึ่งพาการพึ่งพานั้นแตกต่างจากหลักการ "โปรแกรมไปยังอินเทอร์เฟซไม่ใช่การใช้งาน"

ฉันอ่านเกี่ยวกับ DIP ในหลาย ๆ ที่บนเว็บและมันก็ไม่ได้ทำให้ฉันสับสน ฉันยังไม่เห็นว่าหลักการสองข้อแตกต่างจากกันอย่างไร ขอบคุณสำหรับความช่วยเหลือของคุณ.

คำตอบ:


26

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

"การพึ่งพาผกผันหลักการ" กล่าวว่าวัตถุที่ไม่ควรควบคุมการสร้าง dependencies มันก็แค่สิ่งที่ควรโฆษณาจะต้องพึ่งพาและให้โทรให้มัน แต่ไม่ได้ระบุว่าการพึ่งพาควรเป็นรูปธรรมหรืออินเทอร์เฟซ

ฉันจะอธิบายความแตกต่างด้วยรหัส C #

ตัวอย่างต่อไปนี้ขึ้นอยู่กับประเภทที่เป็นรูปธรรมและควบคุมการสร้างของการพึ่งพาของตัวเอง มันไม่เป็นไปตาม"โปรแกรมไปยังอินเตอร์เฟส" หรือ "การพึ่งพาการกลับกัน":

public class ThingProcessor
{
    MyThing _myThing;

    public ThingProcessor()
    {
        _myThing = new MyThing();
    }

    public void DoSomething()
    {
        _myThing.DoIt();
    }
}

ตัวอย่างต่อไปนี้ขึ้นอยู่กับอินเตอร์เฟส แต่มันควบคุมการสร้างของการพึ่งพาของตัวเอง มันตาม "โปรแกรมไปยังอินเตอร์เฟส" แต่ไม่ใช่ "การพึ่งพาการกลับกัน":

public class ThingProcessor
{
    IMyThing _myThing;

    public ThingProcessor()
    {
        _myThing = ThingFactory.GiveMeANewMyThing();
    }

    public void DoSomething()
    {
        _myThing.DoIt();
    }
}

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

public class ThingProcessor
{
    MyThing _myThing;

    public ThingProcessor(MyThing myThing)
    {
        _myThing = myThing;
    }

    public void DoSomething()
    {
        _myThing.DoIt();
    }
}

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

public class ThingProcessor
{
    IMyThing _myThing;

    public ThingProcessor(IMyThing myThing) // using an interface
    {
        _myThing = myThing;
    }

    public void DoSomething()
    {
        _myThing.DoIt();
    }
}

1
ภาพประกอบที่ยอดเยี่ยมของความแตกต่าง
Rory Hunter

8
สิ่งที่คุณกำลังพูดถึงคือการฉีดขึ้นอยู่กับ และการผกผันของการพึ่งพาและการฉีดพึ่งพาเป็นสองสิ่งที่แตกต่างกัน
ร่าเริง

1
@Eurhoric ฉันกำลังพูดถึง Dependency Inversion Principle ซึ่งเป็นแนวคิดที่เป็นนามธรรมโดยใช้ Dependency Injection เป็นตัวอย่างการใช้งานที่เป็นรูปธรรม ฉันเข้าใจความแตกต่าง
Eric King เมื่อ

1
@EricKing จากนั้นคุณควรพูดอย่างชัดเจนว่าในคำตอบของคุณแทนที่จะไป "หลักการ" การพึ่งพาการพึ่งพา "ว่า ... " ซึ่งผิดอย่างเห็นได้ชัดถ้าคุณอ่านคำตอบของฉัน
ร่าเริง

1
ฉันเห็นด้วยกับความสุข หลักการการพึ่งพาการพึ่งพาอาศัยกล่าวว่าเลเยอร์ระดับสูงของโค้ดควรขึ้นอยู่กับส่วนของโค้ดระดับล่างไม่ใช่ในทางกลับกัน เช่นควรขึ้นอยู่กับอินเตอร์เฟซที่จัดตั้งขึ้นโดยPrintStream ByteOutputStreamการพึ่งพาการฉีดไม่ได้พูดถึงว่าใครควรขึ้นอยู่กับใคร
Doval

5

พวกเขามักจะเป็นสิ่งเดียวกัน หากคุณอ่านหลักการผกผันของการพึ่งพาอาศัยคืออะไรและทำไมมันถึงสำคัญ? และหลักการผกผันของการพึ่งพา (Dependency Inversion Principle ) คุณจะตระหนักถึง "หลักการ" สองข้อที่พูดกันโดยทั่วไปเกี่ยวกับสิ่งเดียวกัน

  • โมดูลระดับสูงไม่ควรขึ้นอยู่กับโมดูลระดับต่ำ ทั้งสองควรขึ้นอยู่กับ abstractions
  • บทคัดย่อไม่ควรขึ้นอยู่กับรายละเอียด รายละเอียดควรขึ้นอยู่กับ abstractions

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


นี่ควรเป็นคำตอบที่ได้รับการยอมรับคำตอบที่โหวตมากที่สุดคือความเข้าใจผิด
Sameh Deabes

2

การเชื่อมต่อเป็นวิธีหนึ่งในการนำ DI มาใช้ หากคุณระบุอินเทอร์เฟซเป็นพารามิเตอร์ในวิธีการสร้างของคลาสคุณสามารถมอบวัตถุใด ๆ ที่คุณต้องการให้กับวิธีการสร้างนั้นตราบใดที่วัตถุนั้นใช้อินเทอร์เฟซของพารามิเตอร์ตัวสร้าง

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

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