Model-View-Presenter (MVP) มีประโยชน์กับ Android หรือไม่?


34

วิธีแยกมุมมองและผู้นำเสนอใน Android ในขณะที่การตอบสนองต่อการกระทำของผู้ใช้ (ส่วนผู้นำเสนอของ MVP) ถูกตั้งค่าเป็นกิจกรรมเดียวกันที่แสดงองค์ประกอบ GUI (ดูส่วนของ MVP)

"ในการนำเสนอมุมมองแบบจำลองเช่นเดียวกับ Martin Fowler หรือ Michael Feathers [2] กล่าวว่าตรรกะของ UI ถูกแยกออกเป็นคลาสที่เรียกว่าผู้นำเสนอที่จัดการอินพุตทั้งหมดจากผู้ใช้และบอกว่า" ใบ้ "เป็นอย่างไร แสดง "(อ้างจากที่นี่ )

จนถึงตอนนี้ฉันคิดว่าหนึ่งในคุณสมบัติหลักของ Android คือกิจกรรมอัจฉริยะที่ดำเนินการตอบสนองต่อพวกเขาและแสดงผลลัพธ์ โครงการ MVP ขัดแย้งกับปรัชญาของ Android หรือไม่ รู้สึกถึงความพยายามที่จะตระหนักถึงมันบน Android? ถ้าใช่จะทำอย่างไร?


2
+1 คำถามที่ดีเพราะฉันยังไม่เคยเห็น # mvp / mvvm ในแหล่งที่มาของแอป Android มันจะน่าสนใจที่จะเห็นตัวอย่าง android mvp และค่าใช้จ่ายของรหัส / lib ที่ผลิต ปัญหานี้ไม่ได้รับการกล่าวถึงในที่Stackoverflow-วิธีการผลิตแนะนำแอปแบบพกพา-ระหว่างหุ่นยนต์และแพลตฟอร์มอื่น ๆ
K3B

บางทีฉันสามารถใส่มันลงใน Stackoverflow หรือจะขัดกับกฎ
Gangnus

คุณสามารถขอให้ผู้ดูแลระบบคนหนึ่งทำการโยกย้ายคำถามนี้แทนการทำสำเนาคำถามซ้ำ ที่นี่ในprogrammersคำถามเป็นคำถามที่ถกเถียงกันมากขึ้น "คุณคิดอย่างไรกับ .. / มันจะดีหรือไม่ดีกับ ... " ในขณะที่stackoverflowจะเป็นเช่น "มีตัวอย่างของ mvp ใน Android" สำหรับฉันทั้งสองแห่งก็โอเค
k3b

