Tại sao có mã người dùng / mã viết tay tối thiểu và làm mọi thứ trong XAML?


12

Tôi cảm thấy cộng đồng MVVM đã trở nên quá nhiệt tình như các lập trình viên OO trong những năm 90 - đó là một MVVM sai lầm đồng nghĩa với việc không có mã. Từ câu hỏi StackOverflow đã đóng của tôi :

Nhiều lần tôi bắt gặp các bài đăng ở đây về ai đó đang cố gắng thực hiện tương đương trong XAML thay vì mã phía sau. Lý do duy nhất của họ là họ muốn giữ mã của họ phía sau 'sạch'. Sửa lỗi cho tôi nếu tôi sai, nhưng không phải là trường hợp:

XAML cũng được biên dịch - thành BAML - sau đó tại thời gian chạy phải được phân tích cú pháp thành mã. XAML có khả năng có thể có nhiều lỗi thời gian chạy hơn vì chúng sẽ không được trình biên dịch chọn trong thời gian biên dịch - từ cách viết không chính xác - những lỗi này cũng khó gỡ lỗi hơn. Đã có mã phía sau - thích hay không là LaunchizeComponent (); phải được chạy và tệp .gics chứa trong đó chứa một loạt mã mặc dù nó có thể bị ẩn. Có phải nó hoàn toàn là tâm lý? Tôi nghi ngờ đó là các nhà phát triển đến từ một nền tảng web và thích đánh dấu trái ngược với mã.

EDIT: Tôi không đề xuất mã phía sau thay vì XAML - sử dụng cả hai - Tôi cũng thích thực hiện ràng buộc của mình trong XAML - Tôi chỉ chống lại mọi nỗ lực để tránh viết mã phía sau đặc biệt trong ứng dụng WPF - đó là một sự hợp nhất cả hai để có được nhiều nhất của nó.

CẬP NHẬT: Ý tưởng thậm chí không phải của Microsoft, mọi ví dụ trên MSDN cho thấy cách bạn có thể thực hiện trong cả hai.

Câu trả lời:


9

Tôi chưa bao giờ nghe ai đề nghị đưa mọi thứ vào XAML.

Trên thực tế, đó sẽ là một ý tưởng tồi tệ, IMO.

Vấn đề, về mặt lịch sử, xuất phát từ các ứng dụng Winforms có logic trong mã của chúng không thuộc về nó, bởi vì đó là logic . Đó là nơi tầm quan trọng của VM đến từ. Nó cho phép bạn cách ly các phần gắn kết View với Model.

Do đó, Chế độ xem được để lại chỉ xử lý những gì hoạt động tốt nhất, đó là UI.

Bây giờ, nếu bạn tình cờ gặp phải tình huống UI của bạn yêu cầu mã, thì bằng mọi cách hãy tìm nó và đặt nó vào mã của bạn phía sau. Tuy nhiên, tôi sẽ nói rằng đối với 95% các kịch bản ngoài kia, rất có thể bạn sẽ tốt hơn khi để UI trong tệp đánh dấu và nếu bạn cần một số mã phía sau, có lẽ đó là logic mà bạn đang cố gắng viết ra đó là phần thích hợp hơn để lại cho Mô hình xem. Ngoại lệ cho điều này là những thứ như Hành vi, nhưng chúng là những động vật riêng biệt hoàn toàn và yêu cầu một vị trí đặc biệt (nghĩa là không nằm trong mã của bạn phía sau).


"Không có mã ... bao giờ" là một quy tắc ... các quy tắc có nghĩa là bị phá vỡ trong các tình huống phù hợp
WernerCD

1

Để trả lời trực tiếp câu hỏi của bạn và giả sử rằng khi bạn nói "mã" rằng trong mọi trường hợp bạn đang đề cập cụ thể đến mã phía sau (mã nằm trong lớp điều khiển trực quan), lý do là để giao diện người dùng của bạn có thể được thực hiện hoàn toàn và thao tác trong Blend, chỉ sử dụng một công nghệ. Giả định là các nhà thiết kế UX của bạn không phải là nhà phát triển và không muốn làm việc với mã, và họ là các chuyên gia bố trí và XAML trái ngược với các chuyên gia mã hóa. Nếu bạn triển khai mọi thứ mà không cần mã phía sau, bạn có thể cung cấp cho các loại nhà thiết kế đó các công cụ họ cần để làm việc hoàn toàn bằng ngôn ngữ của họ.

Nó cung cấp một sự tách biệt rõ ràng giữa lập trình mệnh lệnh và thiết kế khai báo.

Đó là lý do thúc đẩy sự tồn tại của "hành vi" trong Silverlight và WPF - thay vì đưa một số mã vào mã phía sau, hãy tạo một hành vi mô đun có thể tái sử dụng nhỏ của riêng mình. Nếu bạn làm như vậy, Blend mang lại cho bạn lợi ích của việc có thể kéo và thả nó vào điều khiển theo nghĩa đen. Bây giờ, thay vì có một phần chuyển động một lần sang điều khiển XAML toàn phần khác, bạn đã trừu tượng hóa các phần chuyển động vào một thùng chứa đẹp có thể được thao tác bằng các công cụ thiết kế.


1

Theo kinh nghiệm của tôi, điều này thường xuất hiện khi cố gắng sử dụng logic phức tạp trong các trình kích hoạt XAML để tránh nó ra khỏi mã phía sau, khi cách tiếp cận tốt hơn, đơn giản hơn sẽ đưa logic đó vào trong khung nhìn - nó không thuộc về chế độ xem -mô hình.


