คู่มือสถาปัตยกรรมแอป

คู่มือนี้ครอบคลุมแนวทางปฏิบัติแนะนำและสถาปัตยกรรมที่แนะนำสำหรับการสร้างแอปที่มีประสิทธิภาพและมีคุณภาพสูง

ประสบการณ์ของผู้ใช้แอปบนอุปกรณ์เคลื่อนที่

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

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

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

หลักการทั่วไปเกี่ยวกับสถาปัตยกรรม

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

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

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

การแยกข้อกังวล

หลักการที่สําคัญที่สุดที่ควรปฏิบัติตามคือการแยกข้อกังวล ข้อผิดพลาดที่พบบ่อยคือการเขียนโค้ดทั้งหมดใน Activity หรือ Fragment คลาสที่อิงตาม UI เหล่านี้ควรมีเฉพาะตรรกะที่จัดการการโต้ตอบระหว่าง UI กับระบบปฏิบัติการเท่านั้น การทำคลาสเหล่านี้ให้เรียบง่ายที่สุดเท่าที่จะทำได้จะช่วยหลีกเลี่ยงปัญหาต่างๆ เกี่ยวกับวงจรชีวิตของคอมโพเนนต์ และปรับปรุงความสามารถในการทดสอบของคลาสเหล่านี้

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

สร้าง UI ของไดรฟ์จากโมเดลข้อมูล

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

รูปแบบถาวรเหมาะสําหรับเหตุผลต่อไปนี้

  • ผู้ใช้จะไม่สูญเสียข้อมูลหากระบบปฏิบัติการ Android ทำลายแอปของคุณเพื่อเพิ่มพื้นที่เก็บข้อมูล

  • แอปจะยังคงทำงานต่อไปได้ในกรณีที่การเชื่อมต่อเครือข่ายไม่เสถียรหรือไม่พร้อมใช้งาน

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

แหล่งข้อมูลที่เชื่อถือได้เพียงแหล่งเดียว

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

รูปแบบนี้มีประโยชน์หลายประการ ดังนี้

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

ในแอปพลิเคชันแบบออฟไลน์ก่อน แหล่งข้อมูลสําหรับข้อมูลแอปพลิเคชันมักจะเป็นฐานข้อมูล ในบางกรณี แหล่งที่มาของข้อมูลที่เป็นความจริงอาจเป็น ViewModel หรือแม้แต่ UI

โฟลว์ข้อมูลแบบทิศทางเดียว

เรามักใช้หลักการแหล่งข้อมูลที่ถูกต้องแห่งเดียวในคู่มือที่มีรูปแบบการไหลของข้อมูลแบบทิศทางเดียว (UDF) ใน UDF state จะไหลไปในทิศทางเดียวเท่านั้น เหตุการณ์ที่แก้ไขการไหลของข้อมูลในทิศทางตรงกันข้าม

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

รูปแบบนี้รับประกันความสอดคล้องของข้อมูลได้ดีกว่า มีโอกาสเกิดข้อผิดพลาดน้อยลง แก้ไขข้อบกพร่องได้ง่ายขึ้น และนำประโยชน์ทั้งหมดของรูปแบบ SSOT มาใช้ได้

ส่วนนี้จะสาธิตวิธีจัดโครงสร้างแอปตามแนวทางปฏิบัติแนะนำ

เมื่อพิจารณาถึงหลักการทั่วไปด้านสถาปัตยกรรมที่กล่าวถึงในส่วนก่อนหน้า แอปพลิเคชันแต่ละรายการควรมีเลเยอร์อย่างน้อย 2 เลเยอร์ ดังนี้

  • เลเยอร์ UI ที่แสดงข้อมูลแอปพลิเคชันบนหน้าจอ
  • เลเยอร์ข้อมูลที่มีตรรกะทางธุรกิจของแอปและแสดงข้อมูลแอปพลิเคชัน

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

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

สถาปัตยกรรมแอปสมัยใหม่

สถาปัตยกรรมแอปสมัยใหม่นี้สนับสนุนให้ใช้เทคนิคต่อไปนี้และอื่นๆ

  • สถาปัตยกรรมแบบตอบสนองและแบบเป็นชั้น
  • การรับส่งข้อมูลแบบทิศทางเดียว (UDF) ในเลเยอร์ทั้งหมดของแอป
  • เลเยอร์ UI ที่มีตัวเก็บสถานะเพื่อจัดการความซับซ้อนของ UI
  • Coroutine และ Flow
  • แนวทางปฏิบัติแนะนำเกี่ยวกับการนําเข้าพึ่งพา

ดูข้อมูลเพิ่มเติมได้ที่ส่วนต่อไปนี้ หน้าสถาปัตยกรรมอื่นๆ ในสารบัญ และหน้าคำแนะนำที่มีสรุปแนวทางปฏิบัติแนะนำที่สําคัญที่สุด

เลเยอร์ UI

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

เลเยอร์ UI ประกอบด้วย 2 ส่วน ได้แก่

  • องค์ประกอบ UI ที่แสดงผลข้อมูลบนหน้าจอ คุณสร้างองค์ประกอบเหล่านี้ได้โดยใช้ฟังก์ชัน View หรือ Jetpack Compose
  • ตัวเก็บสถานะ (เช่น คลาส ViewModel) ที่เก็บข้อมูล แสดงข้อมูลต่อ UI และจัดการตรรกะ
ในสถาปัตยกรรมทั่วไป องค์ประกอบ UI ของเลเยอร์ UI จะขึ้นอยู่กับตัวเก็บสถานะ ซึ่งก็ขึ้นอยู่กับคลาสจากเลเยอร์ข้อมูลหรือเลเยอร์โดเมนที่ไม่บังคับ
รูปที่ 2 บทบาทของเลเยอร์ UI ในสถาปัตยกรรมแอป

