แนะนํา
รูปแบบการถอดแบบแบบ MC (MVC) เป็นรูปแบบหลักของการพัฒนาเว็บมาหลายทศวรรษ อย่างไรก็ตาม เมื่อโปรแกรมเติบโตในความซับซ้อนและความต้องการผู้ใช้เพิ่มขึ้น หลายทีมพบว่าโมเดลของพวกเขา -- ชั้นที่มีส่วนในข้อมูลและตรรกะของธุรกิจ -- โครงสร้างแบบอย่างง่ายนํามาสู่ความยืดหยุ่น, ตรรกะซ้ํากัน, และโครงสร้างโค้ดพื้นฐานที่ต่อต้านการเปลี่ยนแปลง โครงสร้างพื้นฐานพื้นฐานที่บรรลุเป้าหมายของโครงสร้างแบบ วินัย บทความนี้จัดทําการพัฒนาอย่างครอบคลุมสําหรับแบบจําลองการจําลองของ MVC, การออกแบบและงานออกแบบแบบแบบแบบอย่างที่มีประสิทธิภาพ
การ เข้าใจ รูป แบบ ของ MVC
รูปแบบ MVC แยกโปรแกรมเป็นส่วนประกอบ 3 ส่วนจากกันใช้งาน:
- [FLT: 0]. Model: จัดการข้อมูล, กฎธุรกิจ และตรรกะที่ต่อเนื่อง. แหล่งที่มาเดียวของความจริงสําหรับโดเมนของสมัคร.
- [[FLT: 0].View: ถวายส่วนติดต่อผู้ใช้ โดยปกติแล้วอ่านข้อมูลจากรุ่น (หรือแสดงตัวอย่างนําเสนอ).
- [FLT: 0] Contlorer: จัดจัดการผู้ใช้เข้า, นําเสนอการโต้ตอบระหว่างโมเดลกับมุมมอง, และการปรับปรุงสถานะตามต้องการ
ขณะที่มุมมองและตัวควบคุมมีความสําคัญ โมเดลนี้ก็คือที่ที่ความซับซ้อนทางปัญญาส่วนใหญ่อาศัยอยู่ โมเดลที่มีโครงสร้างอย่างดี จะช่วยให้โปรแกรมสามารถปรับตัวเข้ากับความต้องการใหม่ได้ จัดการกับการจราจรที่เพิ่มขึ้น และรองรับส่วนเชื่อมต่อหลายระบบ (เช่น web, pp, API, May) โดยไม่ต้องมีการปรับเปลี่ยน
หลัก การ พื้น ฐาน สําหรับ แบบ จําลอง ที่ รู้ จัก กัน ดี
ก่อน จะ ดํา ลึก เข้า ไป ใน แบบ ที่ เฉพาะ เจาะจง จําเป็น ต้อง มี หลัก การ พื้น ฐาน บาง อย่าง ภาย ใน:
- [FLT: 0] หน้าที่รับผิดชอบ: โมเดลหรือคลาสแต่ละรุ่นควรมีเหตุผลหนึ่งที่นิยามไว้อย่างดีให้เปลี่ยนแปลง ตัวอย่างเช่น แยกการเข้าถึงข้อมูลจากการตรวจสอบธุรกิจ
- [FLT: 0] การชดเชยความกังวล: แง่มุมที่แตกต่างกันของโปรแกรม (การยอมรับ, การแจ้งข้อมูล เป็นต้น) ควรดําเนินการในชั้นที่แยกออกมาและเรียบเรียง
- [FLT: 0] อย่าซ้ําตัวเอง (DRY): ตรรกะซ้ํากันในหลายโมเดลหรือตัวควบคุมนําไปสู่การบํารุงรักษาฝันร้าย แทนการแยกพฤติกรรมทั่วไปเข้าไปในบริการหรือลักษณะนิสัยที่สามารถนํากลับมาใช้ได้
- [FLT: 0] การหักเห: มอดูลระดับสูงควรขึ้นอยู่กับนามธรรม (interfaces) ไม่ใช่กระบวนการสร้างคอนกรีต ซึ่งจะช่วยให้สามารถสลับฐานข้อมูล, cancing Profiles หรือบริการภายนอกได้โดยไม่ต้องเขียนตรรกะทางธุรกิจใหม่อีกครั้ง
ออกแบบโดเมนแบบ Driven (DDD)
ดี ดี ดี ดี สนับสนุน ให้ ผู้ พัฒนา จัด ระบบ จําลอง รอบ ๆ อาณา เขต หลัก ธุรกิจ แทน ที่ จะ เป็น ห่วง เรื่อง เทคนิค.
ภาษา ที่ มี หลาก หลาย
กําหนดคําศัพท์ที่ใช้ร่วมกันโดยนักพัฒนา ผู้เชี่ยวชาญโดเมน และผู้ถือหุ้น (institute) ใช้คําเดียวกันในรหัส, เอกสารเอกสาร และการสนทนา ตัวอย่างเช่น โปรแกรมอีคอมเม็กซ์ควรมีคลาส [FLT: 0] ที่สะท้อนพฤติกรรมของโลกแห่งความเป็นจริง ไม่ใช่แบบทั่วไป (FLT: 1)
คอนเท็กซ์ที่เชื่อมอยู่
โปรแกรมขนาดใหญ่ประกอบด้วยกลุ่มย่อยหลาย ๆ ตัว DD ขอแนะนําให้กําหนดขอบเขตที่ชัดเจนระหว่างบริบทต่าง ๆ -- ตัวอย่างเช่น การแยกรุ่นสําหรับการจัดการ, รายการสินค้า และการขนส่ง โดยภายในบริบทที่จํากัดไว้แต่ละบริบท จะสามารถปรับให้เข้ากับโดเมนดังกล่าวได้โดยไม่ต้องมีการปล่อยข้อมูลข้ามขอบเขต การแยกประเภทนี้เป็นส่วนสําคัญในการขยายทีมพัฒนาแบบอิสระ
หมวดหมู่
การรวมกลุ่มของวัตถุโดเมนที่ถูกดูแลเป็นหน่วยเดียว องค์กรรากรับประกันความสอดคล้อง ตัวอย่างเช่น การรวม อาจรวม และ (FLT: 4) องค์กรทั้งหมดเข้าถึงผ่านรากของโครงสร้างได้ รูปแบบนี้จะลดความสัมพันธ์ที่ซับซ้อน และลดการปรับเปลี่ยนระบบ
เพื่อ ดํา ลึก ลึก ลง ไป อีก จง พาด พิง ถึง [FLT: 0] มาร์ ติน ฟาว เลอร์ ได้ นํา การ นํา เข้า DDD.
สถาปัตยกรรมเลเยอร์
สถาปัตยกรรมชั้น ๆ เพิ่มขึ้นแยกความกังวลโดยการ ผนวกแบบจําลองเป็น tieers ตรรกะที่แตกต่างกัน:
- [FLT: 0]. Donumber เลเยอร์: บรรจุองค์กรธุรกิจ วัตถุค่า และบริการโดเมน เลเยอร์นี้ไม่มีความขึ้นต่อกันระหว่างโครงสร้างพื้นฐาน
- [FLT: 0] เลเยอร์: วงออร์เคสตร้าใช้กรณี, วัตถุโดเมน, และการจัดการการค้า มันขึ้นอยู่กับชั้นโดเมน
- [FLT: 0] เลเยอร์ชั้นชั้นชั้นชั้นชั้น: การต่อกร, การคมนาคม, การโทรภายนอก, และความกังวลทางเทคนิคอื่น ๆ ขึ้นอยู่กับโดเมนและชั้นโปรแกรม
- [FLT: 0] เลเยอร์: ควบคุมและมุมมองที่โต้ตอบกับเลเยอร์ของโปรแกรมผ่านทางอินเทอร์เฟส (FLT: 1)
การแยกทางนี้ ทําให้แน่ใจว่าการเปลี่ยนแปลงเทคโนโลยีฐานข้อมูล กลยุทธ์การจับต้อง หรือกรอบของยูไอไม่ได้ถูกรื้อค้น ด้วยตรรกะหลักของธุรกิจ
การ บริจาค และ การ บริการ
มี สอง แบบ ที่ มี ค่า มาก เป็น พิเศษ สําหรับ การ รักษา แบบ จําลอง ให้ สะอาด และ ยืดหยุ่น ได้:
รูปแบบการกลับค่า
การตั้งค่าคลังข้อมูล รองรับตรรกะการเข้าถึงข้อมูล โดยให้ส่วนติดต่อแบบชุดสะสมกับวัตถุโดเมน แทนการกระจายข้อมูลในฐานข้อมูลผ่านตัวควบคุม คุณจะเรียก [FLT: 5] นามธรรมนี้ช่วยให้การสลับข้อมูล (เช่น จาก MySQL ไป PostgrQL หรือแม้กระทั่งการจัดเก็บข้อมูลในการทดสอบ (in-mory) ด้วยผลกระทบน้อยที่สุด
เลเยอร์ของบริการ
บริการมีตรรกะทางธุรกิจที่ไม่เป็นธรรมชาติขององค์กรเดียว ตัวอย่างเช่น [FLT: 6] อาจมีการประสานงานตรวจสอบความถูกต้อง, ราคา, และรายการสินค้า เมื่อวางลําดับบริการ บริการขึ้นอยู่กับการย้ายสถานะและโดเมน แต่ยังคงอนิจจังของฐานข้อมูล การแยกนี้ยังช่วยให้ใช้งานใช้งานได้โดยผ่านตัวควบคุม, งานเบื้องหลัง, และ APIs
สําหรับการอ่านเพิ่มเติม ดู [FLT: 0] รูปโครงร่างของฟลอเลอร์ .
ข้อมูลการถ่ายโอนวัตถุ (DTOs) และโมเดลมุมมอง
การเปิดเผยโมเดลโดเมนของคุณเต็มไปยังชั้นมุมมอง หรือลูกข่าย API ภายนอก ทําให้เกิดการจับคู่แน่น และมักจะเปิดเผยรายละเอียดภายในที่ไม่จําเป็น แต่ให้ใช้ DTOs เพื่อแปลงข้อมูลให้ตรงกับที่ต้องการ
- [FLT: 0]. ถอดรหัส: การเปลี่ยนแปลงไปยังโดเมนไม่ได้ทําลายลูกค้า API โดยอัตโนมัติ.
- [FLT: 0] ความปลอดภัย: สนามเซนซิทีฟ (เช่น ID ภายใน, การตรวจสอบเวลา) สามารถยกเลิกได้
- [FLT: 0] Perporance: DTOs สามารถตัดแต่งได้โดยรวมเฉพาะสนามที่ต้องการ โดยจุดปลายเฉพาะ, ลดขนาดดาวน์โหลด.
ดูโมเดลนี้ ทําหน้าที่คล้าย ๆ กับชั้นนําเสนอ โดยมีเฉพาะข้อมูลมุมมองที่จําเป็นต้องแสดง (รวมเข้ากับรูปแบบตรรกะอื่น ๆ เช่น วัน หรือจํานวนทั้งหมด)
ปรับแก้ความไวชัตเตอร์ในฐานข้อมูลเพื่อความจุภาพ
แม้สถาปัตยกรรมแบบที่สะอาดที่สุดจะล้มเหลว หากการเข้าถึงฐานข้อมูลมีความไม่มีประสิทธิภาพ
การทําดัชนี
การวิเคราะห์รูปแบบการค้นหาและสร้างดัชนีบนคอลัมน์ที่ใช้ [FLT: 7] [FLT: 8]] และ[FLT: 8] [FLT: 9] ประโยค overdexing สามารถเขียนช้า ดังนั้นวัดและติดตาม (FLT: 9)
สืบค้นเมื่อ Kinga
ใช้คลังข้อมูลแบบ Redis หรือ memced เพื่อเก็บค่าแกรี่ราคาแพง ค่าแคชที่ใช้ไม่ได้ของคุณ เหมาะกับโดเมนของคุณ (โดยเวลา, ไดรฟ์เหตุการณ์ หรือคู่มือ)
การ ก่อ สร้าง และ การ ทํา งาน แบบ เกียจ คร้าน
ไม่ต้องโหลดข้อมูลขนาดใหญ่เข้าหน่วยความจํา ใช้แบบ petriation หรือแบบตั้งเคอร์เซอร์ หรือ ออฟเซติชัน ใน ORM เปิดใช้งานแบบขี้เกียจสําหรับความสัมพันธ์ของเด็ก แต่จงระวังการสอบถาม N+1 -- เมื่อจําเป็น ให้ใช้การโหลด (เช่น [FLT: 10] ในการใช้งาน record หรือ (FT: 11) ใน SQL).
กําลังโหลดแบบ Lazy vsPreque
การเลือกกลยุทธ์การโหลดที่ถูกต้อง เป็นสิ่งจําเป็นสําหรับการทํางาน
- [FLT: 0] เรียกข้อมูลแบบย่อ: ข้อมูลทั้งหมดจะถูกโหลดเมื่อเข้าถึงเท่านั้น ซึ่งมีประสิทธิภาพสําหรับการปฏิบัติการแบบเดียว แต่สามารถลดประสิทธิภาพในการใช้งานวน (ปัญหา N+1 ที่น่าหวาดกลัว).
- [FLT: 0]. เรียกข้อมูล: เรียกข้อมูลความสัมพันธ์ที่จําเป็นทั้งหมดขึ้นไปหน้าการสอบถาม โดยเมื่อคุณทราบมุมมองหรือบริการที่ต้องการข้อมูลที่เกี่ยวข้อง หลายโอพีเอ็มสนับสนุนการโหลดหรือวางวางจําหน่ายที่กระตือรือร้นโดยตรง
วิธีปฏิบัติ คือปริยายในการโหลดข้อมูลเพื่อเรียกพาธที่รู้จักและใช้การโหลดแบบขี้เกียจ ซึ่งยากจะเข้าถึงได้เท่านั้น โปรดวิเคราะห์ความจุในฐานข้อมูลของคุณภายใต้ความเป็นจริง เพื่อค้นหาความสมดุลที่ถูกต้อง
วางแผนการไล่ระดับสีทางแนวนอน
เมื่อโปรแกรมของคุณโตเกินเครื่องแม่ข่ายเพียงเครื่องเดียว ชั้นแบบจะต้องรองรับการแจกจ่าย:
- [FLT: 0] ใช้โมเดลไร้ความสามารถ:[[FLT: 1) หลีกเลี่ยงการเก็บข้อมูลผู้ใช้งาน หรือข้อมูลที่ต้องการในโมเดล ใช้การฉีดแบบติดต่อเพื่อให้บริการที่ไม่มีสถานะ
- [FLT: 0] การต่อเนื่องแบบต่อเนื่องแบบรวดเร็ว: รุ่นที่จะเดินทางผ่านเครือข่าย (เช่น โดย Json API) ควรออกแบบสําหรับการจัดลําดับต่อเนื่องอย่างรวดเร็ว ใช้ DTOs แทนกราฟที่ซับซ้อนด้วยอ้างอิงแบบวงกลม
- [FLT: 0] Datatatase Sroughing: For languages ขนาดใหญ่มากๆ ข้อมูลพาร์ติชันในฐานข้อมูลหลาย ๆ ฐานข้อมูล ชั้นคลังของคุณควรจะอนุมานเรื่องตรรกะที่ขัดต่อความซับซ้อน โดยอุดมคติมีกลยุทธ์ในการแยกรากรวม
- [FLT: 0]. continuous=. ในระบบกระจายข้อมูล] หลีก เลี่ยงการแจกจ่ายที่ล็อคทรัพยากรที่ข้ามบริการ แทนการยอมรับความสอดคล้องกันโดยใช้รูปแบบเหตุการณ์-ไดรฟ์เช่น เหตุการณ์และคิวข้อความ
การใช้งานที่ดีที่สุด
การ ป้องกัน ที่ ขึ้น กับ ความ เป็น ไป ได้
ใช้ตู้ฉีดน้ําที่เชื่อมโยง เพื่อแก้ปัญหาความขึ้นต่อกันของคลังแพกเกจและการบริการ การสร้างแบบจําลองการถอดส่วนออกจากกระบวนการสร้างคอนกรีตนี้ และทําให้มันง่ายต่อการสลับส่วนประกอบสําหรับการทดสอบหรือปรับขนาด
การไม่จํากัด
เมื่อเป็นไปได้ วัตถุออกแบบที่จะใช้ในการถอดเสียบ (FLT: 12) คลาสที่ลดข้อผิดพลาดที่เกี่ยวข้องกับการเปลี่ยนชื่อและความต่อเนื่อง นอกจากนี้ แบบจําลองการถอดภาพนั้นสามารถทดสอบและจัดเก็บข้อมูลได้ง่ายขึ้น
การ ทดสอบ ใน การ แยก ตัว
การทดสอบของหน่วยบริการและโดเมน ไม่ควรต้องใช้ฐานข้อมูลหรือกับดักกรอบการจับต้อง ใช้การจําลองการจําลองหรือการจําลองค่าภายใน
เลเยอร์ก่อนการแก้กระดาษ
เมื่อทําการผนวกเข้ากับระบบมรดก หรือระบบเอพีไอภายนอก จงสร้างเลเยอร์ที่ต่อต้านการปนเปื้อน ซึ่งจะแปลระหว่างรุ่นของคุณกับรุ่นของระบบภายนอก ซึ่งจะป้องกันไม่ให้การเปลี่ยนแปลงภายนอก รั่วไหลเข้าไปในโดเมนของคุณ
การ พิจารณา เอกสาร และ รหัส
โครงสร้างแบบมักจะกลายเป็นแบบ OPAque เมื่อเวลาผ่านไป รักษาบันทึกการตัดสินใจสถาปัตยกรรม (ADRs) และบังคับใช้ความสอดคล้องผ่านโค้ดรีวิว รุ่นที่มีเอกสารกํากับดี ๆ จ่ายเงินให้เมื่อนําสมาชิกในทีมใหม่ขึ้นมา หรือกลับมาทบทวนในโมดูลอีกเดือนต่อมา
รูปแบบการวน
การจับต้องแบบจําลองการแยกประเภทเพื่อความจุในรูปแบบ MVC ไม่ใช่การฝึกแบบแบบเดียวแต่เป็นการใช้ระเบียบวินัยอย่างต่อเนื่อง โดยยึดหลักการเช่น การแยกปัญหา การใช้สถาปัตยกรรม DDD และชั้น และโครงสร้างชั้นอย่างชาญฉลาด การใช้โครงสร้างแบบรีพอสซิต การบริการ และ DTOs คุณสามารถสร้างชั้นแบบที่สามารถเติบโตได้กับโปรแกรมของคุณ การใช้ข้อมูลแบบ Opimative language เลือกกลยุทธ์การโหลดที่ถูกต้อง และการวางแผนการวางผังโปรแกรมของคุณต่อไป เพื่อให้แน่ใจว่าโปรแกรมของคุณยังคงดําเนินการอยู่ ภายใต้การโหลดของโครงการของคุณ โปรดจําไว้ว่า สถาปัตยกรรมนั้นเกี่ยวข้องกับการจําหน่ายสินค้า -- การวางแผงวัดผลลัพธ์ และวัดผลลัพธ์
สําหรับการสํารวจเพิ่มเติม โปรดพิจารณาศึกษา (FLT: 0) บทความเกี่ยวกับหนังสือออกแบบโดเมนของเอแวนส์ (FLT:1) และ ReLT: [FLT] Reckricing รูปแบบของ . ทรัพยากรเหล่านี้ทําให้เข้าใจลึกซึ้งมากขึ้น ในรูปแบบที่กล่าวมานี้.