ฉันมีโปรเจ็กต์ java ขนาดใหญ่และเราใช้ maven สำหรับวงรอบการสร้างของเรา โครงการนี้มีการใช้อย่างกว้างขวาง - ในโครงการอื่น ๆ ในแอปพลิเคชั่นต่าง ๆ ซึ่งบางส่วนอยู่ในนั้นและบางส่วนอยู่ที่อื่น ... พูดตามตรงแล้วมันเป็นระเบียบนิดหน่อย วัตถุประสงค์) และฉันต้องการทำความสะอาดสักหน่อย นอกจากนี้ยังไม่ผ่านการทดสอบอย่างสมบูรณ์ (มีการเพิ่มบิตจำนวนมากโดยไม่มีหน่วยที่เหมาะสมและการทดสอบการรวม) และมีการทดสอบบางอย่างที่ใช้เวลานานในการรันหรือไม่ผ่านจริง ... (uh-oh) - ดังนั้น การทดสอบจะถูกปิดในวงจรสร้าง maven (อีกครั้ง uh-oh)
ฉันกำลังคิดที่จะแยกโครงการขนาดใหญ่นี้ออกเป็นโครงการขนาดเล็กโดยเฉพาะเช่นโครงการย่อย 'สุดท้าย' (หรือโครงการย่อยหลายโครงการ) จะรับโครงการย่อยต่าง ๆ ที่มันต้องการ
ความคิดของฉันเป็นดังนี้:
- ถ้าฉันแยกโครงการใหญ่ออกเป็นโครงการย่อยต่าง ๆ นี่จะทำให้ชัดเจนว่าความรับผิดชอบของแต่ละโครงการคืออะไร
- โดยแยกเป็นโครงการย่อยฉันสามารถล้างการทดสอบของแต่ละโครงการย่อยทีละรายการและเปิดการทดสอบสำหรับโครงการย่อยนั้นในวงจรการสร้าง maven
ฉันกังวลเล็กน้อยเกี่ยวกับผลกระทบที่อาจเกิดขึ้นกับเวลาสร้าง
- การวางโครงสร้างในโครงการขนาดใหญ่ (เช่นเป็นโครงการย่อยขนาดเล็ก) จะทำให้คอมไพเลอร์ช้าลงหรือไม่
นอกจากนี้ฉันมีข้อกังวลเล็กน้อยเกี่ยวกับผลกระทบที่อาจเกิดขึ้นกับการแก้ไขเวลาใน IDEs (เราใช้ Intellij เป็นหลัก) Intellij ดูเหมือนว่าจะสร้างแต่ละโครงการผ่านแผนผังการพึ่งพา - เช่นถ้า C ขึ้นอยู่กับ B ขึ้นอยู่กับ A และฉันเปลี่ยน A มันจะไม่พยายามสร้าง B ยกเว้นการคอมไพล์และอื่น ๆ อาจเป็นข้อได้เปรียบ แต่ฉันพบว่าถ้า - ตัวอย่างเช่นฉันเปลี่ยนอินเทอร์เฟซใน A ที่ใช้กันอย่างแพร่หลายใน B และ C มันต้องใช้เวลาพอสมควรในการแก้ไขข้อผิดพลาดทั้งหมดจากการเปลี่ยนแปลงนั้น ...
คำถามอื่นคือวิธีใช้คลาสของโรงงาน บางแง่มุมของโครงการขึ้นอยู่กับไหภายนอก บางครั้ง (โชคไม่บ่อย) เหล่านี้มีการปรับปรุงและเราต้องโยกย้าย เรามักจะจัดการเรื่องนี้โดยใช้คลาส Factory ซึ่งชี้ไปที่รุ่นที่ถูกต้องของรหัสภายนอก (ดังนั้นเราไม่จำเป็นต้องเปลี่ยนการใช้งานทั้งหมดตลอดทั้งฐานรหัส)
ในขณะนี้ทั้งหมดอยู่ในโครงการขนาดใหญ่ แต่ฉันคิดว่าการเปลี่ยนไปใช้โครงการย่อยฉันสามารถพัฒนาโครงการใหม่สำหรับการใช้รหัสภายนอกใหม่ตรวจสอบให้แน่ใจว่าโครงการย่อยทำงานได้อย่างสมบูรณ์และผ่านการทดสอบและ จากนั้นสลับคลาส dependencies / factory ในโครงการผู้ใช้ อย่างไรก็ตามสิ่งนี้มีความซับซ้อนมากขึ้นโดยการใช้อินเทอร์เฟซที่ครอบคลุมทั่วทั้งโครงการขนาดใหญ่ ตัวอย่างเช่น
- sub-project A - ประกอบด้วยอินเตอร์เฟส
- sub-project B - ขึ้นอยู่กับ A สำหรับอินเตอร์เฟสและ jar ภายนอกเก่า
- sub-project C - ขึ้นอยู่กับ B (และ A และขวดภายนอกเก่า) และมีคลาส Factory ที่ใช้อินเตอร์เฟสของ B
หากฉันต้องการเปลี่ยนไหภายนอกของ B ฉันสามารถ:
- สร้างโครงการย่อย B_ii - อีกครั้งขึ้นอยู่กับ A และตอนนี้ jar ภายนอกใหม่
- เมื่อทำงานได้อย่างสมบูรณ์ฉันสามารถเพิ่มการพึ่งพาของ C เป็น B_ii และเปลี่ยนคลาสของโรงงานให้ใช้อินเทอร์เฟซการปรับใช้ใหม่
เมื่อใช้งานได้ทั้งหมดฉันสามารถลบการอ้างอิงของ C ไปเป็นต้นฉบับ B และหากต้องการให้ลบโครงการย่อย B
นั่นเป็นวิธีที่สมเหตุสมผลในเรื่องนี้หรือไม่?
ดังนั้นโดยทั่วไปคำถามของฉันคือ:
- ใครบ้างมีประสบการณ์ในการแตกโครงการขนาดใหญ่หรือไม่? มีเคล็ดลับ / กลอุบายที่คุณต้องการแบ่งปันหรือไม่?
- สิ่งนี้มีผลกระทบต่อการพัฒนาและเวลาสร้างของคุณอย่างไร
- คุณสามารถให้คำแนะนำเกี่ยวกับการจัดโครงสร้างของโครงการดังกล่าวได้อย่างไร