ดูข้อมูลเพิ่มเติมเกี่ยวกับเลเยอร์นี้ได้ที่หน้าเลเยอร์ UI

ชั้นข้อมูล

ชั้นข้อมูลของแอปมีตรรกะทางธุรกิจ ตรรกะทางธุรกิจคือสิ่งที่ให้คุณค่าแก่แอปของคุณ ซึ่งประกอบด้วยกฎที่กําหนดวิธีที่แอปสร้าง จัดเก็บ และเปลี่ยนแปลงข้อมูล

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

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

คลาสที่เก็บมีหน้าที่รับผิดชอบงานต่อไปนี้

  • การเปิดเผยข้อมูลแก่ส่วนที่เหลือของแอป
  • เปลี่ยนข้อมูลไว้ในที่เดียว
  • การแก้ไขความขัดแย้งระหว่างแหล่งข้อมูลหลายแห่ง
  • การแยกแหล่งที่มาของข้อมูลจากส่วนอื่นๆ ของแอป
  • มีตรรกะทางธุรกิจ

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับเลเยอร์นี้ได้ที่หน้าชั้นข้อมูล

เลเยอร์โดเมน

ชั้นโดเมนเป็นเลเยอร์ที่ไม่บังคับซึ่งอยู่ตรงกลางระหว่าง UI กับชั้นข้อมูล

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

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

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับเลเยอร์นี้ได้ที่หน้าเลเยอร์โดเมน

จัดการการพึ่งพาระหว่างคอมโพเนนต์

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

  • Dependency Injection (DI): Dependency Injection ช่วยให้คลาสกำหนดการอ้างอิงได้โดยไม่ต้องสร้าง รันไทม์จะกำหนดให้คลาสอื่นเป็นผู้รับผิดชอบในการระบุข้อกำหนดเหล่านี้
  • ตัวระบุบริการ: รูปแบบตัวระบุบริการเป็นรีจิสทรีที่คลาสสามารถรับข้อมูลที่เกี่ยวข้องได้แทนการสร้าง

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

เราขอแนะนำให้ทำตามรูปแบบการฉีด Dependency และการใช้คลัง Hilt ในแอป Android Hilt จะสร้างออบเจ็กต์โดยอัตโนมัติด้วยการเรียกใช้ผ่านลําดับชั้นของ Dependency ให้การรับประกันเกี่ยวกับ Dependency ในเวลาคอมไพล์ และสร้างคอนเทนเนอร์ Dependency สําหรับคลาสเฟรมเวิร์ก Android

แนวทางปฏิบัติแนะนำโดยทั่วไป

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

แม้ว่าคำแนะนำต่อไปนี้จะไม่บังคับ แต่ในกรณีส่วนใหญ่ การทำตามคำแนะนำเหล่านี้จะทำให้ฐานโค้ดมีความเสถียร ทดสอบได้ และดูแลรักษาได้ในระยะยาว

อย่าจัดเก็บข้อมูลไว้ในคอมโพเนนต์แอป

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

ลดการพึ่งพาคลาส Android

คอมโพเนนต์ของแอปควรเป็นคลาสเดียวที่ใช้ API ของเฟรมเวิร์ก Android SDK เช่น Context หรือ Toast การแยกคลาสอื่นๆ ในแอปออกจากคลาสเหล่านี้จะช่วยในการทดสอบและลดการเชื่อมโยงภายในแอป

กำหนดขอบเขตความรับผิดชอบที่ชัดเจนระหว่างโมดูลต่างๆ ในแอป

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

เปิดเผยข้อมูลจากแต่ละโมดูลให้น้อยที่สุด

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

มุ่งเน้นที่หัวใจหลักที่ไม่เหมือนใครของแอปเพื่อให้โดดเด่นกว่าแอปอื่นๆ

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

พิจารณาวิธีทำให้แต่ละส่วนของแอปสามารถทดสอบแยกกันได้

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

ประเภทมีหน้าที่รับผิดชอบต่อนโยบายการทำงานพร้อมกัน

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

เก็บข้อมูลที่เกี่ยวข้องและเป็นปัจจุบันไว้มากที่สุด

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

ประโยชน์ของสถาปัตยกรรม

การใช้สถาปัตยกรรมที่ดีในแอปจะมีประโยชน์มากมายต่อทีมโครงการและทีมวิศวกร ดังนี้

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

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

ตัวอย่าง

ตัวอย่างต่อไปนี้จาก Google แสดงสถาปัตยกรรมแอปที่ดี โปรดดูตัวอย่างการใช้งานคำแนะนำนี้

These samples showcase different architectural approaches to developing Android apps. In its different branches you'll find the same app (a TODO app) implemented with small differences. In this branch you'll find: User Interface built with Jetpack

This template is compatible with the latest stable version of Android Studio.

Jetcaster is a sample podcast app, built with Jetpack Compose. The goal of the sample is to showcase building with Compose across multiple form factors (mobile, TV, and Wear) and full featured architecture. To try out this sample app, use the latest

Discover the latest app development tools, platform updates, training, and documentation for developers across every Android device.

อัปเดตแล้ว Aug 23, 2024

Discover the latest app development tools, platform updates, training, and documentation for developers across every Android device.

อัปเดตแล้ว Aug 23, 2024

Discover the latest app development tools, platform updates, training, and documentation for developers across every Android device.

อัปเดตแล้ว Aug 23, 2024