เมื่อเทียบกับเว็บฟอร์ม MVC นั้นเป็นวิธีการสร้าง HTML ระดับล่างพร้อมกับการควบคุมการแสดงผลหน้ากระดาษได้ดีขึ้นและมีวิธีการที่ขับเคลื่อนด้วยสถาปัตยกรรมในระดับที่สูงขึ้น ให้ฉันจับภาพเว็บฟอร์มและ MVC และแสดงเหตุผลที่ฉันคิดว่าการเปรียบเทียบนั้นสนับสนุนเว็บฟอร์มในหลาย ๆ สถานการณ์ - ตราบใดที่คุณไม่ต้องตกอยู่ในกับดักของเว็บฟอร์มคลาสสิก
เว็บฟอร์ม
ในโมเดลเว็บฟอร์มหน้าเว็บของคุณจะตรงกับคำขอหน้าเว็บจากเบราว์เซอร์โดยตรง ดังนั้นหากคุณกำลังนำผู้ใช้ไปยังรายการหนังสือคุณอาจมีหน้าเว็บที่เรียกว่า "Booklist.aspx" ซึ่งคุณจะนำเขาไป ในหน้านั้นคุณจะต้องจัดเตรียมทุกอย่างที่จำเป็นเพื่อแสดงรายการนั้น ซึ่งรวมถึงรหัสสำหรับดึงข้อมูลใช้ตรรกะทางธุรกิจใด ๆ และแสดงผลลัพธ์ หากมีสถาปัตย์หรือตรรกะการกำหนดเส้นทางที่มีผลต่อหน้าคุณจะต้องรหัสตรรกะทางสถาปัตยกรรมในหน้าเช่นกัน การพัฒนาเว็บฟอร์มที่ดีมักจะเกี่ยวข้องกับการพัฒนาชุดของคลาสที่รองรับใน DLL แยกต่างหาก (ทดสอบได้ในหน่วย) คลาสเหล่านี้จะจัดการกับตรรกะทางธุรกิจการเข้าถึงข้อมูลและการตัดสินใจด้านสถาปัตยกรรม / การกำหนดเส้นทาง
MVC
MVC ให้มุมมอง "สถาปัตยกรรม" ที่มากขึ้นเกี่ยวกับการพัฒนาเว็บแอปพลิเคชัน: เสนอโครงนั่งร้านที่ได้มาตรฐานเพื่อสร้าง นอกจากนี้ยังมีเครื่องมือสำหรับสร้างโมเดลมุมมองและคลาสตัวควบคุมโดยอัตโนมัติภายในสถาปัตยกรรมที่สร้างไว้แล้ว ตัวอย่างเช่นใน Ruby on Rails (เพียงแค่ "Rails" จากที่นี่ออก) และ ASP.NET MVC คุณจะเริ่มต้นด้วยโครงสร้างไดเรกทอรีที่สะท้อนถึงรูปแบบโดยรวมของสถาปัตยกรรมเว็บแอปพลิเคชัน ในการเพิ่มมุมมองแบบจำลองและตัวควบคุมคุณจะต้องใช้คำสั่งเช่น "Rails script / create scaffold {modelname}" ของ Rails (ASP.NET MVC มีคำสั่งที่คล้ายกันใน IDE) ในคลาสคอนโทรลเลอร์ที่ได้ผลลัพธ์จะมีวิธีการ ("การกระทำ") สำหรับดัชนี (รายการแสดง), แสดง, ใหม่และแก้ไขและทำลาย (อย่างน้อยใน Rails, MVC จะคล้ายกัน) โดยค่าเริ่มต้นเหล่านี้ "
เลย์เอาต์ของไดเรกทอรีและไฟล์มีความสำคัญใน MVC ตัวอย่างเช่นใน ASP.NET MVC วิธีการทำดัชนีสำหรับวัตถุ "หนังสือ" น่าจะมีเพียงหนึ่งบรรทัด: "Return View ();" ด้วยความมหัศจรรย์ของ MVC สิ่งนี้จะส่งแบบจำลองหนังสือไปยังหน้า "/View/Books/Index.aspx" ซึ่งคุณจะพบรหัสเพื่อแสดงหนังสือ วิธีการของ Rails นั้นคล้ายคลึงกันแม้ว่าตรรกะจะค่อนข้างชัดเจนและมีเวทมนตร์น้อยกว่า ดูหน้าแอป MVC มักจะง่ายกว่าหน้าเว็บฟอร์มเพราะพวกเขาจะได้ไม่ต้องกังวลมากเกี่ยวกับการกำหนดเส้นทางตรรกะทางธุรกิจหรือการจัดการข้อมูล
การเปรียบเทียบ
ข้อดีของ MVC คือการแยกข้อกังวลออกมาให้สะอาดและโมเดล HTML / CSS / AJAX / Javascript-centric สิ่งนี้ช่วยเพิ่มความสามารถในการทดสอบให้การออกแบบที่เป็นมาตรฐานมากขึ้นและเปิดประตูสู่เว็บไซต์ "Web 2.0" มากขึ้น
อย่างไรก็ตามมีข้อเสียที่สำคัญเช่นกัน
ครั้งแรกในขณะที่มันง่ายที่จะทำให้ไซต์ตัวอย่างดำเนินต่อไปโมเดลสถาปัตยกรรมโดยรวมมีช่วงการเรียนรู้ที่สำคัญ เมื่อพวกเขาพูดว่า "Convention Over Configuration" มันฟังดูดี - จนกว่าคุณจะรู้ว่าคุณมีหนังสือเรียนรู้ที่คุ้มค่า นอกจากนี้ก็มักจะเป็นบิตคลั่งที่จะคิดออกสิ่งที่เกิดขึ้นเพราะคุณจะอาศัยมายากลมากกว่าการโทรอย่างชัดเจน ตัวอย่างเช่น "Return View ();" โทรไปด้านบน การโทรเดียวกันนั้นสามารถพบได้ในการดำเนินการอื่น แต่ไปที่อื่น หากคุณเข้าใจอนุสัญญา MVCแล้วคุณจะรู้ว่าทำไมสิ่งนี้ถึงเกิดขึ้น อย่างไรก็ตามมันไม่ได้มีคุณสมบัติเป็นตัวอย่างของการตั้งชื่อที่ดีหรือรหัสที่เข้าใจได้ง่ายและเป็นเรื่องยากสำหรับนักพัฒนาใหม่ที่จะหยิบขึ้นมาจากเว็บฟอร์ม (นี่ไม่ใช่ความเห็น: ฉันมีฝึกงานในช่วงฤดู และ MVC ในปีนี้และความแตกต่างในการผลิตมีความเด่นชัด - ในความโปรดปรานของเว็บฟอร์ม) BTW, Rails ดีขึ้นเล็กน้อยในเรื่องนี้แม้ว่า Ruby on Rails จะมีวิธีการตั้งชื่อแบบไดนามิกที่จะทำให้เกิดความคุ้นเคยกับการใช้งานเช่นกัน
ประการที่สอง MVC โดยปริยายถือว่าคุณกำลังสร้างเว็บไซต์สไตล์ CRUD คลาสสิก การตัดสินใจด้านสถาปัตยกรรมและโดยเฉพาะอย่างยิ่งผู้สร้างรหัสล้วนสร้างขึ้นเพื่อรองรับเว็บแอปพลิเคชันประเภทนี้ หากคุณกำลังสร้างแอปพลิเคชัน CRUD และต้องการนำสถาปัตยกรรมที่ผ่านการพิสูจน์มาแล้ว (หรือเพียงแค่ไม่ชอบการออกแบบสถาปัตยกรรม) คุณก็ควรพิจารณา MVC อย่างไรก็ตามหากคุณทำมากกว่า CRUD และ / หรือคุณมีความสามารถพอสมควรกับสถาปัตยกรรม MVC อาจรู้สึกเหมือนเป็นทางตรงจนกว่าคุณจะเชี่ยวชาญต้นแบบการกำหนดเส้นทางต้นแบบ (ซึ่งซับซ้อนกว่าการกำหนดเส้นทางในแอป WebForms) ถึงอย่างนั้นฉันก็รู้สึกว่าตัวเองกำลังต่อสู้กับนางแบบอยู่เสมอและกังวลเกี่ยวกับผลลัพธ์ที่ไม่คาดคิด
ประการที่สามถ้าคุณไม่สนใจ Linq (เพราะคุณกลัวว่า Linq-to-SQL กำลังจะหายไปหรือเพราะคุณพบว่า Linq-to-Entities หัวเราะเกินกำลังและอยู่ภายใต้การขับเคลื่อน) คุณก็ไม่ต้องการ ที่จะเดินเส้นทางนี้ตั้งแต่เครื่องมือ ASP.NET MVC นั่งร้านสร้างรอบ Linq (นี่คือนักฆ่าสำหรับฉัน) แบบจำลองข้อมูลของ Rails นั้นค่อนข้างงุ่มง่ามเมื่อเทียบกับสิ่งที่คุณสามารถทำได้หากคุณมีประสบการณ์ใน SQL (และโดยเฉพาะอย่างยิ่งถ้าคุณมีความรอบรู้ใน TSQL และขั้นตอนการจัดเก็บ!)
ประการที่สี่ผู้สนับสนุน MVC มักชี้ให้เห็นว่ามุมมอง MVC ใกล้เคียงกับรูปแบบ HTML / CSS / AJAX ของเว็บมากขึ้น ตัวอย่างเช่น "HTML Helpers" - การเรียกใช้โค้ดขนาดเล็กในหน้า vew ของคุณที่สลับไปมาในเนื้อหาและวางลงในการควบคุม HTML - ง่ายต่อการรวมเข้ากับ Javascript มากกว่าการควบคุมแบบฟอร์มบนเว็บ อย่างไรก็ตาม ASP.NET 4.0 แนะนำความสามารถในการตั้งชื่อการควบคุมของคุณและกำจัดข้อดีนี้เป็นส่วนใหญ่
ประการที่ห้านัก MVC มักเยาะเย้ย Viewstate ในบางกรณีพวกเขามีสิทธิ์ที่จะทำเช่นนั้น อย่างไรก็ตาม Viewstate สามารถเป็นเครื่องมือที่ยอดเยี่ยมและเป็นประโยชน์ต่อการเพิ่มผลผลิต โดยวิธีการของการเปรียบเทียบการจัดการ Viewstate เป็นมากง่ายกว่าการพยายามที่จะบูรณาการควบคุมเว็บของบุคคลที่สามในแอป MVC ในขณะที่บูรณาการการควบคุมอาจได้รับง่ายขึ้นสำหรับ MVC ทั้งหมดของความพยายามในปัจจุบันที่ผมเคยเห็นทุกข์ทรมานจากความจำเป็นที่จะต้องสร้าง (ค่อนข้าง grody) รหัสที่จะเชื่อมโยงการควบคุมเหล่านี้กลับไปเรียนควบคุมมุมมอง (นั่นคือ - เพื่อหลีกเลี่ยงรูปแบบ MVC )
สรุปผลการวิจัย
ฉันชอบการพัฒนา MVC ในหลาย ๆ ทาง (แม้ว่าฉันชอบ Rails ถึง ASP.NET MVC โดยใช้เวลานาน) ฉันยังคิดว่ามันเป็นสิ่งสำคัญที่เราจะไม่ตกหลุมพรางของการคิดว่า ASP.NET MVC เป็น "รูปแบบการต่อต้าน" ของ ASP.NET Web Forms พวกเขาแตกต่างกัน แต่ไม่ต่างด้าวอย่างสมบูรณ์และแน่นอนมีที่ว่างสำหรับทั้งสอง
อย่างไรก็ตามฉันชอบการพัฒนาฟอร์มของเว็บเพราะสำหรับงานส่วนใหญ่มันง่ายกว่าที่จะทำสิ่งต่าง ๆ ให้สำเร็จ (ยกเว้นการสร้างชุดฟอร์ม CRUD) MVC ก็ดูเหมือนว่าจะต้องทนทุกข์ทรมานจากทฤษฎีส่วนเกิน แน่นอนดูคำถามมากมายถามที่นี่ใน SO โดยผู้ที่รู้จัก ASP.NET หน้าเชิง แต่ผู้ที่พยายาม MVC ไม่มีข้อยกเว้นมีฟันขบเขี้ยวเคี้ยวฟันมากนักพัฒนาพบว่าพวกเขาไม่สามารถทำงานขั้นพื้นฐานโดยไม่ต้องกระโดดผ่านห่วงหรือเส้นโค้งการเรียนรู้ที่ยั่งยืน นี้คือสิ่งที่ทำให้เว็บฟอร์มดีกว่า MVC ในหนังสือของฉัน: MVC ทำให้คุณจ่ายราคาในตลาดโลกที่แท้จริงในการสั่งซื้อที่จะได้รับการตรวจสอบได้มากขึ้นอีกนิดหรือยังเลวร้ายเพียงแค่จะเห็นเป็นเย็นเพราะคุณกำลังใช้เทคโนโลยีล่าสุด
อัปเดต: ฉันได้รับการวิพากษ์วิจารณ์อย่างหนักในส่วนความเห็น - บางอย่างค่อนข้างยุติธรรม ดังนั้นฉันใช้เวลาหลายเดือนในการเรียนรู้ Rails และ ASP.NET MVC เพื่อให้แน่ใจว่าฉันจะไม่พลาดสิ่งที่ยิ่งใหญ่ต่อไป! แน่นอนว่ามันยังช่วยให้แน่ใจว่าฉันให้การตอบคำถามที่สมดุลและเหมาะสม คุณควรรู้ว่าคำตอบข้างต้นเป็นคำตอบที่เขียนครั้งแรกของฉันในกรณีที่ความคิดเห็นดูไม่ตรงกัน
ในขณะที่ฉันมอง MVC อย่างใกล้ชิดฉันคิดว่าซักพักนึงแล้วฉันจะได้พบกับ mea culpa ที่สำคัญ ในที่สุดฉันก็สรุปว่าในขณะที่ฉันคิดว่าเราต้องใช้พลังงานมากขึ้นในสถาปัตยกรรมเว็บฟอร์มและความสามารถในการทดสอบ MVC จริง ๆ ไม่รับสายสำหรับฉัน ดังนั้นสหาย "ขอบคุณ" มากมายสำหรับคนที่ให้คำวิพากษ์อย่างชาญฉลาดของคำตอบเริ่มต้นของฉัน
สำหรับคนที่เห็นว่านี่เป็นการต่อสู้ทางศาสนาและผู้ที่ควบคุมอุทกภัยอย่างไม่ลดละฉันไม่เข้าใจว่าทำไมคุณถึงต้องรำคาญ (20 คะแนนขึ้นไปภายในไม่กี่วินาทีในหลาย ๆ ครั้งไม่เหมือนกัน) หากคุณกำลังอ่านคำตอบนี้และสงสัยว่ามีบางสิ่งที่ "ผิด" อย่างแท้จริงเกี่ยวกับคำตอบของฉันเนื่องจากคะแนนนั้นต่ำกว่าคำตอบอื่น ๆ โปรดมั่นใจได้ว่าจะพูดถึงคนไม่กี่คนที่ไม่เห็นด้วยมากกว่าความรู้สึกทั่วไปของ ชุมชน (โดยรวมแล้วชุมชนนี้ได้รับการปรับปรุงให้ดีขึ้นมากกว่า 100 ครั้ง)
ความจริงก็คือนักพัฒนาหลายคนไม่สนใจ MVC และนี่ไม่ใช่มุมมองของชนกลุ่มน้อย (แม้แต่ใน MS เพราะบล็อกดูเหมือนจะบ่งบอก)