Tại sao thế giới .Net dường như nắm lấy các chuỗi ma thuật thay vì các lựa chọn thay thế được gõ tĩnh?


47

Vì vậy, tôi làm việc trong .Net. Tôi thực hiện các dự án nguồn mở trong .Net. Một trong những vấn đề lớn nhất của tôi với nó không phải là cần thiết với .Net, nhưng với cộng đồng và các khuôn khổ xung quanh nó. Dường như ở khắp mọi nơi, các kế hoạch đặt tên và chuỗi ma thuật được coi là cách tốt nhất để làm mọi thứ. Tuyên bố táo bạo, nhưng nhìn vào nó:

MVC MVC:

Xin chào lộ trình thế giới:

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

Điều này có nghĩa là ASP.Net MVC bằng cách nào đó sẽ tra cứu HomeControllermã của bạn. Bằng cách nào đó tạo một thể hiện mới của nó, và sau đó gọi hàm Index rõ ràng với một idtham số nào đó. Và sau đó là những thứ khác như:

RenderView("Categories", categories);
...or..
ViewData["Foobar"]="meh";

Và sau đó cũng có những điều tương tự với XAML. DataContextđược coi là một đối tượng và bạn phải hy vọng và cầu nguyện rằng nó sẽ giải quyết theo loại bạn muốn. DependencyProperies phải sử dụng chuỗi ma thuật và quy ước đặt tên ma thuật. Và những thứ như thế này:

  MyData myDataObject = new MyData(DateTime.Now);      
  Binding myBinding = new Binding("MyDataProperty");
  myBinding.Source = myDataObject;

Mặc dù nó phụ thuộc nhiều hơn vào việc truyền và các hỗ trợ thời gian chạy ma thuật khác nhau.

Dù sao, tôi nói tất cả những điều đó để kết thúc ở đây: Tại sao điều này được dung nạp tốt trong thế giới .Net? Không phải chúng ta đang sử dụng các ngôn ngữ gõ tĩnh để hầu như luôn biết loại sự vật là gì? Tại sao sự phản chiếu và kiểu / phương thức / thuộc tính / bất kỳ tên nào (dưới dạng chuỗi) được ưa thích hơn nhiều so với khái quát và đại biểu hoặc thậm chí tạo mã?

Có những lý do kế thừa mà tôi thiếu vì lý do tại sao cú pháp định tuyến của ASP.Net hầu như chỉ dựa vào sự phản chiếu để thực sự giải quyết cách xử lý một tuyến đường? Tôi ghét khi tôi thay đổi tên của một phương thức hoặc thuộc tính và đột nhiên mọi thứ bị phá vỡ, nhưng dường như không có bất kỳ tham chiếu nào đến phương thức hoặc thuộc tính đó và tất nhiên không có lỗi biên dịch. Tại sao sự tiện lợi rõ ràng của các chuỗi ma thuật được coi là "đáng giá"?

Tôi biết cũng có những lựa chọn thay thế thường được gõ tĩnh cho một số thứ, nhưng chúng thường có hàng ghế sau và dường như không bao giờ có trong hướng dẫn hoặc tài liệu mới bắt đầu khác.


14
Sự năng động vô nghĩa đã trở thành cơn thịnh nộ kể từ khi CPU của chúng tôi đủ nhanh để thực hiện nó.
DeadMG

7
Làm sao vậy Tôi chưa thấy ví dụ nào như vậy với LINQ.
DeadMG

6
Dự đoán khiêm tốn của tôi là sự thay thế được gõ tĩnh đúng cách là quá bất tiện. Đó thực sự là một chủ đề xuất hiện rất nhiều với hầu hết các hệ thống loại: "Chúng tôi muốn thực hiện điều này trong hệ thống loại, nhưng nó không đủ biểu cảm." (Hoặc ngược lại: "Chúng tôi đã thể hiện thành công điều này trong hệ thống loại, nhưng nó khiến mọi thứ phức tạp gấp ba lần.") @ GlenH7 Tôi không quen thuộc lắm với tất cả LINQ, nhưng các bit tôi đã sử dụng không thể hiện bất cứ điều gì thậm chí gần những gì bài viết này mô tả. Muốn đưa ra một ví dụ?

2
@Earlz Quan trọng hơn, các đối tượng ẩn danh được gõ tĩnh. Không có chuỗi ma thuật, trình biên dịch biết tên và loại của tất cả mọi thứ liên quan. Tiết kiệm cho mọi mục đích sử dụng khác var.

