ข้อมูลเบื้องต้นเกี่ยวกับ Dependency Injection คืออะไรและควรใช้เมื่อใด

บทนำ

ในวิศวกรรมซอฟต์แวร์การฉีดพึ่งพาเป็นเทคนิคที่วัตถุหนึ่ง (หรือวิธีการคงที่) ให้การอ้างอิงของวัตถุอื่น การพึ่งพาคือวัตถุที่สามารถใช้ได้ (บริการ)

นั่นเป็นคำจำกัดความของ Wikipedia แต่ก็ยังเข้าใจได้ไม่ยาก ดังนั้นมาทำความเข้าใจกันดีกว่า

ก่อนที่จะเข้าใจความหมายในการเขียนโปรแกรมก่อนอื่นเรามาดูความหมายโดยทั่วไปก่อนเพราะจะช่วยให้เราเข้าใจแนวคิดได้ดีขึ้น

การพึ่งพาอาศัยกันหมายถึงการพึ่งพาบางสิ่งเพื่อการสนับสนุน เช่นเดียวกับถ้าฉันบอกว่าเราใช้โทรศัพท์มือถือมากเกินไปก็หมายความว่าเราต้องพึ่งพาโทรศัพท์เหล่านี้

ดังนั้นก่อนที่จะไปสู่การฉีดพึ่งพาก่อนอื่นเรามาทำความเข้าใจว่าการพึ่งพาในการเขียนโปรแกรมหมายถึงอะไร

เมื่อคลาส A ใช้ฟังก์ชันการทำงานบางอย่างของคลาส B ดังนั้นคลาส A จึงมีการพึ่งพาคลาส B

ใน Java ก่อนที่เราจะสามารถใช้เมธอดของคลาสอื่นได้เราต้องสร้างอ็อบเจ็กต์ของคลาสนั้นก่อน (กล่าวคือคลาส A ต้องสร้างอินสแตนซ์ของคลาส B)

ดังนั้นการถ่ายโอนงานในการสร้างวัตถุไปยังบุคคลอื่นและใช้การอ้างอิงโดยตรงเรียกว่าการฉีดขึ้นต่อกัน

เหตุใดฉันจึงควรใช้การฉีดแบบพึ่งพา?

สมมติว่าเรามีคลาสของรถยนต์ที่มีวัตถุต่างๆเช่นล้อเครื่องยนต์เป็นต้น

ที่นี่คลาสรถมีหน้าที่สร้างวัตถุอ้างอิงทั้งหมด จะเกิดอะไรขึ้นหากเราตัดสินใจทิ้งMRFWheelsในอนาคตและต้องการใช้Yokohama Wheels?

เราจะต้องสร้างวัตถุรถขึ้นใหม่ด้วยการพึ่งพาโยโกฮาม่าใหม่ แต่เมื่อใช้การฉีดแบบพึ่งพา (DI) เราสามารถเปลี่ยนล้อในขณะรันไทม์ได้ (เนื่องจากสามารถฉีดการอ้างอิงที่รันไทม์แทนที่จะเป็นเวลาคอมไพล์)

คุณสามารถคิดว่า DI เป็นคนกลางในรหัสของเราซึ่งทำงานทั้งหมดในการสร้างวัตถุล้อที่ต้องการและส่งมอบให้กับคลาส Car

ทำให้คลาสรถของเราเป็นอิสระจากการสร้างวัตถุของล้อแบตเตอรี่ ฯลฯ

โดยทั่วไปการฉีดพึ่งพามีสามประเภท:

  1. การฉีดตัวสร้าง:การอ้างอิงถูกจัดเตรียมผ่านตัวสร้างคลาส
  2. setter injection:ไคลเอนต์แสดงวิธี setter ที่หัวฉีดใช้ในการฉีดยา
  3. การฉีดอินเทอร์เฟซ:การพึ่งพามีวิธีการฉีดที่จะฉีดการพึ่งพาลงในไคลเอนต์ใด ๆ ไคลเอนต์ต้องใช้อินเทอร์เฟซที่แสดงเมธอด setter ที่ยอมรับการอ้างอิง

ดังนั้นตอนนี้ความรับผิดชอบของการฉีดขึ้นอยู่กับ:

  1. สร้างวัตถุ
  2. รู้ว่าคลาสใดต้องการอ็อบเจกต์เหล่านั้น
  3. และจัดหาวัตถุเหล่านั้นทั้งหมด

หากมีการเปลี่ยนแปลงใด ๆ ในวัตถุ DI จะตรวจสอบและไม่ควรเกี่ยวข้องกับคลาสที่ใช้วัตถุเหล่านั้น วิธีนี้หากวัตถุเปลี่ยนไปในอนาคตความรับผิดชอบของ DI ในการจัดหาวัตถุที่เหมาะสมให้กับคลาสนี้

การผกผันของการควบคุม - แนวคิดเบื้องหลัง DI

