php‎ > ‎

MVC

PHP Framework 

 

Framework  มีอะไรดี

Framework ก็คือ กรอบของการทำงาน แปลตรงตัวเลยครับ Frame + work แต่ถ้ามองในแง่โปรแกรม ก็จะเป็น ข้อกำหนดหรือขอบเขตในการเขียนโปรแกรมให้เป็นไปในรูปแบบเดียวกัน และสามารถนำไปเขียนเพิ่มเพื่อตอบสนองความต้องการอย่างใดอย่างหนึ่งได้ ดังนั้น CakePHP framework ก็จะมี class และ function ต่างๆ ให้เราได้เรียกใช้ โดยที่เราไม่ต้องไปเสียเวลาเขียนขึ้นมาเอง ซึ่งจะทำให้เกิดความรวดเร็วในการพัฒนา Web Application

 

MVC คืออะไร (MVC for Concept)

MVC เป็นเฟรมเวิร์คที่เกิดขึ้นมาในสมัย Smalltalk-80 เมื่อกว่ายี่สิบปีมาแล้ว โดยแยกออปเจคที่เก็บข้อมูล (model) ออปเจคที่แสดงข้อมูล (view) และออปเจคที่ติดต่อกับผู้ใช้ (controller) ออกจากกันอย่างชัดเจน การสื่อสารระหว่างออปเจ็คจะใช้ Observer pattern นั่นหมายความว่าตัวออปเจคที่ถูก observe จะแจ้งการเปลี่ยนแปลงที่เกิดขึ้นในตัวมันให้แก่ตัว observer ทุกตัวโดยไม่จำเป็นต้องรู้ว่าตัว observer แต่ละตัวเป็นใครหรือเป็นออปเจ็คของคลาสไหน ตราบใดที่คลาสนั้นimplement observer (หรือ listener) interface 

             การแยกออปเจคเหล่านี้ออกจากกันจะทำให้ง่ายต่อการแก้ไขโปรแกรม เช่น เราสามารถเปลี่ยน view จาก GUI เป็น HTML (รวมทั้ง jsp, aspx, php), WML หรือ text mode ได้โดยไม่ต้องแก้โมเดล หรือเราจะสนับสนุนหลายๆวิวพร้อมๆกัน เช่น ลูกค้าตลาดหุ้นแต่ละคนจะมีหน้าจอดูราคาหุ้นในตลาดหลักทรัพย์ แต่ละคนจะมีวิวของตัวเองและจะแสดงข้อมูลหลักทรัพย์เฉพาะที่ตัวเองสนใจ ในขณะที่ออปเจคโมเดลคือหลักทรัพย์ทั้งหมดในตลาด เป็นต้น




หลักการสำคัญ ก็คือ โมเดลจะไม่สามารถเรียกเมดธอดของวิวหรือคอนโทรลเลอร์โดยตรง เนื่องจากมันจะไม่มีตัวแปรเก็บออปเจคที่เป็นวิวหรือคอนโทรลเลอร์ โมเดลมีเพียงแต่ list ของออปเจคชนิด observer (วิวหรือคอนโทรลเลอร์ที่ implement observer interface) ที่เฝ้าสังเกตุการเปลี่ยนแปลงอยู่ ตัวโมเดลจะแจ้งการเปลี่ยนแปลงด้วยการส่ง event notification message ไปให้ observer ทุกๆตัว ถ้า observer นั้นเป็นวิวก็จะอัพเดปหน้าจอด้วยขอมูลใหม่ เป็นต้น ในทำนองเดียวกันตัววิวเองก็มองไม่เห็นคอนโทรลเลอร์ ไม่สามารถเรียกเมดธอดของคอนโทรลเลอร์ได้โดยตรง นอกจากจะส่ง event ไปให้คอนโทรลเลอร์ที่เป็น observer ของวิวนั้นๆ

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

มีผู้ดัดแปลง MVC ไปใช้หลายรูปแบบ เช่น Swing เรียก MVC2 บางรายใช้ Model-View-Presenter หรือไม่ก็ Model-User Interface แต่หลักการก็ยังคล้ายๆเดิม เพียงแตกต่างที่การติดต่อระหว่างโมเดล วิว คอนโทรลเลอร์ ว่าใครเป็นผู้แจ้งหรือตอบรับการเปลี่ยนแปลงเหตุการณ์ (event notification) หรือการรวม view กับ controller เข้าด้วยกัน รายละเอียดเพิ่มเติม รวมทั้งวิธีการเขียนโปรแกรมตามหลัก MVC คงต้องไปดูลิงค์ข้างล่างครับ

