Inversion of control & Dependency injection แบบโคตรพื้นฐาน

Rahat Sarawasee
Ascend Developers
Published in
Feb 26, 2020

--

Photo by Mikhail Vasilyev on Unsplash

Before

ก่อนที่เราจะเข้าสู่ content ของบทความนี้เราลองมาดูตัวอย่าง code ด้านล่างนี้กันซักหน่อย โดยสมมติให้ว่าเรามี class A และ B

traditional way

จากตัวอย่าง code ก็ดูไม่มีปัญหาอะไร แต่ถ้าเกิดวันนึงมีการเพิ่ม method เข้ามาแล้วบังเอิญ methodเหล่านั้นเนี่ย ต้องเรียกใช้ class B เหมือนกันนึกภาพที่เราต้องไป new B(); ทุก method ดูครับแค่คิดก็สยองแล้ว จะเขียน unit test ก็ไม่รู้จะ mock object ของ class B ยังไงในเมื่อมันไปถูกสร้างอยู่ใน class A นี่จึงเป็นที่มาของคำว่า “depend” หรือ อีกนัยนึงก็คือ code ของเรานั้นมันผูกมัดกันมากเกินไปนั่นเองครับ

What is Inversion of control ?

Inversion of control เป็น concept รูปแบบนึงที่ช่วยลดความผูกมัดกันระหว่าง module หรือ object เพื่อช่วยให้ code ของเรา clean, maintain ง่าย และ test ง่าย ซึ่งตัว IoC นั้นมีวิธีการ implement หลายแบบ แต่วันนี้เราจะมาพูดถึง Dependency Injection กันครับ

What is Dependency injection ?

Dependency Injection เป็นรูปแบบการ implement แบบนึงของ IoC โดยการ inject object ผ่าน constructor

dependency injection

จากตัวอย่างแรกเราทำการแก้ไข code ของเราจากการสร้าง object ใน method มาเป็นการรับ object ผ่านทาง constructor ของ class แทน อ่าวแล้วมันไปสร้าง object B ตอนไหนอ่ะ ? คำตอบคือทำแบบนี้ครับ new B() ตอนสร้าง object A ไปเลยครับ

แล้วมันดีกว่าวิธีเดิมยังไงอ่ะ ?

Good

  • เขียน unit test ง่ายขึ้นมากๆ เพราะเราสามารถ mock object B จากข้างนอกแล้ว inject ตอนสร้าง object A ได้เลย
  • ช่วยให้ code ของเราดู clean มากขึ้นไม่ต้องคอยมา new เต็มคลาสไปหมด

Bad

  • ถ้าบังเอิญ class B ดัน inject class C แล้ว class C ก็ดัน inject class D ลองนึกภาพตอนสร้าง Object ของ class A ดูครับ ถ้าคิดไม่ออกก็…

Conclusion

Inversion of control เป็น concept หรือ แนวคิดในการช่วยในการลดการผูกมัดกันของ object แต่ Dependency injection เป็นวิธีการรูปแบบนึงใน IoC ที่ช่วยจัดการลดการผูกมัดของ object ลง ซึ่งในสมัยนี้คงไม่มีใครมาทำ Dependency injection แบบนี้แล้ว ในปัจจุบันมี Framework มากมายที่ช่วย support การทำ DI ให้ง่ายขึ้น ที่ฮิตๆเลยก็คงจะเป็น Spring Framework ซึ่งหลายๆ คนคงเคยใช้มาบ้างแล้วแต่อาจจะไม่เก็ทว่าจริงๆ แล้ว Dependency injection มันคืออะไร หวังว่าบทความนี้จะช่วยต่อยอด ให้เข้าใจ dependency injection ไม่มากก็น้อยนะครับ

--

--