1

Một trong những lợi thế lớn nhất để làm mọi thứ bạn có thể trong xaml là nó giữ tất cả các hành vi ở một nơi. Mỗi khi nhà phát triển phải nhảy giữa xaml và mã, nó trở nên khó hiểu hơn.

Tôi đã ở trong một nhóm WPF không giảm mã ưu tiên. Đã có nhiều lần việc gỡ lỗi khó khăn hơn nhiều vì một số trình xử lý sự kiện đang thao túng điều khiển và nó không rõ ràng ngay lập tức vì hành vi nằm rải rác trong hai tệp.

Điều đó nói rằng, tôi tin rằng bạn đúng khi nghĩ rằng đôi khi bạn tốt hơn là thỏa hiệp theo nguyên tắc thiết kế. Một số điều rất khó để làm trong xaml. Tôi đã dành hàng giờ hoặc thậm chí nhiều ngày để cố gắng để hành vi hoạt động trong xaml mà tôi có thể thực hiện trong thời gian ngắn hơn nhiều bằng cách sử dụng mã phía sau. Tôi đã đến để coi mã phía sau như là phương sách cuối cùng, nhưng tôi sẽ không bao giờ nói với ai đó rằng họ không bao giờ nên sử dụng nó. Đó chỉ là một sự đánh đổi mà một kỹ sư giỏi cần phải hiểu.

chỉnh sửa: Từ các bình luận có vẻ như bài viết của tôi đang được hiểu là tranh luận chống lại xaml. Ý định của tôi là tranh luận ngược lại. Xaml tinh khiết luôn luôn thích hợp hơn vì nó giữ tất cả các hành vi ở một nơi. Một kết hợp của xaml và mã phía sau có thể bị sai lệch, vì vậy giảm thiểu mã phía sau là lý tưởng. Xaml thích hợp hơn mã phía sau vì nhiều lý do. WPF và Silverlight được thiết kế để viết bằng xaml.


2
Theo logic này, chúng ta cũng có thể thực hiện lại mọi thứ trong mã đơn giản.
Steven Jeuris

@ Steven Jeuris Trong một số cách, có thể thích hợp hơn với sự pha trộn rải rác của xaml và mã. Tôi đã thấy nó được thực hiện hoàn toàn trong mã và công việc.
vẽ

Từ quan điểm lập trình thuần túy, tôi đồng ý. Nhưng điều quan trọng là XAML cho phép phát triển dễ dàng các công cụ có thể được sử dụng bởi các nhà thiết kế, tách biệt hoàn toàn với mã.
Steven Jeuris

@Steven Jeuris: Tôi hoàn toàn đồng ý. Tôi làm mọi thứ trong xaml bất cứ khi nào tôi có thể. Đó là những gì tôi muốn nói khi trong bài đăng tôi đã nói, "Tôi đã đến để coi mã phía sau là phương sách cuối cùng." Tôi đang cố gắng tranh luận rằng ít mã phía sau hầu như luôn luôn tốt hơn. Mục tiêu của tôi là nói rằng xaml thuần túy là tốt nhất, nhưng giống như hầu hết các nguyên tắc thiết kế, bạn có thể thỏa hiệp và đột nhập vào mã phía sau trong các tình huống hiếm hoi.
vẽ

1

Tôi chỉ có kiến ​​thức rất hời hợt về XAML, nhưng điều đó gây khó khăn cho tôi rằng trình biên dịch sẽ không phát hiện lỗi chính tả.

Sự khác biệt cơ bản là, XAML là khai báo , trong khi C # là bắt buộc.

Chỉ cần đặt:

Pane p = new Pane(200, 100);
Button foo = new Button("foo");
Button bar = new Button("bar");
p.addChild(foo);
p.addChild(bar);

so với

<Pane width="200" height="100">
    <Button label="foo"/>
    <Button label="bar"/>
<Pane>

Mã phía trên thực sự tạo ra một hệ thống phân cấp bởi các tác dụng phụ, trong khi mã dưới chỉ đơn giản là khai báo nó. Điều đáng chú ý là, ví dụ, trong khi ví dụ addChildphương thức có thể được đổi tên, mối quan hệ cha-con là cốt lõi của mô hình ngữ nghĩa và được thể hiện giống như trong đoạn trích khai báo. Nó rất xa so với việc thực hiện, cho phép tối ưu hóa nhiều bên dưới, chẳng hạn như khởi tạo lười biếng, hoàn toàn trong suốt.
Lập trình khai báo có một số lợi thế. Nó ngắn gọn hơn, biểu cảm và rất gần với mô hình của bạn. Tôi sẽ đi xa như nó là tốt hơn.

Tuy nhiên, điều này không có nghĩa, bạn nên cố gắng đấm mọi thứ vào XAML. C # có nhiều cấu trúc mức cao cho phép một kiểu khai báo.

Cuối cùng, bạn muốn mã của bạn ngắn và dễ đọc. Vì vậy, nếu bạn có thể đạt được điều tương tự trong C # với ít mã hơn trong XAML, sử dụng C # là hợp lý. Tuy nhiên, hãy nhớ rằng mã XAML "dễ mang theo" hơn theo nghĩa là nó ít bị tổn thương hơn với các thay đổi trong các thành phần được sử dụng, trừu tượng hóa khung .NET (ví dụ: chi tiết về cách thực hiện liên kết).

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.