Giá trị của MVVM trong một dòng ứng dụng kinh doanh (và một loạt các thực tiễn phát triển hiện tại)


9

Sau 2 năm, tôi vẫn đang vật lộn với MVVM như một phương pháp thực tế để sản xuất phần mềm làm việc. Trong một số trường hợp, nó thật tuyệt. Tôi đã làm một ứng dụng đa luồng điều khiển một dây chuyền lắp ráp nhỏ có thể là một màn đêm không có khái niệm MVVM. Một sự trừu tượng từ dây chuyền lắp ráp vật lý gần như không có trí tuệ.

Tuy nhiên, sự nghiệp của tôi chủ yếu xoay quanh dòng ứng dụng kinh doanh nội bộ - chính thức hóa và tối ưu hóa các hoạt động của một doanh nghiệp. Trong các ứng dụng như vậy, nhìn chung có một teir kinh doanh xoay quanh CRUD và các hoạt động hỗn hợp. Trong LOB, các mô hình khung nhìn của tôi cuối cùng là một tập hợp rất đơn giản của các hàm bao bọc một dòng của các phương thức của lớp nghiệp vụ và cuối cùng chỉ làm phức tạp các nhiệm vụ đơn giản nhất như hiển thị hộp thông báo hoặc mở cửa sổ. Không ai khác thấy kỳ lạ khi mọi người đi vào các bản mô tả dài về "tiêm phụ thuộc" và "nhà cung cấp dịch vụ nhắn tin" cho một cuộc gọi Window.ShowDialog đã tồn tại trong nhiều thập kỷ? Có bao nhiêu câu hỏi khác trên stack overflow để xin lời khuyên cho các nhiệm vụ cực kỳ đơn giản trong winforms?

