แสดงบทความที่มีป้ายกำกับ MVC แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ MVC แสดงบทความทั้งหมด

วันอาทิตย์ที่ 12 มีนาคม พ.ศ. 2560

โมเดล-วิว-คอนโทรลเลอร์(MVC)

โมเดล-วิว-คอนโทรลเลอร์

        Model-View-Controller (MVC) คือ สถาปัตยกรรมซอฟต์แวร์ชนิดหนึ่ง ซึ่งในขณะนี้ถือว่าเป็นแบบแผนสถาปัตยกรรม (architectural pattern) ที่ใช้ในสาขาวิศวกรรมซอร์ฟแวร์ รูปแบบ MVC ใช้เพื่อแยกส่วนซอฟต์แวร์ในส่วน ตรรกะเนื้อหา (domain logic) ได้แก่ความเข้าใจในระบบของผู้ใช้ และส่วนการป้อนข้อมูลและแสดงผล (GUI) ซึ่งช่วยให้การพัฒนา การทดสอบ และการดูแลรักษาซอฟต์แวร์ แยกออกจากกัน

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

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

คอนโทรลเลอร์ (Controller) รับข้อมูลจากผู้ใช้เข้ามา แล้วดำเนินการตอบสนองต่อข้อมูลนั้น โดยเรียกใช้ logic ต่างๆจากอ็อบเจกต์ในโมเดล และส่งข้อมูลผลลัพย์นั้นกลับไปยังส่วนแสดงผล เพื่อตอบกลับไปยังผู้ใช้ได้อย่างถูกต้อง
แอปพลิเคชันที่ใช้ MVC อาจจะเป็นกลุ่มของ โมเดล/วิว/คอนโทรลเลอร์ โดยแต่ละกลุ่มใช้ในงานต่างกันไป
MVC มักจะพบได้ในเว็บแอปพลิเคชันโดย วิว จะเป็น HTML หรือ XHTML ที่สร้างโดยแอปพลิเคชันนั้น ส่วนคอนโทรลเลอร์รับค่า GET หรือ POST เข้ามา แล้วเลือกติดต่อกับโมเดลในส่วนที่เกี่ยวข้องเพื่อตอบสนอง โมเดลซึ่งมี business rules จะทำการจัดการตามคำร้องขอนั้นๆ

ประวัติ

MVC ได้ถูกอธิบายครั้งแรกในปีคศ. 1979  โดย Trygve Reenskaug ซึ่งในระหว่างนั้นได้ทำงานเกี่ยวกับภาษา Smalltalk ที่บริษัท Xerox PARC. การนำไปใช้แบบดั้งเดิม ได้ถูกอธิบายอย่างละเอียดในเปเปอร์ที่สำคัญชื่อ "Applications Programming in Smalltalk-80: How to use Model–View–Controller".
หลังจากนั้นได้มีรูปแบบของ MVC แยกย่อยออกมาหลายแบบด้วยกัน ตัวอย่างเช่น Model View Presenter ถูกนำไปใช้ใน .NET Framework แต่ MVC แบบมาตรฐานก็ยังคงเป็นที่นิยมอยู่

Overview

แม้ว่า MVC จะมีรูปแบบต่างกันไป แต่ control flow มันจะเป็นดังนี้:
  1. ผู้ใช้ทำการตอบโต้ กับ user interface ในทางใดทางหนึ่ง (ยกตัวอย่างเช่น กดปุ่มเมาส์)
  2. คอนโทรลเลอร์ จัดการ event ที่เกิดขึ้นจาก user interface มักจะโดย handler ที่ได้สร้างเอาไว้ หรือ callback แล้วแปลง event เป็นการกระทำของผู้ใช้ที่เหมาะสม ซึ่งเข้าใจได้ด้วยโมเดล
  3. คอนโทรลเลอร์ แจ้งโมเดลถึงการกระทำของผู้ใช้ เช่นอาจจะทำให้เกิดการเปลี่ยนสถานะในโมเดล (ยกตัวอย่างเช่น คอนโทรลเลอร์ปรับปรุงตะกร้าสินค้าของผู้ใช้)
  4. วิว ถามโมเดลเพื่อที่จะสร้างการแสดงผลที่เหมาะสมแก่ผู้ใช้ (ยกตัวอย่างเช่น วิวแสดงรายการสินค้าในตะกร้าสินค้า) โดยวิวได้ข้อมูลมาจากโมเดล ในบางรุปแบบของ MVC คอนโทรลเลอร์อาจจะให้คำสั่งแก่วิวด้วย หรือบางรูปแบบ วิวจะได้รับการบอกจากโมเดลถึงการเปลี่ยนแปลง
  5. user interface รอการปฏิสัมพันธ์จากผู้ใช้ ซึ่งจะกลับเข้าสู่วงจรในขั้นแรก
