ฉันเคยใช้ MVP และ MVC ในอดีตและฉันชอบ MVP มากกว่าเพราะมันควบคุมการไหลของการดำเนินการที่ดีขึ้นมากในความคิดของฉัน
ฉันได้สร้างโครงสร้างพื้นฐานของฉัน (คลาสที่เก็บข้อมูล / พื้นที่เก็บข้อมูล) และใช้งานได้อย่างไม่มีปัญหาเมื่อทำการเข้ารหัสข้อมูลตัวอย่างอย่างหนักดังนั้นตอนนี้ฉันจึงย้ายไปยัง GUI และเตรียม MVP ของฉัน
หมวดก
ฉันได้เห็น MVP โดยใช้มุมมองเป็นจุดเริ่มต้นซึ่งอยู่ในวิธีการสร้างมุมมองที่สร้างพรีเซนเตอร์ซึ่งจะสร้างแบบจำลองเชื่อมโยงเหตุการณ์ตามความจำเป็น
ฉันยังเห็นผู้นำเสนอเป็นจุดเริ่มต้นที่มุมมองโมเดลและผู้นำเสนอถูกสร้างขึ้นผู้นำเสนอนี้จะได้รับวัตถุมุมมองและแบบจำลองในตัวสร้างเพื่อโยงเหตุการณ์
เช่นเดียวกับใน 2 แต่รูปแบบไม่ผ่านไปยังผู้นำเสนอ แต่โมเดลเป็นคลาสสแตติกที่เรียกเมธอดและส่งคืนการตอบกลับโดยตรง
มาตรา B
ในแง่ของการรักษามุมมองและรูปแบบในการซิงค์ฉันได้เห็น
เมื่อใดก็ตามที่ค่าในมุมมองเปลี่ยนไปเช่น
TextChanged
เหตุการณ์ใน. Net / C # นี่เป็นการยิงDataChangedEvent
ที่ผ่านเข้าไปในแบบจำลองเพื่อให้ซิงค์อยู่ตลอดเวลาDataChangedEvent
และที่มีการเปลี่ยนแปลงรูปแบบคือเหตุการณ์พื้นหลังมันฟังแล้วมุมมองที่มีการปรับปรุงทางความคิดเดียวกันของการเพิ่ม เมื่อผู้ใช้ต้องการที่จะกระทำการเปลี่ยนแปลงSaveEvent
มันก็จะผ่านเข้าไปในแบบจำลองเพื่อทำการบันทึก ในกรณีนี้แบบจำลองเลียนแบบมุมมองข้อมูลและประมวลผลการกระทำคล้ายกับ # b1 อย่างไรก็ตามมุมมองจะไม่ซิงค์กับโมเดลตลอดเวลา แต่เมื่อผู้ใช้ต้องการที่จะยอมรับการเปลี่ยนแปลง
SaveEvent
ถูกไล่ออกและผู้นำเสนอคว้ารายละเอียดล่าสุดและส่งพวกเขาไปยังรูปแบบ ในกรณีนี้โมเดลไม่ทราบเกี่ยวกับข้อมูลมุมมองจนกว่าจะต้องดำเนินการกับมันซึ่งในกรณีนี้โมเดลจะถูกส่งผ่านรายละเอียดที่จำเป็นทั้งหมด
หมวด C
การแสดงวัตถุธุรกิจในมุมมองเช่นวัตถุ (MyClass) ไม่ใช่ข้อมูลดั้งเดิม (int, double)
มุมมองมีฟิลด์คุณสมบัติสำหรับข้อมูลทั้งหมดที่จะแสดงเป็นวัตถุโดเมน / ธุรกิจ เช่น
view.Animals
exposesIEnumerable<IAnimal>
คุณสมบัติแม้ว่ามุมมองจะประมวลผลสิ่งเหล่านี้เป็นโหนดใน TreeView จากนั้นสำหรับสัตว์ที่เลือกมันจะเปิดเผยSelectedAnimal
เป็นIAnimal
ทรัพย์สินมุมมองไม่มีความรู้เกี่ยวกับวัตถุโดเมนมันเปิดเผยคุณสมบัติสำหรับดั้งเดิม / กรอบ (.Net / Java) รวมประเภทวัตถุเท่านั้น ในอินสแตนซ์นี้ผู้นำเสนอจะผ่านวัตถุอะแดปเตอร์วัตถุโดเมนจากนั้นอะแดปเตอร์จะแปลวัตถุธุรกิจที่กำหนดเป็นตัวควบคุมที่ปรากฏบนมุมมอง ในกรณีนี้อะแดปเตอร์จะต้องมีการเข้าถึงการควบคุมที่เกิดขึ้นจริงในมุมมองไม่เพียง แต่มุมมองใด ๆ จึงกลายเป็นคู่ที่แน่นมากขึ้น
มาตรา D
หลายมุมมองใช้เพื่อสร้างการควบคุมเดียว เช่นคุณมีมุมมองที่ซับซ้อนพร้อมโมเดลที่เรียบง่ายเช่นการบันทึกออบเจ็กต์ประเภทต่างๆ คุณสามารถมีระบบเมนูที่ด้านข้างด้วยการคลิกแต่ละครั้งที่รายการที่แสดงการควบคุมที่เหมาะสม
คุณสร้างมุมมองขนาดใหญ่หนึ่งมุมซึ่งมีตัวควบคุมส่วนบุคคลทั้งหมดซึ่งแสดงผ่านอินเทอร์เฟซมุมมอง
คุณมีหลายมุมมอง คุณมีหนึ่งมุมมองสำหรับเมนูและพาเนลว่าง มุมมองนี้สร้างมุมมองอื่นที่จำเป็น แต่ไม่แสดงมุมมองเหล่านี้ (visible = false) มุมมองนี้ยังใช้อินเตอร์เฟสสำหรับแต่ละมุมมองที่มี (เช่นมุมมองลูก) ดังนั้นจึงสามารถแสดงต่อผู้นำเสนอคนเดียวได้ แผงว่างเปล่าเต็มไปด้วยมุมมองอื่น ๆ (
Controls.Add(myview)
) และ ((myview.visible = true
) เหตุการณ์ที่เกิดขึ้นในมุมมอง "child" เหล่านี้ได้รับการจัดการโดยมุมมองพาเรนต์ซึ่งจะส่งผ่านเหตุการณ์ไปยังผู้นำเสนอและวีซ่าในทางกลับกันสำหรับการจัดหากิจกรรมกลับไปยังองค์ประกอบของเด็กแต่ละมุมมองไม่ว่าจะเป็นพาเรนต์หลักหรือมุมมองย่อยที่เล็กกว่านั้นแต่ละสายจะมีผู้นำเสนอและโมเดลของตัวเอง คุณสามารถวางการควบคุมมุมมองลงในแบบฟอร์มที่มีอยู่แล้วและจะมีฟังก์ชั่นที่พร้อมใช้งานเพียงแค่ต้องการเดินสายไปยังผู้นำเสนอเบื้องหลัง
มาตรา E
หากทุกอย่างมีอินเทอร์เฟซตอนนี้ขึ้นอยู่กับวิธีการทำ MVP ในตัวอย่างข้างต้นจะมีผลต่อคำตอบนี้เพราะพวกเขาอาจไม่เข้ากันได้ข้าม
ทุกอย่างมีอินเทอร์เฟซมุมมองผู้นำเสนอและรุ่น แต่ละสิ่งเหล่านี้มีการดำเนินการอย่างเป็นรูปธรรม แม้ว่าคุณจะมีมุมมองที่เป็นรูปธรรมเพียงรูปแบบและผู้นำเสนอ
มุมมองและรุ่นมีส่วนต่อประสาน สิ่งนี้ทำให้มุมมองและรุ่นแตกต่างกัน ผู้นำเสนอสร้าง / ได้รับมุมมองและวัตถุรูปแบบและมันก็ทำหน้าที่ส่งข้อความระหว่างพวกเขา
เฉพาะมุมมองที่มีส่วนต่อประสาน รุ่นนี้มีวิธีการคงที่และไม่ได้ถูกสร้างขึ้นดังนั้นจึงไม่จำเป็นต้องมีส่วนต่อประสาน หากคุณต้องการรูปแบบที่แตกต่างกันผู้นำเสนอจะเรียกวิธีการเรียนแบบคงที่ที่แตกต่างกัน การเป็นแบบคงที่ไม่มีลิงก์ไปยังผู้นำเสนอ
ความคิดส่วนตัว
จากรูปแบบที่แตกต่างกันทั้งหมดที่ฉันได้นำเสนอ (ส่วนใหญ่ฉันอาจใช้ในบางรูปแบบ) ซึ่งฉันแน่ใจว่ามีอีกมาก ฉันชอบ A3 เนื่องจากการรักษาตรรกะทางธุรกิจให้สามารถใช้ซ้ำได้นอก MVP, B2 สำหรับการทำสำเนาข้อมูลน้อยลงและเหตุการณ์น้อยลง C1 สำหรับการไม่เพิ่มในคลาสอื่นตรวจสอบให้แน่ใจว่าใส่ตรรกะที่ไม่สามารถทดสอบได้จำนวนเล็กน้อยในมุมมอง (วิธีการแสดงภาพวัตถุโดเมน) แต่สามารถตรวจสอบโค้ดหรือดูได้ง่ายๆในแอปพลิเคชัน ถ้าตรรกะนั้นซับซ้อนฉันจะเห็นด้วยกับคลาสอะแดปเตอร์ แต่ไม่ได้ในทุกกรณี สำหรับส่วน D ฉันรู้สึกว่า D1 สร้างมุมมองที่ใหญ่เกินไปสำหรับตัวอย่างเมนู ฉันเคยใช้ D2 และ D3 มาก่อน ปัญหาเกี่ยวกับ D2 คือคุณต้องเขียนโค้ดจำนวนมากเพื่อจัดเส้นทางเหตุการณ์ไปและกลับจากผู้นำเสนอไปยังมุมมองลูกที่ถูกต้องและไม่เข้ากันได้กับการลาก / วาง การควบคุมใหม่แต่ละอันต้องการการเดินสายที่มากขึ้นเพื่อรองรับผู้นำเสนอเดี่ยว D3 เป็นตัวเลือกที่ฉันชอบ แต่เพิ่มคลาสให้มากขึ้นในฐานะผู้นำเสนอและนางแบบที่จะจัดการกับมุมมองแม้ว่ามุมมองจะเกิดขึ้นง่ายมากหรือไม่จำเป็นต้องนำกลับมาใช้ใหม่ ฉันคิดว่าส่วนผสมของ D2 และ D3 นั้นดีที่สุดตามสถานการณ์ สำหรับหัวข้อ E ฉันคิดว่าทุกอย่างที่มีส่วนต่อประสานอาจเกินความจำเป็นฉันได้ทำมันสำหรับวัตถุโดเมน / ธุรกิจและมักจะไม่เห็นความได้เปรียบใน "การออกแบบ" โดยการทำเช่นนั้น แต่มันช่วยในการเยาะเย้ยวัตถุในการทดสอบ โดยส่วนตัวแล้วฉันเห็นว่า E2 เป็นโซลูชันแบบคลาสสิกแม้ว่าจะเคยเห็น E3 ที่ใช้ในโครงการ 2 โครงการที่ฉันเคยทำมาก่อนหน้านี้ ฉันคิดว่าส่วนผสมของ D2 และ D3 นั้นดีที่สุดตามสถานการณ์ สำหรับหัวข้อ E ฉันคิดว่าทุกอย่างที่มีส่วนต่อประสานอาจเกินความจำเป็นฉันได้ทำมันสำหรับวัตถุโดเมน / ธุรกิจและมักจะไม่เห็นความได้เปรียบใน "การออกแบบ" โดยการทำเช่นนั้น แต่มันช่วยในการเยาะเย้ยวัตถุในการทดสอบ โดยส่วนตัวแล้วฉันเห็นว่า E2 เป็นโซลูชันแบบคลาสสิกแม้ว่าจะเคยเห็น E3 ที่ใช้ในโครงการ 2 โครงการที่ฉันเคยทำมาก่อนหน้านี้ ฉันคิดว่าส่วนผสมของ D2 และ D3 นั้นดีที่สุดตามสถานการณ์ สำหรับหัวข้อ E ฉันคิดว่าทุกอย่างที่มีส่วนต่อประสานอาจเกินความจำเป็นฉันได้ทำมันสำหรับวัตถุโดเมน / ธุรกิจและมักจะไม่เห็นความได้เปรียบใน "การออกแบบ" โดยการทำเช่นนั้น แต่มันช่วยในการเยาะเย้ยวัตถุในการทดสอบ โดยส่วนตัวแล้วฉันเห็นว่า E2 เป็นโซลูชันแบบคลาสสิกแม้ว่าจะเคยเห็น E3 ที่ใช้ในโครงการ 2 โครงการที่ฉันเคยทำมาก่อนหน้านี้
คำถาม
ฉันกำลังใช้งาน MVP ถูกต้องหรือไม่ มีวิธีที่ถูกต้องเกี่ยวกับเรื่องนี้หรือไม่?
ฉันอ่านงานของ Martin Fowler ที่มีการเปลี่ยนแปลงและฉันจำได้เมื่อฉันเริ่มทำ MVC ฉันเข้าใจแนวคิด แต่แรกเริ่มไม่สามารถทำงานได้ว่าเป็นจุดเริ่มต้นทุกอย่างมีหน้าที่เป็นของตัวเอง แต่สิ่งที่ควบคุมและสร้างต้นฉบับ ชุดของวัตถุ MVC