Đừng hiểu sai ý tôi - Tôi có MVVM và làm thế nào nó có thể là vô giá đối với các nhóm lớn thực hiện phát triển theo chiều ngang của gói phần mềm được thu hẹp và bán trên thị trường. Việc kiểm tra đơn vị các mô hình xem có thể tiết kiệm hàng triệu bằng cách tránh một lỗi RTM xấu và các nhà phát triển UI chuyên dụng có thể mang lại trải nghiệm phong phú. Nhưng khi chi phí triển khai lại là tối thiểu và tất cả các doanh nghiệp quan tâm phải trả cho phần mềm làm việc đơn giản, tại sao tôi phải dành thời gian kiểm tra đơn vị vm "trình bao bọc" đơn giản khi logic kinh doanh của tôi đã được thử nghiệm? Công việc kinh doanh thực sự sẽ cho phép tôi dành bao nhiêu thời gian cho hoạt hình dễ thương và phối màu? Có còn gì để nhà phát triển cơ sở làm không (theo dõi lỗi trong chức năng lưu được sử dụng để xem "Save_Click",

Phải thừa nhận rằng, tôi thực sự thích cơ sở dữ liệu của WPF. Để tận dụng lợi thế của nó, tôi đặt bối cảnh dữ liệu cho chính cửa sổ, nơi nó có quyền truy cập vào lớp nghiệp vụ cũng như bất kỳ thuộc tính quan sát nào khác. Có, tôi phá vỡ gần như mọi "quy tắc" MVVM bằng cách làm như vậy. Nhưng ít nhất tôi có mã hướng sự kiện đơn giản, dễ đọc VÀ tôi tận dụng lợi thế của cơ sở dữ liệu và xác thực mới. Vấn đề nằm ở các nhà thiết kế - thứ mà tôi không sử dụng nhiều nhưng hy vọng đến bây giờ nó được tích hợp tốt hơn vào năm 2012 - nhà thiết kế cho thấy hàng trăm thuộc tính mà một cửa sổ và các lớp cơ sở của nó có.

Đối với những thứ có thể liên quan, bạn có thể chỉ cho tôi tài nguyên, sách hoặc thậm chí chỉ là những thay đổi trong quan điểm khiến việc này dễ nuốt hơn. Tôi sẽ cung cấp cho MVVM một lần nữa, nhưng lần trước tôi cảm thấy khá ngu ngốc vì lo lắng về việc tiêm phụ thuộc chỉ để hiển thị một hộp thông báo từ máy ảo mà tôi không có ý định thử nghiệm đơn vị. Ngay cả khi tôi đã thực hiện kiểm tra đơn vị, chúng tôi có thực sự đạt được chất lượng cao hơn bằng cách giao dịch kiểm tra thời gian chạy đối với các lỗi thời gian biên dịch của các ứng dụng "kết nối chặt chẽ" đáng sợ đó không?

Tôi nhận ra một câu trả lời là chỉ ở lại winforms. Nhưng là một trong những người ủng hộ cuối cùng của WebForms (tôi có nhiều chỉ trích về xu hướng phát triển web), tôi cảm thấy hơi giống một con khủng long khi tôi phát hiện ra không còn WebForms nào trong các dấu vết chứng nhận của Microsoft. Tiến về phía trước là lựa chọn duy nhất, ngay cả khi tôi không thích nó.


1
Mặc dù tôi không khuyến khích nhưng vẫn có thể viết ứng dụng WPF theo kiểu WinForms với các sự kiện và mã phía sau. Đối với các ứng dụng một lần đơn giản, đó không phải là vấn đề lớn. Nó liên quan đến những gì bạn coi trọng và những gì cung cấp giá trị cho doanh nghiệp. Tôi là một fan hâm mộ lớn của TDD và MVVM, nhưng nếu nó thực sự không mang lại giá trị, đừng làm điều đó. Đó không phải là một tôn giáo. Chỉ cần nhớ rằng mã thường sống lâu hơn nhiều so với chúng ta nghĩ.
Matt H

"Không ai khác thấy nó kỳ quặc khi mọi người đi vào các bản mô tả dài về 'tiêm phụ thuộc' và 'nhà cung cấp dịch vụ nhắn tin' cho một cuộc gọi Window.ShowDialog đã tồn tại trong nhiều thập kỷ?" Tôi thấy khó chịu, nhưng loại người mắc phải tất cả những điều đó (gây bất lợi cho việc thực hiện mọi thứ) luôn là một phần của lĩnh vực này, và thật không may, có lẽ sẽ luôn luôn như vậy. Chiến lược tốt nhất là bỏ qua / đánh lạc hướng chúng càng nhiều càng tốt.
1172763

Câu trả lời:


10

Quan điểm của tôi là từ nhiều năm kinh nghiệm làm việc với Winforms, "cách thức cũ", với các sự kiện và mã phía sau. Vì vậy, tôi có thể nói với bạn một cách chắc chắn tuyệt đối rằng, một khi bạn vượt ra khỏi các ứng dụng đơn giản nhất, mã của bạn nhanh chóng trở thành một quả bóng lớn . Đó là điều không thể tránh khỏi, bởi vì đó là cách các ứng dụng được viết lại trước đó.

Webforms là như nhau, ngoại trừ việc nó ném vào sự phức tạp thêm của việc là một sự trừu tượng hóa nhà nước đối với một hệ thống phi trạng thái (web). Như Rob Conery đã nói:

WebForms là một lời nói dối. Đó là sự trừu tượng bao bọc trong sự lừa dối được bao phủ trong nước sốt nói dối được trình bày trên một đĩa đầy sự nghi ngờ và bóng bẩy của bàn tay. Không có gì bạn làm với Webforms có liên quan đến web - bạn để nó làm việc cho bạn.

Điều này, từ anh chàng đã viết một trình ánh xạ quan hệ đối tượng đầy đủ chức năng bằng cách sử dụng dynamictừ khóa trong C # và chỉ bốn trăm dòng mã. Khi anh ấy nói một cách có thẩm quyền về một cái gì đó, tôi lắng nghe.

Ứng dụng tôi hiện đang làm việc là một ứng dụng Winforms, với một số tab ở dạng chính. Tôi có thể tự động tải các biểu mẫu vào mỗi tab. Mặc dù tôi đã không theo dõi MVVM hoặc MVP (bạn có thể, với các thư viện như thế này ), tôi đã tích cực đẩy từng bit mã tôi có thể ra một hội đồng riêng biệt, chỉ để lại mã đó là hoàn toàn bắt buộc để chạy biểu mẫu. Vẫn còn hàng trăm dòng mã trong đó, không kể lớp một phần có chứa các định nghĩa điều khiển, thuộc tính và các phép xử lý sự kiện của biểu mẫu, nhưng tôi không bao giờ phải chạm vào nó một lần nữa, trừ khi tôi cần thêm một cái gì đó mới vào biểu mẫu.

Tôi có một phương thức tĩnh mà tôi có thể trao một biểu mẫu và một tập hợp các cặp Khóa / Giá trị và nó sẽ (tự động sử dụng Reflection) khớp các khóa với các trường trong biểu mẫu và điền vào biểu mẫu với các giá trị của bộ sưu tập. Tôi cũng có thể làm ngược lại, nhận một bộ sưu tập các cặp Khóa / Giá trị từ các trường của biểu mẫu. Toàn bộ điều đó là khoảng hai mươi dòng mã, nhưng nó tự trả tiền mỗi khi tôi sử dụng nó, bởi vì tôi không phải viết bốn mươi câu lệnh gán tùy chỉnh cho bốn mươi điều khiển trên một biểu mẫu.

Tôi có thể lấy danh sách Khóa / Giá trị đó và tuần tự hóa nó thành XML, cho phép tôi duy trì nó thành một tệp. Tôi có các biểu mẫu khác mà tôi có thể trao một DTO thông thường và ánh xạ các trường của nó vào biểu mẫu. Không ai trong số này có thể thực tế theo kiểu "quả bóng lớn" của Winforms. Nó gần như không đáng kể khi việc tách rời thích hợp được sử dụng.

Trong số này có cái nào nghe quen thuộc không? Nó nên; về cơ bản, đó là hình thức ràng buộc dữ liệu của một người nghèo.

Phải thừa nhận rằng, tôi thực sự thích cơ sở dữ liệu của WPF. Để tận dụng lợi thế của nó, tôi đặt bối cảnh dữ liệu cho chính cửa sổ, nơi nó có quyền truy cập vào lớp nghiệp vụ cũng như bất kỳ thuộc tính quan sát nào khác.

Tốt cho bạn. Nó không phải tuân thủ MVVM. Nhưng hãy nhớ rằng, các mẫu như MVVM đã được tạo để giúp các nhà phát triển xây dựng các hệ thống lớn. Nếu bạn chỉ cần hiển thị một hộp thoại, bạn có thể không cần tất cả hệ thống ống nước đó.

Một phần của sự phức tạp của các hệ thống như WPF vốn có trong tất cả các thư viện lập trình viên tìm cách giải quyết một vấn đề cụ thể theo cách tổng quát. Để làm điều đó, bạn phải tính đến mọi cách thực tế mà một lập trình viên có thể sử dụng thư viện của bạn. Điều đó làm tăng thêm sự phức tạp, nhưng đối với những người thiết kế tốt thư viện của họ, nó cũng mang đến cho bàn một triết lý làm việc theo cách thống nhất và nhất quán.

Hãy xem xét thư viện jQuery của John Resig: đó là bản chất của một thiết kế mạch lạc và nó ẩn chứa rất nhiều chi tiết kỳ lạ về DOM và các biến thể trong cách trình duyệt xử lý nó. Có đơn giản hơn chỉ để viết một vài dòng Javascript? Đôi khi. Nhưng lợi ích của việc viết mã jQuery theo API thống nhất, mạch lạc giúp người tiếp theo đi cùng dễ hiểu những gì bạn đã làm và duy trì mã đó nếu cần.

Kinh nghiệm thực tế của tôi với các mô hình "ứng dụng lớn" là sử dụng ASP.NET MVC. ASP.NET là ASP.NET MVC vì Winforms là WPF. Khi tôi làm việc trong ASP.NET, tôi luôn phải vật lộn để uốn cong nó theo ý muốn của tôi. ASP.NET MVC uốn cong với bạn. Đó là một niềm vui để sử dụng; nó tạo ra một cấu trúc hệ thống rõ ràng và có tổ chức, và cung cấp cho bạn toàn quyền kiểm soát ứng dụng và đánh dấu của bạn. Bạn có thể sử dụng Javascript, jQuery và CSS một cách tự do và ASP.NET MVC luôn tránh xa bạn.

Trở ngại duy nhất của tôi là làm quen với nó, và làm quen với nó theo cách riêng của nó.

Đọc thêm
Bạn nên học MVC bởi Rob Conery


Cảm ơn bạn đã trả lời thật chu đáo quả bóng lớn bùn - tôi chắc chắn cảm thấy như vậy trong thời của mã asp và spaghetti cổ điển. Thiết kế 3 tầng với vb6 / mts đã khắc phục rất nhiều điều đó, và sau đó bản phát hành của .net đã kết hợp tất cả lại với nhau. Nhưng bây giờ nếu cảm thấy lợi nhuận của các mẫu bổ sung đang giảm nhanh chóng - như chi 1 triệu đô la để lấy đi 1 giây trong thời gian một phần tư dặm của bạn. "Tôi đã tích cực đẩy từng bit mã mà tôi có thể ra một hội đồng riêng biệt" - bạn không thấy rằng điều này mang lại trải nghiệm phát triển bị bẻ gãy đáng kinh ngạc - liên tục nhảy từ tệp này sang tệp khác để đọc hai dòng?
b_levitt

3
don't you find that this gives an incredibly fractured development experience - constantly jumping from file to file to read two lines?- Không, nó ngược lại. Đưa vào một hội đồng khác như thế này giải phóng tâm trí của bạn để tập trung vào từng lớp và phương thức theo các thuật ngữ riêng của nó, như một hộp đen nhỏ của riêng nó. Điều đó rất khó thực hiện với một quả bóng bùn lớn. MVC hoạt động theo nguyên tắc tương tự: bộ điều khiển mỏng, mô hình béo, không có mã trong chế độ xem trừ khi thực sự cần thiết.
Robert Harvey

3
Yagni chỉ áp dụng khi bạn đang tự viết mã. Nếu bạn đang viết một thư viện tổng quát phải đáp ứng nhiều đối tượng với nhu cầu đa dạng, bạn sẽ cần nó.
Robert Harvey

1
Nhân tiện, tôi không có gì chống lại vòng đời ASP.NET; Tôi đã thấy mọi người sử dụng nó để có hiệu quả tuyệt vời. Tôi chỉ thấy nó phản trực giác, thế thôi. ASP.NET MVC không bắt buộc bạn phải thực hiện bất kỳ phát triển phía máy khách nào, nếu bạn không muốn; bạn có thể sử dụng các chế độ xem "ngu ngốc" và nó hoạt động hoàn toàn tốt. Đáng chú ý: rất nhiều nội dung này có thể được tạo mã (giống như biểu mẫu Windows), vì vậy nó không giống như bạn tự viết tất cả mã. Tôi hiểu rằng điều này ít đúng với WPF, nơi bạn phải đối phó với XAML và tôi nghĩ có chỗ để cải thiện ở đó.
Robert Harvey

2
dozens of lines of plumbing to replace Window.Show- Đó là một chút đơn giản hóa. Nếu cửa sổ cần dữ liệu, sẽ luôn có một loại hệ thống ống nước để đưa dữ liệu đó vào các điều khiển của cửa sổ và ngược lại. Bạn có thể viết mã lặp đi lặp lại nhiều lần cho mọi hình thức bạn tạo hoặc sử dụng một số hình thức giải pháp tổng quát như ràng buộc dữ liệu.
Robert Harvey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.