Case2

1 MVC เป็นหลักการไม่ขึ้นกับภาษา ดังนั้น ภาษาอะไรก็ MVC ได้ 
2 การเขียน code แบบ MVC จะพยายาม แบ่งcode เป็น 3ส่วน
คือ V=view C= control M=model

3 V=view หมายถึง Interface คือ code ที่ใช้ gen หน้าจอ ไม่ว่าจะเป็น win app หรือ web
ถ้าเทียบกับ ASP.NET V=view ตือ file *.aspx เท่านั้น

4 C= control หมายถึง code ที่ทำหน้าที่ Control การทำงาน (flow) ซึ่งถ้าจะบอกว่า *.cs ที่ติดมากับ 
*.aspx เป็น controlก็ได้

5 M = model (นี้คือจุดที่เป็นปัญหาของคนเขียน asp.net)

model จริงๆๆแล้วมันคือ Object ถ้าเขียน Program แบบ OOP มันก็จะมี Object มากมาย
แต่เนืองจาก asp.net ในบ้างเรา (ตามหนังสือ)ไม่ได้เขียนแบบ OO เลย
จึงทำให้ภาพของ Object นั้นไม่มี

คนเขียน asp.net มักจะใช้ dataset ถ้าจะมองdataset เป็น model ก็เกือบได้ แต่ไม่ใช่

คำถามที่น่าสนใจ คือ ASP.NET เป็น MVC ไหม ถ้าว่ากันตรงๆๆแล้วไม่เป็นครับ .net จึง ออก ASP.NET MVC ขึ้นมา(แต่ผมกลับไม่สนใจเลย)

คำถามคือ เขียน asp.net ยังไงให้เป็น MVC

อย่างแรกครับ 
1 ต้องมี MODEL ทาง.net มักเรียกว่า POCO อาจมี BLL หรือไม่มีก็ได้ตามความนิยม

คนส่วนมาก เขียนasp.net ไม่มี model มันเลยไม่สามารถเป็น MVC ได้ 

2 file *.aspx ต้องมี code ที่ทำงานด้านการ gen interface เท่านั้น
ถ้ามือใหม่ หรือหนังสือสอน *.aspx บ้างที่ยังมีคำสั่ง sql อยู่เลย

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

3 *.cs ที่ติดมากับ *.aspx ต้องทำหน้าที่ เป็น control เท่านั้น ห้ามมี BLL หรือ sql หรือ connection 

แต่มันก็ไม่สามารถเป็น control ที่สมบูรณ์บางคนเลยเรียก ASP.Net ว่า MVC กระเทย เกือบเป็นแต่ไม่เป็น

เพราะ *.cs ที่ติดมากับ *.aspx มันผูกติดกับ *.aspxแบบ1-1 ซึ่ง 1C อาจต่อ ได้หลาย V


สุดท้าย ถ้าคุณอยากเขียน MVC คุณมาถูกทางแล้ว เพราะคุณควรจะรู้จัก การแบ่งcode ทำตามหน้าที่ตามlayer ของมัน

ผมขอฝากภาพนี้



ภาพ นี้ไม่ได้ อธิบาย MVC แต่ อธิบายการแบ่ง layer 

3 ชั้น จากภาพแล้ว
asp.net เป็น V และ C

ส่วนBLL เป็น model 
ส่วน DAL เป็นส่วนที่ model เรียกเพื่อ access dataครับ 

และตอนนี้ Architect ของ .net พัฒนาไปมาก ผมขอบอกว่า Architect นั้นดีมาก แล้วตอนนี้มี LINQ ผมยิ่งรักมันไปใหญ่
(JAVA ผมก็ไม่ทิ้งนะครับ) 

 

Case3

 MVC เป็นหนึ่งในหลายๆ pattern ของ Design pattern ซึ่งเป็น Model 