1
@Earlz thật thú vị, mặc dù người ta có thể lập luận rằng cú pháp lambda là sự phình to bổ sung ở đây. Tôi đoán là họ đã sử dụng phương pháp tiếp cận / quy ước ma thuật bởi vì nó đơn giản, "đủ tốt" cho nhiều người và họ luôn có thể điều chỉnh công cụ để đưa ra một số hướng dẫn / an toàn. Đó là một sự đánh đổi giữa sự an toàn và tiện lợi, IMHO. Việc sử dụng ViewBag năng động cũng gợi ý về tâm lý này (không phải tôi hoàn toàn đồng ý với nó).
Daniel B

Câu trả lời:


31

Trên thực tế, có một sự đẩy lùi trong thế giới .NET chống lại chính những điều bạn đã đề cập. Trong ví dụ đầu tiên bạn đã đưa ra, công cụ định tuyến được đưa ra một quy ước để ánh xạ tuyến đường mặc định. Thực tế là các tuyến là động khiến cho không thể sử dụng cấu hình tĩnh.

Bạn cũng đề cập đến XAML / WPF, cả hai đều đang được phát triển tốt trước khi thuốc generic được đưa vào .NET và quay trở lại để hỗ trợ thuốc generic sẽ trì hoãn một sản phẩm đã rất muộn (Longhorn / Vista) hơn nữa.

Có các ví dụ trong khung công tác ASP.NET MVC sử dụng các biểu thức lambda thay cho các chuỗi ma thuật và Entity Framework / LINQ đưa nó đi xa hơn trong đó ngôn ngữ và khung cung cấp hỗ trợ riêng để soạn các truy vấn SQL trên biểu đồ đối tượng tĩnh (thay vì xây dựng chuỗi SQL ma thuật, bạn có được biên dịch xác thực thời gian của các truy vấn của bạn).

Đối với các ví dụ khác về cấu hình tĩnh, hãy xem structuremap và các thùng chứa phụ thuộc hiện đại khác và các khung công tác khác cần kiểm tra biểu đồ đối tượng trong thời gian chạy nhưng cho phép nhà phát triển cung cấp tĩnh các gợi ý sử dụng biểu thức lambda.

Vì vậy, câu trả lời ngắn gọn là trong lịch sử, .NET không hỗ trợ truyền tải tĩnh của đồ thị đối tượng cho đến khi phát hành 3.5. Bây giờ chúng ta đã có nó, nhiều nhà phát triển thích nó hơn các chuỗi ma thuật và nhiều người đã cố gắng hỗ trợ sâu hơn như toán tử SymbolOf hoạt động tương tự như toán tử typeOf.


3
XAML dài dòng vì nó ... thêm hỗ trợ cho thuốc generic sẽ khiến nó trở nên thậm chí hơn (vâng tôi biết toàn bộ XAML không được tạo ra cho con người Đối số). Ngoài ra, tôi thấy XAML gần giống với HTML hơn là ngôn ngữ lập trình thực tế. Nó không nên quan tâm đến loại đối tượng mà nó đang hiển thị, chỉ là cách hiển thị nó.
Michael Brown

2
Generics đã đến 2.0, nhưng chúng tôi đã không nhận được Biểu thức cho đến 3.5 (với LINQ). Biểu hiện là sức mạnh mà LINQ và cộng đồng đã nắm lấy sức mạnh đó và chạy theo nó. Kỹ thuật này được gọi là phản xạ tĩnh
Michael Brown

1
Điểm tốt về phản xạ tĩnh. Tôi quên mất điều đó được giới thiệu trong 3.5
Earlz

2
Đây là một câu trả lời tuyệt vời và tôi chắc chắn đồng ý với phản hồi. Tất cả những điều này tôi tránh như bệnh dịch hạch vì nếu có lỗi đánh máy hoặc lỗi, chúng chỉ bị bắt khi chạy, có nghĩa là chúng rất dễ bị bỏ qua. Họ cũng làm cho tái cấu trúc vô cùng khác nhau. Tránh tránh tránh!
Rocklan

2
Đồng ý về việc đẩy lùi. T4MVC là một dự án nhảy vào tâm trí mong muốn loại bỏ rất nhiều chuỗi và thay thế chúng bằng mã được gõ mạnh.
Carson63000
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.