คำแนะนำเกี่ยวกับการรวม DI / IoC container เข้ากับแอพพลิเคชั่นที่มีอยู่


10

ตอนนี้ฉันกำลังเผชิญหน้ากับการรวมตู้คอนเทนเนอร์ควบคุม (IoC) เข้ากับแอปพลิเคชั่นที่มีอยู่และฉันกำลังมองหาคำแนะนำเกี่ยวกับวิธีที่สามารถทำได้โดยง่ายที่สุดด้วยเป้าหมายสูงสุดของการลดคัปปลิ้ง แม้ว่าโดยทั่วไปแล้วฉันจะไม่จัดชั้นเรียนส่วนใหญ่เป็นวัตถุเทพเจ้าแต่ก็มีความรับผิดชอบมากเกินไปและการพึ่งพาที่ซ่อนอยู่ผ่านสถิตยศาสตร์ซิงเกิลและการขาดการเชื่อมต่อ

นี่คือพื้นหลังเล็กน้อยของความท้าทายที่ต้องเผชิญ:

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

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

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


3
ฉันต้องถามเหตุผลของการทำสิ่งนี้ในตอนนี้ ... อะไรที่ทำให้เกิดการเปลี่ยนแปลงนี้? การบำรุงรักษา? ความสามารถในการขยายเนื่องจากมันจะเพิ่มขึ้นแบบทวีคูณ? นักพัฒนาเบื่อ?
Aaron McIver

1
ฉันเพิ่งเข้าร่วม บริษัท และพยายามแนะนำ "แนวทางปฏิบัติที่ดีที่สุด" บางอย่าง เป้าหมายหลักของฉันคือการเพิ่มความสามารถในการทดสอบและลดการแต่งงาน เราสามารถใช้ DI / IoC สำหรับรหัสใหม่ได้อย่างง่ายดายและไม่ต้องการเปลี่ยนรหัสที่มีอยู่ทั้งหมดในครั้งเดียว แต่ฉันต้องการคำแนะนำเกี่ยวกับวิธีที่เราสามารถเปลี่ยนรหัสที่มีอยู่ให้ดีที่สุดในครั้งต่อไปที่เราทำ การเปลี่ยนแปลงในพื้นที่นั้น จนถึงสิ่งเดียวที่ฉันได้พบทางออนไลน์คือ: code.google.com/p/autofac/wiki/ExistingApplications
Kaleb Pederson

3
เว้นแต่จะมีการทดสอบหน่วย / การรวมอัตโนมัติจำนวนมากในสถานที่ การแก้ไขโครงสร้างพื้นฐานที่มีอยู่เว้นแต่ว่ามีปัญหาเกิดขึ้นเพื่อประโยชน์ในการปฏิบัติที่ดีที่สุดคือการขอให้มีปัญหา แม้ว่าชุดทดสอบ / การรวมระบบของคุณจะแข็งแกร่งฉันยังคงลังเล
Aaron McIver

1
@ Aaron ฉันหวังว่ามันจะไม่ฟังดูเหมือนว่าเรากำลังทำเพื่อประโยชน์สูงสุด เรากำลังทำการเปลี่ยนแปลงเพราะมันยากและช้าในการทำงานกับรหัสที่มีอยู่และทำสิ่งเล็กน้อยในขณะที่เรากำลังทำงานในพื้นที่นั้น เรามีชุดการทดสอบการรวมที่เหมาะสมและการทดสอบหน่วยเล็กน้อยเพื่อรองรับการเปลี่ยนแปลง
Kaleb Pederson

คำตอบ:


