การออกแบบเชิงสถาปัตยกรรม บทที่ 8 การออกแบบเชิงสถาปัตยกรรม
วัตถุประสงค์ เพื่อทำความรู้จักกับรูปแบบเชิงสถาปัตยกรรม เพื่อให้เข้าใจการออกแบบเชิงสถาปัตยกรรม และการออกแบบเชิงละเอียด เพื่อให้เข้าใจการเกาะกลุ่มกัน และการพึ่งพากัน
บทนำ ขั้นตอนการออกแบบซอฟต์แวร์ สถาปนิกซอฟต์แวร์ (Software Architect) จะต้องพิจารณาลักษณะโครงสร้างของซอฟต์แวร์ ประกอบด้วย ส่วนประกอบ และความสัมพันธ์ระหว่างส่วนประกอบและคำนึงถึงรูปแบบเชิงสถาปัตยกรรมของซอฟต์แวร์ การออกแบบซอฟต์แวร์ แบ่งเป็น 2 ประเภท การออกแบบเชิงสถาปัตยกรรม (Architectural Design) การออกแบบเชิงละเอียด (Detailed Design)
การออกแบบเชิงสถาปัตยกรรม (Architectural Design) การออกแบบที่มองภาพรวมของซอฟต์แวร์ ซึ่งเกี่ยวข้องกับอุปกรณ์ฮาร์ดแวร์ ซอฟต์แวร์ เครือข่ายคอมพิวเตอร์ การออกแบบรายงาน การออกแบบส่วนต่อประสานกับผู้ใช้ ฐานข้อมูล และไฟล์ต่าง ๆ
การออกแบบเชิงละเอียด (Detailed Design) การปรับโครงสร้างสถาปัตยกรรมให้ตรงกับความต้องการของผู้ใช้ การออกแบบมอดูล การแบ่งมอดูลออกเป็นฟังก์ชันย่อย และการออกแบบเชิงโครงสร้าง วัตถุประสงค์ของการออกแบบสถาปัตยกรรมโปรแกรม หรือ แผนภูมิโครงสร้าง เพื่อเป็นประโยชน์สำหรับนักเขียนโปรแกรมต่อไป
รูปแบบเชิงสถาปัตยกรรม การเลือกรูปแบบเชิงสถาปัตยกรรม (Architectural Style) ให้กับซอฟต์แวร์ มีหลายรูปแบบ แตกต่างกันตามลักษณะของโครงสร้าง
การออกแบบเชิงสถาปัตยกรรมแบบ Pipe and Filters Pipe เป็นเสมือนท่อส่งข้อมูลนำเข้าไปยังกระบวนการเปลี่ยนรูปข้อมูล Filter เหมือนตัวกรองข้อมูลจนได้ผลลัพธ์
การออกแบบเชิงสถาปัตยกรรมแบบ Call and Return Main Program Controller Subprogram Application Subprogram การออกแบบที่มีลักษณะของโครงสร้างควบคุมแบบลำดับชั้นและบนลงล่าง
การออกแบบเชิงสถาปัตยกรรมแบบ Client/Server เครื่องไคลเอนต์ที่อยู่บนเครื่องคอมพิวเตอร์เครื่องใดเครื่องหนึ่งส่งคำร้องขอ (Request) บริการไปยังเครื่องเซิร์ฟเวอร์ จากนั้น เซิร์ฟเวอร์จะประมวลผลตามความต้องการที่ได้รับ แล้วส่งผล (Replay ) ของบริการกลับไปยังเครื่องไคลเอนต์ที่ขอใช้บริการ
การออกแบบเชิงสถาปัตยกรรมแบบ Client/Server กรณีมีเซิร์ฟเวอร์หลายตัว Client A
การออกแบบเชิงสถาปัตยกรรมแบบ Model View Controller เป็นการออกแบบที่แยกส่วนการทำงานแต่ละส่วนให้เป็นอิสระต่อกัน คือ แบบจำลอง (Model) มุมมอง (View) ตัวควบคุม(Controller)
การออกแบบเชิงสถาปัตยกรรมแบบเลเยอร์ Java API OS API Kernel จัดโครงสร้างระบบย่อยหรือส่วนประกอบต่าง ๆ ในมุมมองแบบลำดับชั้น โดยแต่ละเลเยอร์ คือส่วนประกอบย่อยซึ่งจะทำงานในแต่ละด้านของซอฟต์แวร์และสามารถทำงานร่วมกับเลเยอร์ด้านนอกได้
การออกแบบเชิงสถาปัตยกรรมแบบฐานข้อมูลเป็นศูนย์กลาง การออกแบบที่มีฐานข้อมูลเป็นศูนย์กลาง และผู้ใช้สามารถเข้าถึงข้อมูลในฐานข้อมูลได้โดยตรง
การออกแบบเชิงสถาปัตยกรรมแบบ Three Tier การออกแบบที่มีลักษณะคล้ายกันแบบฐานข้อมูลเป็นศูนย์กลาง และสามารถ ปรับเปลี่ยนการออกแบบให้มีลักษณะเป็น n-tier ได้
การออกแบบเชิงสถาปัตยกรรม การออกแบบเชิงสถาปัตยกรรม (Architectural Design) มองภาพรวมของการออกแบบซอฟต์แวร์ เรียกอีกชื่อหนึ่งว่า “การออกแบบระดับสูง (High-Level Design)” คือ การกำหนดโครงสร้างของซอฟต์แวร์ในมุมมองระดับบน โดยแสดงให้เห็นถึงส่วนประกอบ คุณลักษณะ และความสัมพันธ์ของส่วนประกอบ ภายใต้รูปแบบเชิงสถาปัตยกรรมในแบบต่าง ๆ การออกแบบเชิงสถาปัตยกรรมเกิดจากความต้องการที่ไม่เป็นฟังก์ชัน การออกแบบเชิงละเอียด คือการออกแบบมอดูลที่เกิดจากความต้องการเชิงฟังก์ชัน ความต้องการที่ไม่เป็นฟังก์ชัน
การออกแบบเชิงสถาปัตยกรรม ความสัมพันธ์ระหว่างความต้องการ การออกแบบเชิงสถาปัตยกรรมและการออกแบบเชิงละเอียด
ตัวอย่างการออกแบบเชิงสถาปัตยกรรมของบ้าน
การออกแบบเชิงละเอียด (Detailed Design) การออกแบบเชิงนำไปปฏิบัติ (Implementation Design) คือ การอธิบายรายละเอียดแต่ละส่วนประกอบของซอฟต์แวร์ เพื่อเป็นประโยชน์สำหรับการเขียนโปรแกรมให้มากที่สุด การแตกฟังก์ชันเป็นส่วนย่อย (Functional Decomposition) คือ การแบ่งมอดูลออกเป็นมอดูลย่อย ในปัจจุบัน นิยมใช้ในโปรแกรมประยุกต์บนเว็บ
การแตกฟังก์ชันของมอดูล
การแตกฟังก์ชันของมอดูลอีกรูปแบบ
การเกาะกลุ่มกัน การเกาะกลุ่มกัน ( Cohesion) คือ การเกาะกลุ่มกันระหว่างมอดูล วัตถุ หรือ ส่วนประกอบต่าง ๆ โดยคำนึงถึงดีกรีของความสัมพันธ์ (Degree of Relatedness) ภายในมอดูล วัตถุ หรือ ส่วนประกอบนั้น ๆ
การพึ่งพากัน (Coupling) การติดต่อระหว่างข้อมูลมอดูล โดยมอดูลจะส่งผ่านพารามิเตอร์ไปยังมอดูลอื่น เรียกกว่า Function Call เมื่องานสิ้นสุด มอดูลที่ถูกเรียกจะส่งค่ากลับคืนมา เรียกกว่า Function Return
คำถามท้ายบท รูปแบบเชิงสถาปัตยกรรมคืออะไร และมีความสำคัญอย่างไร การออกแบบเชิงสถาปัตยกรรมแบบ MVC คืออะไร และมีความสำคัญอย่างไร การออกแบบมอดูลที่ดีควรมีลักษณะอย่างไร พร้อมทั้งยกตัวอย่างประกอบและมีประโยชน์ต่อการพัฒนาซอฟต์แวร์อย่างไร