ฉันขอโทษสำหรับความอับอายของฉัน แต่จนถึงตอนนี้ฉันยังไม่พบวิธีการเชื่อมต่อกับผู้ดูแลระบบ :-(
Gangnus

คำถามนี้ไม่เหมาะสำหรับ Stack Overflow BTW - คุณสามารถติดต่อผู้ดูแลโดยการตั้งค่าสถานะโพสต์ของคุณโดยใช้ลิงก์ "ตั้งค่าสถานะ"
ChrisF

คำตอบ:


15

แอปพลิเคชั่น Android นั้นถูกสร้างขึ้นโดยรอบ Model-View-Controller (MVC) - MVP ฟังดูเหมือนกัน แต่ฉันไม่เคยได้ยินคำศัพท์มาก่อน กิจกรรมเติมเต็มบทบาทของ Controller, มุมมอง XML ก็เป็นเช่นนั้น (แม้ว่าคุณจะสามารถสร้างพวกเขาโดยทางโปรแกรมในกิจกรรม - มันง่ายและง่ายกว่าที่จะทำใน XML) และ Model ที่คุณเขียนเอง ใช่รูปแบบนั้นค่อนข้างใช้งานได้จริง

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

หากคุณกำลังเขียนแอพไขว้แพลตฟอร์มคุณอาจต้องการดูวิธีสี่ชั้น: ดู, การกระทำ, ตรรกะทางธุรกิจและรูปแบบ เลเยอร์การดูและการดำเนินการจะเป็นแพลตฟอร์มเฉพาะในขณะที่ตรรกะทางธุรกิจและรูปแบบจะไม่เปลี่ยนแปลง โดยพื้นฐานแล้วคุณแบ่งผู้นำเสนอและการโต้ตอบของผู้ใช้ออกเป็นเลเยอร์ Action ซึ่งเรียกเลเยอร์ Business Logic เพื่อดำเนินการตามที่ผู้ใช้ต้องการ


+1! กรุณาคุณสามารถให้การอ้างอิงหรือสองถึงข้อความที่ดีเกี่ยวกับมันได้หรือไม่
Gangnus

4
ฉันคิดว่า MVP ให้โอกาสคุณในการรักษาActionแพลตฟอร์มเลเยอร์ (= Presentation) ให้เป็นอิสระเช่นกัน - อย่างน้อยเมื่อแพลตฟอร์มต่าง ๆ ของคุณมีความสามารถ UI ที่คล้ายกัน
Doc Brown

@DocBrown ในทางทฤษฎีใช่ ในทางปฏิบัติฉันไม่แน่ใจว่าจะเป็นไปได้เพราะการโต้ตอบของผู้ใช้อาจส่งผลต่อมุมมองหรือผู้นำเสนอ ตัวอย่างเช่นใน Android swipes ได้รับการจัดการโดยกิจกรรม แต่บนหน้าเว็บจะได้รับการจัดการโดยมุมมอง (เบราว์เซอร์)
Michael K

12
"แอปพลิเคชั่น Android นั้นถูกสร้างขึ้นโดยรอบ Model-View-Controller" - มันผิดปกติในหลาย ๆ ระดับฉันขอโทษ สถาปัตยกรรมกรอบ Android ถูกสร้างขึ้นรอบ ๆ คลาสพระเจ้าซึ่งมีตรรกะของมุมมอง / ตัวควบคุมไม่รก
Igor Filippov

2
ฉันหวังว่าฉันสามารถโหวตความคิดเห็นของ @ IgorFilippov ได้มากกว่าหนึ่งครั้ง แนวคิดที่ว่าแอพ Android ใช้ MVC โดยการออกแบบเป็นความเข้าใจผิดที่พบบ่อย ตรงกันข้ามกับ iOS ที่ไม่มีการบังคับใช้สถาปัตยกรรม GUI โดย Android โดยมีการแยกข้อกังวลออกอย่างชัดเจน คุณต้องระบุด้วยตัวคุณเองไม่ว่าจะเป็น MVP, MVC หรืออย่างอื่น
Piovezan

6

ฉันไม่มีประสบการณ์เกี่ยวกับการเขียนโปรแกรม Android แต่มีลักษณะสั้น ๆ เกี่ยวกับแบบฝึกหัดการเขียนโปรแกรม Android เบื้องต้นฉันไม่เห็นเหตุผลที่ MVP น่าจะมีประโยชน์น้อยกว่าในกรอบงานอื่น ๆ ที่ขับเคลื่อนด้วยเหตุการณ์ Activityระดับไม่แตกต่างกันมากจากDialogหรือFormในกรอบอื่น ๆ ดังนั้นจึงควรจะง่ายต่อการสร้าง "Activitity Presenter" ชั้นสำหรับ subclass กิจกรรมใด ๆ ของแอพลิเคชันของคุณและใส่ตรรกะหลักมี

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


+1 ขอบคุณสำหรับเวลา แต่อย่างที่คุณเห็นจากคำตอบอื่น ๆ ใน Android นั้นมีการใช้งานที่คล้ายกัน แต่เป็นรุ่นที่แตกต่างกัน "ฉันพูดร้อยแก้วมา 50 ปีแล้วไม่รู้เรื่อง!" ตอนนี้ฉันจะลองดูความแตกต่างของแบบจำลอง
Gangnus

4
@Gangnus: MVP เป็นรูปแบบพิเศษของ MVC ที่นี่codebetter.com/jeremymiller/2007/07/26/…คุณค้นหาข้อมูลเพิ่มเติม และฉันค่อนข้างแน่ใจว่านี่ไม่ใช่คำถามของ "MVC หรือ MVP" กิจกรรมอาจเป็นรูปแบบของ "คอนโทรลเลอร์" แต่ขึ้นอยู่กับแพลตฟอร์ม การแยกตรรกะ UI กับคลาสผู้นำเสนอแพลตฟอร์มที่เป็นอิสระสำหรับแต่ละกิจกรรมอาจทำให้พวกเขาทดสอบได้ง่ายขึ้นและพกพาได้มากขึ้น
Doc Brown

5

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

นี่คือคำอธิบายสั้น ๆ ขององค์ประกอบทั้งสามของ MVP

ดู

ใน android MVP มุมมองมีสองสิ่งกิจกรรม - ทรัพยากร Android View - อินเตอร์เฟส Java กิจกรรมใช้มุมมองและแทรกตัวเอง (ดูอินเตอร์เฟส) ในผู้นำเสนอเพื่อให้ผู้นำเสนอสามารถพูดคุยกับกิจกรรมโดยใช้อินเทอร์เฟซมุมมอง แผนภาพสามบล็อกแรกแสดงการสื่อสารระหว่าง View และ The Presenter

พรีเซนเตอร์

ผู้นำเสนอทำหน้าที่เป็นเลเยอร์กลางระหว่างมุมมองและข้อมูล / รุ่น มุมมอง (กิจกรรม) ผู้นำเสนอคำสั่งเพื่อนำเสนอบางสิ่งและผู้นำเสนอจากนั้นนำข้อมูลจากฐานข้อมูล / แบบจำลองและให้ข้อมูลในรูปแบบที่แสดงได้กลับคืนไปยังมุมมอง ดูจากนั้นดูแลการแสดงข้อมูลนั้นบนหน้าจอ และจำไว้ว่า Presenter เป็นคลาส java ธรรมดาไม่ควรมีส่วนประกอบ Android ใด ๆ มิฉะนั้นจะทำให้การทดสอบหน่วยของผู้นำเสนอยาก

หากคุณต้องการใช้ฐานข้อมูลในผู้นำเสนอให้ทำกิจกรรมสร้างอินสแตนซ์ฐานข้อมูลและอัดเข้าไปในผู้นำเสนอ สิ่งนี้จะช่วยให้คุณจำลองฐานข้อมูลในขณะที่ทำการทดสอบหน่วยและจะช่วยให้คุณทดสอบตรรกะทางธุรกิจ

แบบ

โมเดลใน MVP ไม่ได้เป็นเพียงแหล่งข้อมูลของคุณ มุมมองไม่ได้พูดคุยกับข้อมูลโดยตรงแทนที่จะสั่งให้ผู้นำเสนอจัดการข้อมูลและให้ข้อมูลกลับซึ่งสามารถแสดงผลได้โดยไม่ต้องแก้ไขใด ๆ เพิ่มเติม


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

@Gangnus ฉันได้ให้ข้อมูลที่จำเป็นในคำตอบเพราะการใส่เนื้อหาทั้งหมดจะทำให้คำตอบนั้นใหญ่มาก
Ajit Singh

1
จริง ๆ แล้วมี MVP สองประเภท มุมมองแบบพาสซีฟ (สิ่งที่คุณอธิบายไว้ที่นี่) และหัวหน้าส่วนดูแลซึ่งอนุญาตให้มีการเชื่อมโยงโดยตรงกับมุมมองไปยังโมเดล (เช่น MVVM และเฟรมเวิร์ก MVC เว็บจำนวนมาก)
RubberDuck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.