8

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

  1. กำหนดระบบย่อยที่สำคัญของแอปพลิเคชันและinterfaceสำหรับแต่ละระบบย่อย อินเตอร์เฟซนี้ควรเพียงกำหนดวิธีการที่ส่วนอื่น ๆ ของระบบจะใช้ในการพูดคุยกับมัน หมายเหตุ: คุณอาจจะต้องใช้เวลามากกว่าหนึ่งผ่านที่นี้
  2. จัดเตรียมการใช้ wrapper ของอินเตอร์เฟสนั้นที่มอบหมายให้กับโค้ดที่มีอยู่ จุดประสงค์ของแบบฝึกหัดนี้คือเพื่อหลีกเลี่ยงการเขียนซ้ำจำนวนมากแต่เพื่อ refactor รหัสเพื่อใช้ส่วนต่อประสานใหม่ - นั่นคือการลดการเชื่อมต่อในระบบของคุณ
  3. ตั้งค่าคอนเทนเนอร์ IoC เพื่อสร้างระบบโดยใช้อินเตอร์เฟสและการนำไปใช้งานที่คุณสร้างขึ้น ในขั้นตอนนี้คุณต้องการดูแล instantiating คอนเทนเนอร์ IoC เพื่อให้สามารถนำแอปพลิเคชันขึ้นมาได้ นั่นคือถ้าคุณอยู่ในสภาพแวดล้อม servlet ตรวจสอบให้แน่ใจว่าคุณสามารถรับ / สร้างภาชนะในinit()วิธีการservlet
  4. ทำสิ่งเดียวกันภายในแต่ละระบบย่อยอีกครั้งคราวนี้เมื่อคุณปรับโครงสร้างคุณกำลังเปลี่ยนการใช้งานต้นขั้วของคุณให้กลายเป็นของจริงซึ่งจะใช้อินเทอร์เฟซเพื่อพูดคุยกับส่วนประกอบ
  5. ทำซ้ำตามความจำเป็นจนกว่าคุณจะมีความสมดุลที่ดีของขนาดส่วนประกอบกับการทำงาน

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

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


คำแนะนำที่ดี ฉันอ้างถึงคำแนะนำอื่น ๆ ที่นี่เช่นกันเมื่อทำการเปลี่ยนแปลงดังกล่าว: code.google.com/p/autofac/wiki/ExistingApplications
Kaleb Pederson

7

รับการทำงานอย่างมีประสิทธิภาพด้วยรหัสมรดกและทำตามคำแนะนำของเขา เริ่มต้นด้วยการสร้างรหัสที่ครอบคลุมและค่อย ๆ เคลื่อนไปสู่แอปพลิเคชันที่มีโครงสร้างดีกว่า พยายามที่จะทำการเปลี่ยนแปลง en masse เป็นสูตรสำหรับภัยพิบัติ


รักหนังสือเล่มนั้น !!
Martijn Verburg

คำแนะนำที่ดี แม้ว่าฉันจะอ่านครึ่งหนึ่งของปีที่แล้วฉันคิดว่าฉันได้รับมากขึ้นจากตอนนี้ที่ฉันเอวลึกในสถานการณ์
Kaleb Pederson

มันตลกคำตอบที่เลือกโดยทั่วไปจะสรุปหนังสือ;) แน่นอนว่า Feathers มีรายละเอียดมากขึ้น
Michael Brown

5

เหตุผลหลักสำหรับการแนะนำ IoC คือการแยกส่วนของโมดูล ปัญหาที่เกิดขึ้นกับ Java โดยเฉพาะคือการเชื่อมต่อที่แข็งแกร่งเป็นพิเศษที่newผู้ให้บริการกำหนดรวมกับนั่นหมายความว่ารหัสการโทรจะรู้ได้อย่างชัดเจนว่าจะใช้โมดูลใด

โรงงานได้รับการแนะนำเพื่อย้ายความรู้นี้ไปยังสถานที่ส่วนกลาง แต่ในที่สุดคุณก็ยังคง hardwire โมดูลในการใช้new/ singleton ที่เก็บผูกพันยากหรือคุณอ่านในไฟล์การกำหนดค่าและใช้การสะท้อน / Class.forName ซึ่งเปราะเมื่อ refactoring .

หากคุณไม่มีเป้าหมายที่ทำให้เป็นโมดูลแล้ว IoC จะไม่ให้อะไรกับคุณ

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

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