ในบางรูปแบบของ MVC เช่นใน W3C XForms ใช้หลักการของ dependency graph เพื่อให้เกิดการปรับปรุงวิวโดยอัติโนมัติ เมื่อข้อมูลในโมเดลเปลี่ยนแปลง
ด้วยการแยกโมเดลและวิวออกจากกัน MVC ช่วยให้ความซับซ้อนในการออกแบบลดลง และเพิ่มความคล่องตัวและการนำโค้ดกลับมาใช้ใหม่ (Code reuse)

วันเสาร์ที่ 1 ตุลาคม พ.ศ. 2559

Service Layer กับ MVC

หลังจากที่อธิบายถึงแนวคิดในการใช้งาน MVC Framework มาแล้วต่อไปเราจะเจาะลึกลงไปในส่วนของ Model ที่มีการเพิ่มส่วนของ Service Layer ขึ้นมาเพื่อที่จะทำให้เราสามารถ maintain ในส่วนของ model ได้ง่ายขึ้น การสร้าง Service Layer เราจะทำการประยุกต์แนวคิดของ Service Oriented Architecture (SOA)  มาใช้งานร่วมกับ MVC
Service Oriented Architecture
ก่อนอื่นต้องอธิบายความหมายของ Service Oriented Architecture (SOA) ก่อน SOA เป็นแนวความคิดที่ถูกนำไปประยุกต์ใช้งานเกี่ยวกับ Web service เป็นส่วนมาก แต่ความจริงแล้วแนวความคิดนี้สามารถนำมาประยุกต์ใช้งานใน Model ได้ด้วย โดย SOA เป็นแนวคิดที่มองการทำงานส่วนต่างๆเป็น service หรือ บริการเพื่อให้นำกลับมาใช้ใหม่ได้ง่าย และยังลดความซ้ำซ้อนของข้อมูลในองค์กรได้ด้วย เพราะถ้าต้องการข้อมูลอะไรก็สามารถเรียก service ตัวนั้นขึ้นมาทำงานได้เลย จากรูปด้านซ้ายจะเป็นแนวคิดแบบเดิม Silo เรียกง่ายๆว่า Applicationของใครของมัน Application แต่ละตัวจะแยกกันทำงานและแน่นอนข้อมูลบางส่วนก็จะซ้ำซ้อนกัน จึงมีแนวคิดในการมองทุอย่างเป็น service และ integrate หรือ บูรณาการเข้าด้วยกัน ด้วยหลักการทำงานเป็น service ทำให้ถูกนำไปใช้คู่กับ Web service เป็นหลักในหลักการของ SOA เราจะทำการกำหนด flow ด้วย Enterprise Service Bus (ESB) ทำหน้าที่เชื่อมโยง service ต่างๆเข้าหากัน การแยก work flow ออกมาทำให้เราสามารถปรับเปลี่ยน work flow ได้ตามต้องการโดยไม่กระทบกับ service เลย ถ้าอ่านดูแล้วคงจะคุ้นกับแนวคิดแบบนี้เพราะมันคือ Controller ใน MVC นั่นเอง
Service Layer
จากรูปเราจะเห็นว่าการสร้าง service จะอยู่ครอบ domain model หรือการทำงานข้างในของ model โดยจุดประสงค์ของการสร้าง service ใน MVC ก็เพื่อที่จะครอบการทำงานข้างใน model เพื่อลดความซ้ำซ้อนลง และผลที่ได้ตามมาอีกอย่างคือจะลดความขึ้นต่อกัน(couple)ลง ทำให้เราสามารถถอดเอาส่วนต่างของระบบไปใช้งานใหม่ได้ง่ายขึ้น และตามหลักของ Software Engineering เราต้องพยายามที่จะทำระบบให้ high cohesion และ low couple ที่กล่าวมาทั้งหมดนี้ก็เป็นประโยชน์ที่จะได้มากมายจากการสร้าง Service Layer ใน Model
References:
http://martinfowler.com/eaaCatalog/serviceLayer.html
http://msmisthammasat.blogspot.com/2011/01/soa-service-oriented-architecture.html

Model View Control (MVC)

Model View Control (MVC) 
เริ่มกันที่แนวคิดของ MVC ก่อนนะครับ
ในยุคนี้คงไม่มีทางที่เราจะหนีคำนี้ได้พ้นเพราะในการพัฒนาระบบในปัจจุบัน ขนาดของโครงการจะใหญ่ขึ้นเรื่อยๆ เนื่องจากความต้องการมีสูงขึ้นเรื่อยๆ ดังนั้นการจะพัฒนา software ด้วยตัวคนเดียวเป็นเรื่องยาก จึงมีการประยุกต์ใช้งาน Enterpirse Architecture Pattern อย่าง MVC กันมากขึ้นในทุกๆ platform ด้วยเหตุนี้การจะใช้งาน MVC Framework ตัวใดก็แล้วแต่ไม่ว่าจะเป็น PHP , .NET หรือ Java ล้วนแล้วแต่ต้องอาศัยแนวความคิดที่ถูกต้องจึงจะเป็นประโยชน์อย่างแท้จริงไม่ เช่นนั้นนอกจากจะไม่มีประโยชน์ใดๆ ในการใช้ Framework แล้ว ยังเป็นดภาระในการแก้ไขซึ่งจะทำให้แก้ไขได้ยากกว่าปกติ ดังนั้นจึงเริ่มจากการแนะนำแนวคิดในการแบ่งแยกส่วนของ code ออกเป็น 3 ส่วนด้วยกันคือ
 คำอธิบายภาพ : mvc
