Thursday, November 28, 2013

Review: di-lite.js Dependencies injection ใน javascript แบบเบาๆ

ใน Javascript มีคนทำ Dependencies injection อยู่หลายเจ้า อาทิเช่น
wire.js
inverted
di-lite.js
หรือใน angular.js ก็ได้ข่าวว่ามีให้ใช้เหมือนกัน แต่เนื่องจากงานในปัจจุบันมันเกาะติดกับ Backbone อย่างแนบแน่นจนแงะไม่ออกไปเสียแล้ว เป็นอันว่าตัดทิ้งไป

ลองคุ้ยเขี่ยอยู่นาน ก็ตัดสินใจเอาเจ้าตัว di-lite นี่ล่ะมาใช้ เพราะตัวอื่นมันมากับ dependency พ่วงมาอีกประมาณหนึ่ง แถมต้องเขียนโมดูลแบบ AMD ซึ่งผมก็เพิ่งจะรู้เนี่ยแหละว่าเดี๋ยวนี้เขานิยมเขียนแบบนี้กัน

ด้วยเหตุนี้ ก็เลยเหลือตัวเลือกเพียงหนึ่งเดียว แต่ไม่ใช่ว่าจะตัดใจจากตัวอื่นๆแล้วหรอกนะครับ แต่ขอเอาไว้โอกาสหน้าก็แล้วกัน

เริ่มจากข้อดีก่อน
ข้อดีก็คือ มันใช้ง่ายมากๆ คือเขียนยังไงก็ได้ ขอแค่เวลาที่จะ Register มันรู้จัก Class นั้นก็พอ ทำให้แทบจะไม่กระทบอะไรกับงานที่เคยทำมาแล้วเลยครับ สามารถทยอยถอดส่วนที่ยุ่งเหยิงออกมาได้สบายๆ รวมถึงงานที่กำลังจะทำต่อไปในอนาคตด้วย
ในส่วนที่จำเป็นก็มีมาให้เกือบครบ (อะไรที่ขาดไป เดี๋ยวว่ากันอีกที่ในส่วนของข้อเสีย) อย่างเช่น
  • Constructor arguments
  • กำหนด Strategy ได้ (Singleton, Prototype) 
  • ทำ Circular reference ก็ได้
  • เรียก function อัตโนมัติหลังจากที่ initialize เสร็จแล้วได้
ซึ่งเท่านี้ก็เพียงพอสำหรับความต้องการ(ในตอนนี้นะ)

ที่นี้มาดูข้อเสียกันบ้าง
ข้อเสียที่เด่นๆเลยก็คือ วิธีประกาศ Dependencies มันแนวไปหน่อย ลองไปดูก็ได้ครับ ถ้าเราตัดสินใจจะใช้เจ้าตัวนี้ มันก็มีตราบาป (this.dependencies) ติดอยู่กับ Class ของเราไปตลอดกาล
แถมยังมีผลข้างเคียง ถ้ามีเพื่อนร่วมทีมมาดูโค้ดก็จะงง ว่า ไอ้ property ตัวนี้มันมาจากไหน (ซึ่งปกติ Javascript ก็ดูโค้ดยากด้วยตัวมันเองอยู่แล้ว ในระดับหนึ่ง)
ต่อมาคือเขียน Configuration แยกออกมาต่างหากไม่ได้ ต้อง Register เอาเองล้วนๆ ต่อไปถ้ามีของเยอะๆ อาจจะต้องเขียน Module สำหรับเอาไว้ Register โดยเฉพาะเลยก็เป็นได้
ยังทำ reference ไม่ได้ อย่างเช่นจะเอา module ที่ register ไปแล้วมาเป็น Constructor argument แบบนี้ยังทำไม่ได้ (แต่ set หลังจาก initialize แล้วได้นะ ต้องซิกแซกเอาหน่อย)

ซึ่งไปแอบส่อง Milestone เขามานิดหน่อยแล้วล่ะ คิดว่าคงได้รับการปรับปรุงไปเรื่อยๆ สู้ต่อไปนะ ทาเคชิ

สรุปว่าก็นำมาใช้งานได้ในระดับหนึ่ง อย่างน้อยมันก็ดีกว่ามานั่ง new แล้ว assign ให้เอาเองล่ะนะ แล้วก็ทำให้เขียน Class กับ Test ได้ง่ายขึ้นด้วย ตัวอื่นๆอาจจะเจ๋งกว่านี้ แต่มันต้องเปลี่ยนเยอะ เหนื่อย เอาไว้มีโอกาสทำอะไรเล่นอาจจะเอาตัวอื่นๆมาลองอีกครับ


No comments:

Post a Comment