รูปแบบ HMVC คืออะไร?


130

เมื่ออ่านเอกสารของ Kohana ฉันพบว่าความแตกต่างที่สำคัญในเวอร์ชัน 3.0 คือเป็นไปตามรูปแบบ HMVC แทนที่จะเป็น MVC ตามที่เวอร์ชัน 2.x ทำ หน้าเกี่ยวกับเรื่องนี้ในเอกสารของ Kohana และใน wikipedia ไม่ได้ให้ความคิดที่ชัดเจนแก่ฉัน

คำถาม: รูปแบบ HMVC คืออะไรและแตกต่างจาก MVC อย่างไร?


30
การอภิปรายในหัวข้อนี้เกิดขึ้นในฟอรัม Kohana คุณสามารถช่วยได้: forum.kohanaframework.org/discussion/1681
Sampson

คำตอบ:


86

Sam de Freyssinet (หนึ่งในผู้พัฒนา Kohana) ได้เขียนบทความเชิงลึกเกี่ยวกับ HMVCว่าคืออะไรและจะนำไปใช้ได้อย่างไร

ลิงก์หมดแล้ว: ลิงก์ใหม่ - https://web.archive.org/web/20160214073806/http://techportal.inviqa.com/2010/02/22/scaling-web-applications-with-hmvc/


ขอบคุณสำหรับลิงค์ที่ดีและชำระเงินที่javaworld.com/jw-07-2000/jw-0721-hmvc.html
Owais Qureshi


ลิงค์เสมอจะตาย! โพสต์เนื้อหาแทนลิงก์
Loki

58

ผมอยู่ในขั้นตอนของการพัฒนา PHP 5.3 กรอบ HMVC ของตัวเองที่เรียกว่าแม็กซ์ เนื่องจากฉันลงทุนและขายใน HMVC อย่างมากฉันจึงคิดว่าฉันสามารถเสนอมุมมองที่แตกต่างออกไปและอาจเป็นคำอธิบายที่ดีกว่าว่าเหตุใดจึงควรใช้ HMVC และประโยชน์ที่จะได้รับ

ประโยชน์ในทางปฏิบัติที่ใหญ่ที่สุดของการใช้สถาปัตยกรรม HMVC คือ "การสร้างวิดเจ็ต" ของโครงสร้างเนื้อหา ตัวอย่างเช่นการแสดงความคิดเห็นการให้คะแนน Twitter หรือการแสดงฟีด RSS ของบล็อกหรือการแสดงเนื้อหาในตะกร้าสินค้าสำหรับเว็บไซต์อีคอมเมิร์ซ โดยพื้นฐานแล้วเป็นเนื้อหาส่วนหนึ่งที่ต้องแสดงในหลาย ๆ หน้าและอาจอยู่ในที่ต่างๆกันขึ้นอยู่กับบริบทของคำขอ HTTP หลัก

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

HMVC หรือโดยเฉพาะอย่างยิ่งความสามารถในการส่งคำขอย่อยไปยังผู้ควบคุมเพื่อจัดการกับความรับผิดชอบเหล่านี้เป็นทางออกที่ชัดเจน หากคุณคิดว่าคุณกำลังทำอะไรอยู่มันจะเข้ากับโครงสร้างคอนโทรลเลอร์อย่างแน่นอน คุณต้องโหลดข้อมูลบางอย่างเกี่ยวกับความคิดเห็นและแสดงในรูปแบบ HTML ดังนั้นคุณจึงส่งคำขอไปยังความคิดเห็น Controller พร้อมพารามิเตอร์บางตัวมันโต้ตอบกับ Model เลือก View และ View จะแสดงเนื้อหา ข้อแตกต่างเพียงอย่างเดียวคือคุณต้องการให้ความคิดเห็นแสดงแบบอินไลน์ใต้บทความบล็อกที่ผู้ใช้กำลังดูแทนที่จะเป็นหน้าความคิดเห็นแบบเต็มที่แยกจากกันโดยสิ้นเชิง (แม้ว่าจะใช้วิธี HMVC คุณสามารถให้บริการทั้งคำขอภายในและภายนอกด้วยคอนโทรลเลอร์เดียวกันและ "kill นกสองตัวกับหินก้อนเดียว "ดังคำกล่าว). ในเรื่องนี้ HMVC เป็นเพียงผลพลอยได้ตามธรรมชาติในการพยายามเพิ่มความเป็นโมดูลาร์โค้ดการใช้งานซ้ำและการรักษาแยกข้อกังวลที่ดีขึ้น นี่คือจุดขายของ HMVC

