คู่มือการแยกโมดูลของแอป Android

โปรเจ็กต์ที่มีโมดูล Gradle หลายโมดูลเรียกว่าโปรเจ็กต์แบบหลายโมดูล คำแนะนำนี้ครอบคลุมแนวทางปฏิบัติแนะนำและรูปแบบที่แนะนำสำหรับการพัฒนา แอป Android แบบหลายโมดูล

ปัญหาเกี่ยวกับโค้ดเบสที่เพิ่มขึ้น

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

การแยกส่วนคืออะไร

การแยกส่วนคือแนวทางปฏิบัติในการจัดระเบียบโค้ดเบสเป็นส่วนต่างๆ ที่มีการเชื่อมต่อกันอย่างหลวมๆ และมีข้อมูลทั้งหมดอยู่ในส่วนนั้นๆ แต่ละส่วนคือโมดูล แต่ละโมดูลจะแยกกันต่างหากและมีวัตถุประสงค์ที่ชัดเจน การแบ่งปัญหาออกเป็นปัญหาย่อยๆ ที่เล็กลงและแก้ได้ง่ายขึ้น จะช่วยลดความซับซ้อนในการออกแบบและดูแลรักษาระบบขนาดใหญ่

รูปที่ 1: กราฟการขึ้นต่อกันของโค้ดเบสแบบหลายโมดูลตัวอย่าง

ประโยชน์ของการแยกส่วน

การแยกส่วนมีประโยชน์มากมาย แม้ว่าแต่ละส่วนจะมุ่งเน้นไปที่การปรับปรุง ความสามารถในการบำรุงรักษาและคุณภาพโดยรวมของโค้ดเบส ตารางต่อไปนี้ สรุปประโยชน์หลัก

ประโยชน์ สรุป
การนำกลับมาใช้ใหม่ การแยกส่วนช่วยให้มีโอกาสในการแชร์โค้ดและสร้างแอปหลายแอปจากรากฐานเดียวกัน ซึ่งโมดูลก็คือองค์ประกอบพื้นฐาน แอปควรเป็นผลรวมของฟีเจอร์ต่างๆ โดยฟีเจอร์จะจัดระเบียบเป็นโมดูลแยกกัน ฟังก์ชันการทำงานที่โมดูลหนึ่งๆ มีให้อาจเปิดใช้หรือไม่เปิดใช้ในแอปหนึ่งๆ ก็ได้ เช่น :feature:news อาจเป็นส่วนหนึ่งของเวอร์ชันเต็มและแอป Wear แต่ไม่ใช่ส่วนหนึ่งของเวอร์ชันเดโม
การควบคุมระดับการเข้าถึงอย่างเข้มงวด โมดูลช่วยให้คุณควบคุมสิ่งที่แสดงต่อส่วนอื่นๆ ของโค้ดเบสได้อย่างง่ายดาย คุณสามารถทำเครื่องหมายทุกอย่างยกเว้นอินเทอร์เฟซสาธารณะเป็น internal หรือ private เพื่อป้องกันไม่ให้มีการใช้อินเทอร์เฟซดังกล่าวภายนอกโมดูล
การนำส่งที่ปรับแต่งได้ การนำส่งฟีเจอร์ Play ใช้ความสามารถขั้นสูงของ App Bundle ซึ่งช่วยให้คุณนำส่งฟีเจอร์บางอย่างของแอปแบบมีเงื่อนไขหรือตามคำขอได้

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

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

ข้อผิดพลาดที่พบบ่อย

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

ข้อผิดพลาดที่พบบ่อยมีดังนี้

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

การแยกส่วนเป็นเทคนิคที่เหมาะกับฉันไหม

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

ตัวอย่าง