จำเป็นต้องมีคลาสโรงงานเพื่อสร้างมุมมองโมเดลหรือไม่?


17

เพื่อนร่วมงานของฉันแนะนำให้ใช้คลาสโรงงานสำหรับการสร้างวัตถุ viewmodel ในโซลูชัน ASP.NET MVC ของเรา ความคิดที่ว่ามันสามารถช่วยในการออกแบบและการบำรุงรักษาของวิธีการดูรุ่นที่สร้างขึ้นในแอพของเรา

ฉันต้องการค้นหาว่ามีใครมีประสบการณ์นี้หรือไม่ ฉันได้ทำวิจัยและพบว่าน้อยมากในการฝึกนี้

ขณะนี้เราสร้างวัตถุ viewmodel ที่ระดับคอนโทรลเลอร์เช่น

public ActionResult Index()
{
    return this.View(this.BuildIndexViewModel());
}

ดังนั้น this.BuildIndexViewModel () มีหน้าที่สร้างคลาส viewmodel (ชัด ๆ :) แต่เรากำลังพิจารณาความเป็นไปได้ของ:

public ActionResult Index()
{
    return this.View(ViewModelFactory.CreateIndexViewModel());
}

นี่เป็นความคิดที่น่าสนใจ แต่ฉันไม่มั่นใจ 100% ฉันสนใจความเห็นของคนอื่นในเรื่องนี้


4
ฉันพยายามที่จะเห็นประโยชน์ที่จะซื่อสัตย์ คุณจะใช้โรงงานเพื่อซ่อนสิ่งก่อสร้าง แต่ทำไมในกรณีนี้
CodeART

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

คุณทั้งคู่แบ่งปันความคิดแบบเดียวกันกับฉันดังนั้นฉันดีใจที่ฉันไม่ได้อยู่คนเดียว :) @MattDavey ฉันสามารถพูดได้อย่างตรงไปตรงมาว่าฉันสงสัยมากว่า viewmodels จะใช้กับตัวควบคุมมากกว่าหนึ่งตัวซึ่งทำให้โรงงาน ความคิดซ้ำซ้อน ฉันจะแบ่งปันสิ่งนี้เมื่อหัวข้อปรากฏขึ้นอีกครั้งในที่ทำงาน
Jason Evans

โดยส่วนตัวแล้วฉันต้องการให้ประเภทมุมมองเป็นผู้เชี่ยวชาญในกระบวนการสร้างตัวเอง เวลาเดียวที่ความเชี่ยวชาญควรอยู่ที่อื่นคือถ้าการก่อสร้างต้องการความรู้เกี่ยวกับแอปพลิเคชันอื่น ๆ (เช่นที่เก็บ) ซึ่งในกรณีนี้คุณอาจต้องการให้คนกลางเก็บ viewmodel เป็นใบ้ :)
MattDavey

@MattDavey: คุณสามารถใส่ความคิดเห็นสองข้อนี้ลงในคำตอบที่ฉันสามารถโหวตได้หรือไม่?
pdr

คำตอบ:


8

ในกรณีนี้ฉันจะบอกว่าแนวทางที่ดีที่สุดในการติดตามคือหลักการของGRASP โดยเฉพาะอย่างยิ่งดูที่เกณฑ์ทั้งสี่ของการกำหนดการสร้างวัตถุ:

โดยทั่วไปคลาส B ควรรับผิดชอบในการสร้างอินสแตนซ์ของคลาส A หากมีอย่างใดอย่างหนึ่งหรือมากกว่านั้น

  • อินสแตนซ์ของ B ประกอบด้วยหรือรวมอินสแตนซ์ของ A
  • อินสแตนซ์ของอินสแตนซ์ของระเบียน B ของ A
  • อินสแตนซ์ของ B ใช้อินสแตนซ์ของ A อย่างใกล้ชิด
  • อินสแตนซ์ของ B มีข้อมูลการเตรียมใช้งานสำหรับอินสแตนซ์ของ A และส่งต่อไปยังการสร้าง

คลาสคอนโทรลเลอร์ (B) ของคุณตรงกับรายการ # 3 & # 4 ของรายการนั้น (และ # 2 หากวิวเวอร์เป็นโพสต์ด้านหลัง) ดังนั้นจึงเป็นสถานที่ที่เหมาะสมสำหรับพฤติกรรมการสร้างวิววิว (A) อย่างที่ฉันเห็นมันมีเพียงสองเหตุผลเท่านั้นที่จะบังคับให้ฉันแยกพฤติกรรมการก่อสร้างนั้นออกเป็นระดับผู้เชี่ยวชาญ

  • DRY - หากผู้ควบคุมสองคนหรือมากกว่านั้นจำเป็นต้องแบ่งปันพฤติกรรมการสร้าง viewmodel การห่อหุ้มมันในองค์ประกอบที่แตกต่างกันจะช่วยให้โค้ดกลับมาใช้ซ้ำได้ง่ายและหลีกเลี่ยงการทำซ้ำ
  • หากพฤติกรรมการก่อสร้างมีการพึ่งพาส่วนประกอบของระบบอื่น ๆ เช่นที่เก็บข้อมูลตัวตรวจสอบความถูกต้อง ฯลฯ และคุณไม่ต้องการที่จะแนะนำการมีเพศสัมพันธ์นี้กับตัวควบคุม

เมื่อมองย้อนกลับไปที่เกณฑ์การสร้างออบเจ็กต์ทั้งสี่ใน GRASP ฉันจะแยกลักษณะการทำงานไปยังโรงงานที่แยกต่างหากหากได้รับรางวัลพิเศษในรายการนั้น มิฉะนั้นจะไม่มีค่าใด ๆ ในการทำเช่นนั้น

หวังว่าจะช่วย!

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