ดังนั้นในขณะที่บทความ TechPortal ของ Sam de Freyssinetเกี่ยวกับการปรับขนาดด้วย HMVC เป็นเรื่องที่น่าสนใจ แต่ก็ไม่ใช่ที่ที่ 90% + ของผู้ที่ใช้เฟรมเวิร์ก HMVC จะได้รับประโยชน์จริงในทางปฏิบัติในแต่ละวัน


5
ใช่นี่เป็นวิธีที่ฉันจินตนาการถึงการใช้งานในโลกแห่งความเป็นจริง แต่จากมุมมองนี้ชื่อไม่ค่อยเหมาะสมเนื่องจาก H ใน HMVC ทำให้เข้าใจผิด (ไม่มีลำดับชั้นที่แท้จริง)
Matteo Riva

2
ใช่คุณเป็นจุดที่ดี ฉันแชร์มุมมองนี้จริง ๆ และตั้งชื่อให้อีกชื่อหนึ่งว่า "Nested MVC" - ในงานนำเสนอที่ฉันทำกับ Alloy ที่ Confoo 2011 มันขึ้นที่ Slideshare สไลด์ # 20: slideshare.net/vlucas/alloy-hmvc-php- กรอบงาน
Vance Lucas

HMVC จะจัดการกับความต้องการผลตอบแทนจำนวนมากจากโครงสร้างโมดูลอย่างไร เช่นการจัดเรียงเนื้อหาส่วนหัว / เนื้อหา / ส่วนท้ายการอ้างอิง JS / Css และความสัมพันธ์ระหว่างโมดูล เหตุการณ์ที่เกิดขึ้น? ตะขอ? กรอบหน้าเดี่ยว? วัตถุส่งคืนที่มีโครงสร้าง?
scipilot

1
คำตอบนี้เป็นสำเนาของ wikipedia: / en.wikipedia.org/wiki/…
EricG

3
@EricG ดูเหมือนว่ามีคนคัดลอกคำตอบที่ฉันให้ไว้ที่นี่แล้วเพิ่มลงใน Wikipedia (ไม่ใช่ฉัน) ตรวจสอบส่วน "การอ้างอิง" ที่ด้านล่างของบทความ Wikipedia ซึ่งจะลิงก์กลับไปที่ความคิดเห็นนี้
Vance Lucas

7

HMVC มีความเกี่ยวข้องอย่างใกล้ชิดกับแนวทาง "ตามองค์ประกอบ" ในการจัดส่ง โดยทั่วไปแทนที่จะมีผู้มอบหมายงานคนเดียวซึ่งมอบหมายให้ผู้ควบคุมผู้ควบคุมแต่ละคนสามารถทำหน้าที่เป็นผู้มอบหมายงานได้ด้วยตนเอง สิ่งนี้ทำให้คุณมีลำดับชั้นของตัวควบคุม การออกแบบมีความยืดหยุ่นมากขึ้นและทำให้เกิดการห่อหุ้มโค้ดได้ดีขึ้น แต่มีราคาที่สูงขึ้น Konstruktได้รับการออกแบบตามรูปแบบนี้

ดูคำตอบนี้ด้วย: /programming/115629/simplest-php-routing-framework/120411#120411


7

อย่างน้อยที่สุดใน Kohana คำขอ HMVC คือคำขอ HTTP ที่ให้บริการ "ภายใน": แทนที่จะออกผ่านเครือข่ายจะถูกกำหนดเส้นทางส่งและจัดการโดยเฟรมเวิร์กเอง ความคล้ายคลึงกันของชื่อ "HMVC" และ "MVC" ทำให้เกิดความสับสนเนื่องจากแสดงให้เห็นถึงความเชื่อมโยงระหว่างคำศัพท์ที่ไม่มีอยู่จริง: คำที่หนึ่งไม่ได้เป็นตัวแปรเล็กน้อยหรือการปรับเปลี่ยนอีกแบบหนึ่งเป็นสิ่งที่แตกต่างกันอย่างสิ้นเชิง (HMVC เรียกอีกอย่างว่า Ajax ที่ไม่มีคำขอ HTTP ฝั่งไคลเอ็นต์) การเน้นของ Kohana และการสนับสนุน "HMVC" หมายความว่าเฟรมเวิร์กมีการสนับสนุนที่แข็งแกร่งสำหรับสถาปัตยกรรมที่มุ่งเน้นบริการที่ใช้ HTTP