สิ่งนี้ระบุว่าคลาสไม่ควรกำหนดค่าการอ้างอิงแบบคงที่ แต่ควรกำหนดค่าโดยคลาสอื่นจากภายนอก

เป็นหลักการที่ห้าของSOLID -หลักการพื้นฐาน 5 ประการของการเขียนโปรแกรมเชิงวัตถุและการออกแบบโดยUncle Bobซึ่งระบุว่าคลาสควรขึ้นอยู่กับนามธรรมไม่ใช่จากคอนกรีต (พูดง่ายๆคือฮาร์ดโค้ด)

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

หมายเหตุ: หากคุณต้องการเรียนรู้เกี่ยวกับหลักการSOLIDโดย Uncle Bob คุณสามารถไปที่ลิงค์นี้

ประโยชน์ของการใช้ DI

  1. ช่วยในการทดสอบหน่วย
  2. รหัสแผ่นหม้อไอน้ำจะลดลงเนื่องจากการเริ่มต้นของการพึ่งพาจะกระทำโดยส่วนประกอบของหัวฉีด
  3. การขยายแอปพลิเคชันจะง่ายขึ้น
  4. ช่วยเปิดการเชื่อมต่อแบบหลวมซึ่งเป็นสิ่งสำคัญในการเขียนโปรแกรมแอปพลิเคชัน

ข้อเสียของ DI

  1. เป็นเรื่องที่ซับซ้อนในการเรียนรู้และหากใช้มากเกินไปอาจนำไปสู่ปัญหาการจัดการและปัญหาอื่น ๆ
  2. ข้อผิดพลาดเกี่ยวกับเวลาคอมไพล์จำนวนมากถูกผลักไปที่รันไทม์
  3. กรอบการพึ่งพาอาศัยกันถูกนำไปใช้กับการสะท้อนหรือการเขียนโปรแกรมแบบไดนามิก สิ่งนี้สามารถขัดขวางการใช้งาน IDE อัตโนมัติเช่น "ค้นหาข้อมูลอ้างอิง" "แสดงลำดับชั้นการโทร" และการอ้างอิงที่ปลอดภัย

คุณสามารถใช้การฉีดพึ่งพาด้วยตัวคุณเอง (Pure Vanilla) หรือใช้ไลบรารีหรือเฟรมเวิร์กของบุคคลที่สาม

ไลบรารีและกรอบงานที่ใช้ DI

  • ฤดูใบไม้ผลิ (ชวา)
  • Google Guice (Java)
  • กริช (Java และ Android)
  • ปราสาทวินด์เซอร์ (.NET)
  • เอกภาพ (.NET)

หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการฉีดการพึ่งพาคุณสามารถดูแหล่งข้อมูลด้านล่าง:

Java Dependency Injection - บทเรียนตัวอย่างรูปแบบการออกแบบ DI - JournalDev

การใช้การพึ่งพาการฉีดใน Java - บทนำ - บทช่วยสอน - Vogella

การผกผันของคอนเทนเนอร์ควบคุมและรูปแบบการฉีดพึ่งพา - Martin Fowler

หวังว่าจะช่วยได้!

หากคุณชอบบทความนี้และต้องการอ่านบทความที่น่าทึ่งอื่น ๆ โปรดติดตามฉันที่นี่ (Bhavya Karia) และแสดงการสนับสนุนของคุณเนื่องจากเป็นแรงจูงใจให้ฉันเขียนเพิ่มเติม

หากคุณมีคำถามหรือข้อเสนอแนะใด ๆ สำหรับฉันมากกว่าที่จะเชื่อมต่อบน LinkedIn, Twitter, Facebook

แก้ไข 1:

ขอบคุณ Sergey Ufocoder ตอนนี้บทความนี้ได้รับการแปลงเป็นภาษารัสเซียแล้ว เพื่อนชาวรัสเซียของฉันและใครก็ตามที่สามารถอ่านภาษารัสเซียได้โปรดอ่าน

ลิงก์ไปยังบทความ

นอกจากนี้หากคุณต้องการใช้ DI ใน JavaScript และกำลังมองหาไลบรารี Jo Surikat ขอแนะนำให้คุณลองใช้ห้องสมุดของเขา

Di-Ninja

Nicolas Froidure แนะนำไลบรารี DI ที่ยอดเยี่ยมอีกหนึ่งรายการใน JavaScript

มีด

แก้ไข 2:

หากคุณเป็นนักพัฒนา PHP ก็ไม่ต้องกังวลคุณได้รับความคุ้มครองเช่นกัน Gordon Forsythe ขอแนะนำห้องสมุดที่น่าทึ่งแห่งนี้ซึ่งคุณทุกคนอาจอยากลองใช้

auryn

ขอบคุณสำหรับคำพูดที่ดีที่ฉันได้รับ แบ่งปันบทความเพื่อให้ผู้คนได้รับประโยชน์มากขึ้นเรื่อย ๆ

หากคุณได้เรียนรู้สิ่งใดสิ่งหนึ่งหรือสองอย่างโปรดแบ่งปันเรื่องราวนี้!