Screen Shot 2558-09-10 at 11.22.07 AM
เคยอธิบายเรื่อง Dependency Injection ต่างจาก Dependency Inversion Principle อย่างไรนะ ?
แต่พอกลับไปอ่านทบทวน คิดว่ามันยาวไป และอาจจะงงสำหรับคนเริ่มต้นใหม่ ๆ

จึงลองไปหาข้อมูลเพิ่มเติ่ม
พบบทความเรื่อง Dependency Injection Demystified โดยคุณ James Shore
ซึ่งอธิบายได้อย่างดี และ เข้าใจง่ายมาก ตั้งแต่ปี 2006 แล้ว
ดังนั้นจึงเอามาแปลกันนิดหน่อย

เริ่มต้นด้วยประโยคที่โดนใจมาก ๆ สำหรับบทความนี้คือ

“Dependency Injection” is a 25-dollar term for a 5-cent concept.”

หมายความว่า
Dependency Injection ไม่ใช่คำที่ดูแย่อะไร
มันเป็นแนวคิด และ เครื่องมือที่ดีมาก ๆ
แน่นอนว่ามันมีความเรียบง่ายอย่างมาก
แต่เรามักทำการอธิบายให้มันดูยากเท่านั้นเอง
ส่งผลให้นักพัฒมาใหม่กลัวแนวคิดนี้ หรือ ไม่รู้จักซะอย่างนั้น !!

สามารถอธิบายแบบง่าย ๆ และ สั้น ๆ ด้วย 3 ขั้นตอนดังนี้

1. Dependency Non-Injection

โดยปกติใน class หนึ่ง ๆ
เมื่อต้องการใช้งาน method ของอีก class
จะต้องทำการ new instance ของ object ที่ต้องการเรียกใช้ขึ้นมา
โดยสิ่งนั้นเราเรียกว่า “dependency”
แต่เรามักจะเรียกมันว่า variable หรือ บางครั้งอาจจะเป็น instance variable ก็ได้

ตัวอย่างของ instance variable ที่เป็น dependency

จากตัวอย่างจะเห็นว่าทั้งสอง class มันผูกมัดกันอย่างมาก !!
ตัวแปร myDatabase หรือ dependency
ถูกสร้างใน constructor นั่นเอง

2. Dependency Injection เรียกย่อ ๆ ว่า DI

ถ้าเราต้องการส่ง variable/dependency หรือ ตัวแปรชนิด DatabaseThingie เข้ามาที่ constructor ล่ะ
แสดงว่า เราต้องสร้าง constructor ขึ้นมาอีกตัวสิ
เพื่อรองรับตัวแปรชนิด DatabaseThingie
ดังนั้นผู้เรียกใช้งานสามารถส่งตัวแปรชนิด DatabaseThingie เข้ามาที่ constructor ได้เลย

วิธีการนี้คือ การ inject dependency เข้ามาทาง constructor
หรือเรียกว่า Dependency Injection นั่นเอง

ตัวอย่าง code เป็นดังนี้

สังเกตไหมว่า
เราสามารถส่ง variable/dependency ผ่าน method หรือ setter method ก็ได้เช่นกัน
แล้วแต่ความต้องการของคุณ

3. ทำ Dependency Injection ไปทำไมล่ะ ?

เป็นคำถามที่น่าสนใจมาก ว่า เราทำแบบข้อ 2 ไปทำไปล่ะ ?
มันมีประโยชน์อะไรบ้าง ?
นอกจากทำให้เราสามารถส่ง variable/dependecy เข้ามาได้

ทำให้ทั้งสอง class ไม่ผูกมัดกันไงล่ะ
ส่งผลให้การทดสอบการทำงานในส่วนนี้มันง่ายมาก ๆ

เนื่องจากสามารถทำการ Mock/Stub DatabaseThingie ได้เลย
ซึ่งเราไม่จำเป็นต้องเรียกใช้งาน class DatabaseThingie จริง ๆ
ซึ่งมันจำเป็นมาก ๆ สำหรับการทดสอบระบบงาน

ตัวอย่าง code การทดสอบเป็นดังนี้

นี่แหละคือ Dependency Injection ง่ายไหมล่ะ ?

เพียงแค่เราทำงานส่ง variable/dependency มาเท่านั้นเอง
น่าจะพอทำให้เข้าใจกันบ้างนะครับ
เนื่องจากไม่ใช่แนวคิดที่ยากอะไรเลย

Reference Website
http://www.martinfowler.com/articles/injection.html
http://www.theserverside.com/news/1321158/A-beginners-guide-to-Dependency-Injection