ข้อดีของรูปแบบสถาปัตยกรรมนี้ก็คือเนื่องจากมีการใช้ "รูปแบบการเรียก" เดียวกันสำหรับคำขอภายในและภายนอกการแปลงคำขอบริการ "ภายใน" เป็นคำขอ "ภายนอก" หรือในทางกลับกันจึงเป็นเรื่องเล็กน้อยที่จำเป็น

แม้ว่านี่จะเป็นรูปแบบสถาปัตยกรรมที่เหมาะสม แต่การตั้งชื่อของตัวเองให้ดูเหมือนไม่จำเป็น (Symfony2 อธิบายถึงแนวคิด " คำขอย่อย " แบบเดียวกัน) และในความเป็นจริงแล้วชื่อนี้ดูเหมือนจะเป็นการเรียกชื่อผิด: ไม่มีข้อกำหนดหรือความจำเป็นเป็นพิเศษที่คำขอจะสร้าง ลำดับชั้น (นอกเหนือจากกราฟการโทรมาตรฐานของทุกโปรแกรมที่จำเป็น) คำขอสามารถเรียกซ้ำได้อย่างง่ายดายตัวอย่างเช่น

[ อัปเดต เม.ย. 2554 มี.ค. 2555:ขยายคำตอบในการตอบกลับความคิดเห็น]


2
ความสามารถในการแปลงคำขอบริการ 'ภายใน' เป็นเมนูคำขอ 'ภายนอก' คุณสามารถขยายขนาดได้ง่ายขึ้นหากจำเป็นกล่าวคือย้ายโมดูลแอปพลิเคชันบางส่วนไปยังเซิร์ฟเวอร์ของตนเอง
Kim Prince

1
ใช่ลองใช้บริการเว็บภายในกับบริการนี้และไม่ใช้เพียงเพื่อดูว่าจริงๆแล้ว "ไม่สำคัญขนาดนั้น" หรือไม่
Kemo

@Kemo ฉันคิดว่ามันเป็นสถาปัตยกรรมที่ดีฉันแค่คิดว่าชื่อมันสับสนและมันก็บ่งบอกว่าโคฮานะกำลังทำอะไรที่ผิดปกติ
mjs

ฉันไม่แน่ใจว่าคำตอบของคุณมีประโยชน์อย่างไร คุณไม่ได้ตอบคำถามเพียงแค่บ่นเกี่ยวกับชื่อและมันไม่จำเป็น (ซึ่งก็ใช้ได้)
Dave

4

HMVC เป็น Hierarchical Model View Controller ใน MVC ปกติทุกออบเจ็กต์ GUI จะมี MVC แต่ไม่มีความสัมพันธ์ใด ๆ ระหว่างอ็อบเจ็กต์ GUI หลักและอ็อบเจ็กต์ Child GUI ซึ่งแตกต่างจาก HMVC ใน HMVC ออบเจ็กต์ GUI แต่ละอ็อบเจ็กต์มีการเข้าถึงอ็อบเจ็กต์ลูกและอ็อบเจ็กต์ลูกแต่ละตัวสามารถเข้าถึงอ็อบเจ็กต์หลักได้

ดังนั้นในทุกมุมมองจึงมีมุมมองหลักซึ่งสามารถเข้าถึงได้โดยใช้มุมมองหลัก ในทุกคอนโทรลเลอร์จะมีตัวควบคุมหลักซึ่งสามารถส่งผ่านเหตุการณ์ไปยังตัวควบคุมหลักได้ (หากเหตุการณ์ไม่อยู่ในขอบเขต)

สำหรับคำอธิบายรายละเอียดโปรดคลิกที่นี่

ลิงค์ใหม่คือที่อยู่นี้


1
เครื่องหมายของคำตอบที่ดีไม่ได้เป็นเพียงลิงค์ที่ไม่มีข้อมูลหรือบริบทอื่น ๆ คุณช่วยหาคำตอบและสรุปส่วนที่เกี่ยวข้องของโพสต์ที่เชื่อมโยงได้หรือไม่?
Kev

1
@ Sanjay เหตุผลใดที่คุณเปลี่ยนปลายทางของลิงก์จากบทความ HMVC เป็นหนึ่งในสถานะ gwt สำหรับมือถือ?
Brad Koch

@ โคช.. ฉันไม่เปลี่ยนลิงค์ ... แม้ไม่รู้ว่าใครเปลี่ยน .... btw ฉันเชื่อมโยงกับลิงค์ต้นฉบับ
Sanjay Jain
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.