MVC Archtecture Pattern
Model (M) เป็นส่วนของ Business Logic และ ส่วนของ Entity ซึ่งส่วนนี้จะแตกต่างจากแนวคิดแบบ 3-tier ซึ่งจะแยกส่วนล่างสุดเป็น Data Access Layer (DAL) ซึ่งจะทำหน้าที่ติดต่อกับ Database เท่านั้น แต่ Model จะไม่ได้เป็นเพียงแครการติดต่อกับ Database เท่านั้น แต่ยังรวมเรื่องของ Business Logic ต่างด้วย เช่น การคำนวน VAT 7% หรือการคำนวนค่าต่างให้อยู่ในชั้นนี้ และถ้าจะให้ดีชั้นนี้ควรจะทำการสร้าง Service Layer ขึ้นมา ตรงนี้จะลงรายละเอียดในบทความถัดไป
View (V) เป็นส่วนของการแสดงผลอันนี้ตรงตัวไม่ต้องคิดมาก เป็นส่วนของ HTML ,CSS และ JavaScript ในการทำ Web Application แต่ถ้าเป็น Windows Application ก็จะเป็นพวก forms ต่างๆ ในการใช้งาน PHP Framework บางตัวจะพ่วงเอา Template Engine มาให้ใช้งานด้วย เช่น Symfony จะมี Twig เป็น Template Engine ซึ่งข้อดีของการใช้งาน Template Engine ก็คือจะทำการแยกส่วนของการแสดงผลกับ logic ได้ชัดเจนมากขึ้นคนที่ทำ HTML CSS และ JavaScript ไม่จำเป็นต้องเขียน PHP ได้
Controller (C) ส่วนนี้เป็นส่วนสมองของระบบจะทำหน้าที่คอยควบคุมว่าจะดึงข้อมูลจากไหน (Model ตัวไหน) แล้วก็ไปแสดงผลยังไง (View ตัวไหน) ส่วนนี้จะเป็นส่วนที่่ผิดกันเป็นประจำสำหรับผู้ที่เริ่มใช้งาน MVC Framework เพราะเป็นส่วนที่เราไม่เคยแยกส่วนนี้มาก่อน ส่วนของ Controller จะเป็น work flow หรือขั้นตอนการทำงานต่างๆ (มีเฉพาะ flow ของการทำงานเท่านั้น) จะไม่มี logic ใดๆในนี้ไม่มีการเขียน HTML ไม่มีการคำนวนค่าต่างๆ หน่าที่ของ Controller มีเพียงแค่รับค่ามาทำการ Validate แล้วส่งเข้าไปที่ Model เท่านั้น
ประโยชน์ของการใช้ MVC ก็คือการเพิ่ม maintainability หรือทำให้ระบบแก้ไขได้ง่ายขึ้นเพราะมันแยกส่วนออกจากกันอย่างชัดเจน อีกข้อนึงที่สำคัญไม่แพ้กันก็คือเราจะสามารถแยกคนทำงานตามสิ่งที่เค้าถนัด เช่น คนทำ View ไม่ต้องรู้ว่า database มีโครงสร้างยังไง คนที่ทำผั่ง model ก็ไม่ต้องมากังวลเรื่องของการแสดงผล แต่ขอให้ตกลงเรื่องของ data ที่ส่งหากันให้ดีก็พอ
สุดท้ายอาจไม่จำเป็นจะต้อง strict อยู่ในรูปแบบนี้ 100% เพราะนี่เป็นเพียงทฤษฏี แต่ยังไงก็ตามถ้าจะเขียนผิดไปจากนี้ (anti pattern) ก็สามารถทำได้แต่ต้องแน่ใจว่าการทำแบบนั้นมีเหตุผลมากพอที่จะทำ และไม่กระทบกับการแก้ไขในอนาคต
ที่มา : www.irobust.co.th

Laravel

  Laravel Framework คือ PHP Framework ตัวหนึ่งที่ถูกออกแบบมาเพื่อพัฒนาเว็บแอพพลิเคชั่นต่างๆ ในรูปแบบ MVC (Model Views Controller) ซึ่งมีการแ...