หรือรูปแบบในการวางโครงสร้างโปรแกรมทำให้แยกกันระหว่าง M=Model V=View C=Coltroller

          1.Model  เป็นการตัดสินใจในนการเข้าถึงและใช้งานข้อมูล(Data)
          2.View  เป็นส่วนของการนำข้อมูลที่ได้จาก Model มาแสดงผลให้ผู้ใช้ได้ทราบข้อมูลผ่านทางส่วนติดต่อกับผู้ใช้งาน (User Interface)
          3.Controller เป็นส่วนที่ตอบรับและโต้ตอบการทำงานของผู้ใช้(Client) โดยจะเป็นตัวกระตุ้นให้ Model และ View ทำงานไปในทิศทางเดียวกัน

 



     


     รูป. พื้นฐานการทำงานของ MVC

     จากรูป จะเห็นได้ว่า เวลาที่ Client เรียก หรือร้องขอ(Request) เข้ามาจะไปที่ Control ก่อนเพื่อแยกแยะว่าจะต้องทำอะไร แล้วค่อยไปหา Model แล้วสร้าง View ส่งกลับไปให้ Client จะเห็นได้ว่า การทำงานของโปรแกรมจะแบ่งแยกหน้าที่กันอย่างชัดเจนทำให้เราสามารถปรับเปรี่ยนแก้ไข หรือ พัฒนาเพิ่มเติมได้โดยที่ไม่มีผลกระทบต่อการทำงานในส่วนอื่นๆ ซึ่งผมจะยกตัวอย่างการทำงานของ Hardware เพื่อให้เห็นภาพการทำงานมากขึ้น เช่น  คอมพิวเตอร์ 1 เครื่องนั้น ถ้าต้องการให้คอมพิวเตอร์นั้นประมวลผลเร็วขึ้นก็สามารถที่จะถอด CPU ตัวเก่า แล้วนำ CPU ตัวใหม่มาเสียบ แล้วใช้ต่อได้เร็วกว่าเดิม ต้องการให้การแสดงผลที่ดีขึ้นก็เปลี่ยนการ์ดจอ แต่ขอบเขตคือต้องอยู่ในสิ่งที่ mainboard รับได้ด้วย เราจะทำยังไง ซึ่งเป้นอะไรที่ยากมากเพราะจะต้องใช้สถาปัตยกรรมหรือแนวคิดของ Software ที่ดีด้วยซึ่ง MVC ก็ทำได้ เช่น ถ้าเราต้องการ Control ใหม่ให้ได้ผลลัพท์เหมือนเดิม แล้วเอาไปเสียบที่เดิม ก็เสร็จ ทำให้ไม่ต้องมาสนใจ View และ Model เป็นต้น

Model-View-Controller (MVC) คือ สถาปัตยกรรมซอฟแวร์ (software architecture) ที่มีการแบ่งแยกระบบออกเป็น 3 ส่วนหลักๆ ได้แก่ data model, user interface, and control logic

MVC architecture


Controller
เป็นส่วนที่ทำงานเป็นอันดับแรกเมื่อมีโปรแกรมถูกเรียก จาก Web browser
เป็นส่วนที่ติดต่อการทำงานระหว่างผู้ใช้และโปรแกรม
มีการติดต่อกับ Database(ฐานข้อมูล) ด้วย Model และแสดงผลข้อมูลผ่านทาง View
เป็นส่วนที่มีการประมวลผลหลัก ของโปรแกรม

Model
ใน object oriented การใช้เว็บ database-driven จะเป็นแบบ MVC ซึ่ง Model จะประกอบด้วย class ที่เชื่อมต่อกับ RDBMS ใน Ruby On Rails class model จะถูกจัดการผ่านทาง Active Record (เป็นตัวเข้าถึงข้อมูลในฐานข้อมูล) ซึ่งโปรแกรมเมอร์ทุกคนควร ต้องทำเป็น subclass คือ ActiveRecord?::Base class และโปรแกรมจะเข้าใจอัตโนมัติว่าจะใช้ตาราง RDBMS อันไหน และเรียกคอลัมภ์ต่างๆในตารางเอง
ใน Model มีการติดต่อกับ Active Record เพื่อช่วยจัดการงานด้าน Database เช่น

ดูแลในเรื่องของการติดต่อสื่อสารระหว่าง Object และ Database โดยที่ผู้พัฒนาไม่ต้องยุ่งยากกับการใช้ SQL command
เป็นงานด้านการตรวจสอบความสัมพันธ์ของข้อมูล มีผลกับฐานข้อมูล
•Handles validation(ตรวจสอบความถูกต้อง), association(ความสัมพันธ์ระหว่างฐานข้อมูล), transactions, and more…

View
เป็นส่วนที่ต้องแสดงผลผ่าน web browser
เขียนด้วยพื้นฐานของ HTML(.rhtml), แทรกด้วย script ของ ruby คล้าย PHP,JSP,ASP
การทำงานสัมพันธ์อยู่กับ controller
นำ component มาใช้ใหม่ได้ (Reusable)
สนับสนุน Ajax
•View เป็นการแสดงผลทาง logic หรือ การทำอย่างไรให้ข้อมูลจาก Controller class ถูกแสดงผล วิธีการใน Rails จะใช้ Embedded Ruby (ไฟล์นามสกุล .rhtml) ซึ่งก็เป็นพื้นฐานจาก HTML และด้วยไวยากรณ์ (syntax) ที่คล้าย JSP นอกจากนี้ด้วยยังสนับสนุนการใช้ HTML และ XML
สำหรับ method ที่อยู่ใน class ของ controller หากต้องการที่จะแสดงผลแก่ผู้ใช้ จึงจำเป็นต้องเขียน code ย่อยขึ้นมา และเก็บในโฟลเดอร์ของ view นี้เอง โดยจะต้องตั้งชื่อไฟล์นี้ เป็นชื่อเดียวกันกับ method ใน controller ที่ต้องการให้มี output ในการแสดงผล เช่น
ใน controller mysite มีการกำหนด method ที่มีชื่อว่า index,home,contact เป็นต้น โดยทั้ง 3 method ต้องมีการแสดงผลต่างกัน ดังนั้น โปรแกรมเมอร์ต้องเขียนไฟล์ในการแสดงผลใน โฟลเดอร์ view 3 ไฟล์ ได้แก่ index.rhtml , home.rhtml , contact.rhtml เป็นต้น
นอกจากนี้ยังสามารถกำหนด stysheet และ template เพื่อให้งานเว็บแอพลิเคชั่นนั้นมีมาตรฐานเดียวกันทั้งหมด ในกรณี template จะสร้างไฟล์ ที่เป็นตัวกำหนด header, content, footer ไว้ที่โฟลเดอร์ layout ภายใต้โฟลเดอร์ view ซึ่งลักษณะการทำงานของไฟล์นี้ จะถูกเรียกใช้ในการแสดงผลทุกครั้ง เป็นต้น

โครงสร้าง MVC ใน Ruby On Rails


 

เลือกใช้ CakePHP ในการทำงาน

1.       มีลิขสิทธิ์ยืดหยุ่น

2.       ใช้  MVC

3.       มี Helper  ช่วยให้พัฒนาได้ง่ายและรวดเร็ว  เช่น AJAX Javascript HTML Forms และอ่น ๆ

4.       มีความปลอดภัยในเรื่องของ Email , cookie Security Session รองรัการทำงานในรูปแบบ Components

 

พูดตามประสา

                จริง ๆ แล้ว Framework มันเหมาะสำหรับทำงานขนาดกลาง ถึงขนาดใหญ่  หรือมีคนมากกว่า 2 คนมาทำงานร่วมกัน โดย  Framework จะมีรูปแบบ (Pattern) ที่เป็นมาตรฐาน ตายตัว Code ไม่มั่ว ไม่ใช่ Cowboy Coding  ไม่งั้นมานั่งงม code กันตาเหลือก  คำถามเดิม ๆ ก็จะไปหมด “เขียนใหม่ง่ายกว่านั่ง แกะ code   

                อีกอย่างที่เห็นได้ชัด คือ  การใช้สถาปัตยกรรมแบบ MVC (Model – View - Controller) มาใช้งาน  มันจะทำให้แยกส่วนการทำงานในแต่ละส่วนออกจากกัน ไม่ต้องห่วงพะวง ว่าเอ๊ะ มันจะไปกระทบ Function นี้หรือเปล่า  จุดนี้มันมันเชื่อมกับส่วนไหน   Programmer  กับ Designner สามารถแบ่งกันทำง่ายได้อย่างชัดเจนและง่ายมาก ไม่ต้องพอให้ตรงนี้เสร็จแล้วค่อยมาเชื่อม แล้วค่อยมาแก้  และที่สำคัญ มันทำให้งานเสร็จเร็วขึ้น 60 – 70% 

ขอบคุณข้อมูลจาก :    www.narisa.com  (ขอโทษครับจำ Link  ไม่ได้)

Comments