Linq có ảnh hưởng đến các lập trình viên .NET không?


36

Rất nhiều người trong chúng ta bắt đầu thấy hiện tượng này với jQuery khoảng một năm trước khi mọi người bắt đầu hỏi làm thế nào để thực hiện những điều hoàn toàn điên rồ như lấy chuỗi truy vấn bằng jQuery . Sự khác biệt giữa thư viện (jQuery) và ngôn ngữ (JavaScript) rõ ràng đã bị mất đối với nhiều lập trình viên và dẫn đến rất nhiều mã không phù hợp, phức tạp được viết khi không cần thiết.

Có lẽ đó chỉ là trí tưởng tượng của tôi, nhưng tôi thề là tôi bắt đầu thấy sự gia tăng số lượng câu hỏi mà mọi người đang yêu cầu làm những điều điên rồ tương tự với Linq, như tìm phạm vi trong một mảng được sắp xếp . Tôi không thể biết được các phần mở rộng Linq không phù hợp đến mức nào để giải quyết vấn đề đó, nhưng quan trọng hơn là tác giả chỉ cho rằng giải pháp lý tưởng sẽ liên quan đến Linq mà không thực sự nghĩ về nó (theo như tôi có thể nói). Dường như chúng ta đang lặp lại lịch sử, tạo ra một thế hệ lập trình viên .NET mới, những người không thể nói được sự khác biệt giữa ngôn ngữ (C # / VB.NET) và thư viện (Linq).

Điều gì chịu trách nhiệm cho hiện tượng này? Có phải chỉ là cường điệu? Xu hướng Magpie? Linq có nổi tiếng là một dạng phép thuật không, thay vì thực sự viết mã, bạn chỉ cần phải thốt ra câu thần chú đúng? Tôi hầu như không hài lòng với những lời giải thích đó nhưng tôi thực sự không thể nghĩ gì khác.

Quan trọng hơn, nó có thực sự là một vấn đề không, và nếu vậy, cách tốt nhất để giúp soi sáng cho những người này là gì?


6
+1 cho "giả định rằng giải pháp lý tưởng sẽ liên quan đến Linq mà không thực sự nghĩ về nó". Nó thực sự vượt xa tôi.
Jaco Pretorius

1
Linq chậm ...

2
@Pierre: Trên cơ sở nào bạn đưa ra yêu cầu đó?
Aaronaught

5
@Mason: Đó là một tiêu chuẩn hoàn toàn khủng khiếp được viết bởi một người rõ ràng không biết họ đang làm gì. Điểm chuẩn trong tích tắc? Ký hiệu Hungary? Và phiên bản Linq thậm chí không làm điều tương tự, nó cố gắng lặp lại mọi kết quả duy nhất thay vì dừng lại ở lần đầu tiên. Chưa kể, toàn bộ tiền đề là ngớ ngẩn, như đã được thảo luận một cách tình cờ trong câu hỏi nóng hổi ngày hôm nay .
Aaronaught

3
Và, tình cờ @Mason, Linq có nhiều tối ưu hóa được tích hợp. Đối với hầu hết mọi phương pháp có khả năng tối ưu hóa, trước tiên, nó tìm kiếm một giao diện hỗ trợ phương thức tối ưu hóa. Đối với các phương thức dựa trên tập hợp khác như Equijoins, nó tạo các bảng băm. Nó không tối ưu hóa mã của bạn cho bạn nhưng nó sẽ không làm cho mã của bạn chậm hơn; hầu hết các sự chậm lại trong thế giới thực được ghi nhận là do lambdas / đóng cửa độc lập với Linq.
Aaronaught

Câu trả lời:


52

Về cơ bản là vì lập trình rất khó. Nó đòi hỏi rất nhiều suy nghĩ hợp lý, có cấu trúc theo cách mà nhiều người không biết làm. (Hoặc đơn giản là không thể làm, tùy thuộc vào người bạn nghe.)

Những thứ như LINQ và jQuery làm cho một số tác vụ thao tác dữ liệu phổ biến dễ dàng hơn rất nhiều. Điều đó thật tuyệt vời cho những người trong chúng ta biết những gì chúng ta đang làm, nhưng tác dụng phụ đáng tiếc là nó làm giảm thanh. Nó giúp dễ dàng hơn cho những người không biết họ đang làm gì để bắt đầu viết mã và làm cho mọi thứ hoạt động. Và sau đó khi họ chạy vào thực tế và thấy một điều khó khăn cơ bản là các kỹ thuật đơn giản, mức độ trừu tượng cao của họ không phù hợp lắm, họ đã lạc lối, vì họ không hiểu nền tảng mà thư viện của họ được xây dựng.

Câu hỏi của bạn được sắp xếp đúng hướng, nhưng giống như cuộc tranh cãi lâu năm về các trò chơi video bạo lực "biến trẻ em thành bạo lực", nó có hướng liên kết ngược. Kỹ thuật lập trình dễ dàng không làm cho lập trình viên trở nên ngu ngốc; họ chỉ thu hút những người ngu ngốc để lập trình. Và thực sự không có nhiều bạn có thể làm về nó.


30
+1 cho "Các kỹ thuật lập trình dễ dàng không làm cho lập trình viên trở nên ngu ngốc; họ chỉ thu hút những người ngu ngốc để lập trình."
Steven Evers

1
Một điều tuyệt vời về LINQ là nó cho phép tôi tạo ra một giải pháp theo cách tiếp cận chức năng. Sau đó, khi tôi có một giải pháp không có lỗi, tôi có thể sử dụng nó làm bàn thử nghiệm cho phiên bản bắt buộc được tối ưu hóa. Nếu tác vụ đủ đơn giản như áp dụng một bộ lọc, tôi thậm chí sẽ không bận tâm.
ChaosPandion

5
Tôi vẫn nghi ngờ rằng LINQ thu hút các lập trình viên bất tài - từ những gì tôi đã thấy, nó dường như là một trong những khái niệm khó hiểu nhất đối với người mới - nhưng, đây dường như là câu trả lời tốt nhất cho đến nay.
Aaronaught

1
Bạn nên đặt bản quyền cho câu cuối cùng đó. Vâng nói, thưa ông.
AJ Johnson

1
Buồn cười. Đối với tôi, LINQ không phải là một khái niệm đặc biệt dễ làm chủ. Nếu bạn đang làm bất cứ điều gì của sự tinh tế, rất nhanh bạn cần ngừng suy nghĩ về tay lái và bắt đầu hiểu về việc truyền. Tôi đang nhìn bạn lamdas!
Brian MacKay

13

Đối với tôi đó là hiện tượng đồ chơi mới. Một cái gì đó mới xuất hiện (LINQ) và bây giờ mọi nhà phát triển đều muốn chơi với nó.

Họ coi LINQ như một cái búa và mọi vấn đề là một cái đinh. Ai quan tâm nếu nó đơn giản hơn để làm điều đó theo cách khác? LINQ phải là câu trả lời! Giống như khi mọi người đang sử dụng XML cho MỌI THỨ! Tập tin cấu hình? XML. Lưu trữ dữ liệu? XML. Vân vân


5
Không muốn bắt đầu một cuộc tranh luận về XML ở đây, nhưng thật đáng để chỉ ra rằng XML thực sự tốt ở cả hai điều đó. Không phải lúc nào cũng tối ưu - nếu các tệp cấu hình không cần phải được cấu trúc thì KVP sẽ tốt hơn và nếu khả năng tương thích ứng dụng chéo không phải là một yêu cầu thì định dạng nhị phân rõ ràng tốt hơn cho việc lưu trữ / tuần tự hóa. Nhưng tôi không nghĩ XML là một ví dụ tuyệt vời như vậy bởi vì nó có xu hướng thấy nó được sử dụng trong các lĩnh vực mà nó chỉ đơn thuần là tối ưu thay vì hoàn toàn không phù hợp.
Aaronaught

4
+1: Thật đáng để kéo dài các công cụ của bạn để xem có bao nhiêu vấn đề có thể được dồn vào hình dạng của móng tay khi bạn học công nghệ.
Steven Evers

+1: Các ví dụ khác về loại búa ma thuật này là jQuery (như đã đề cập trong câu hỏi) và các biểu thức thông thường. Không phải những điều này là xấu, trên thực tế chúng thực sự hữu ích, nhưng chúng không phải là câu trả lời cho mọi thứ.
Tim Goodman

14
Tôi nghĩ rằng sự tương tự "LINQ là một cái búa và mọi vấn đề là một cái đinh" đang đẩy nó đi quá xa. Tôi muốn nói rằng LINQ là một cây búa tốt đến nỗi khi một phần lớn công việc của bạn liên quan đến móng tay, bạn có thể đi vào một rãnh và không nhận thấy rằng bạn vừa đập vào một cái đinh vít. Ngay cả khi bạn không phải là một lập trình viên tồi.
Carson63000

@Aaronaught: Mặt khác, việc sử dụng XML với các tên trường dài dường như không tối ưu đối với tôi để truyền dữ liệu thông qua các liên kết vô tuyến băng thông thấp và không hoàn toàn đáng tin cậy. Một lần nữa, đó cũng là những gì tôi nghĩ về thiết kế cơ sở dữ liệu trên sản phẩm đó.
David Thornley

10

Tôi nghĩ LINQ cung cấp một cơ hội thực sự tốt trong C # trong việc giải quyết các vấn đề bằng cách sử dụng một cách tiếp cận chức năng hơn. Chúng ta không nên loại bỏ một phong cách giải quyết vấn đề mới chỉ vì chúng ta đã có một cái gì đó hoạt động.

Xuất phát từ một nền tảng SQL nặng nề, tôi thích có tùy chọn sử dụng logic dựa trên tập hợp trong C # của mình để mô tả rõ hơn ý định hoạt động của tôi.

Mà nói; bối cảnh là vua, và bất cứ điều gì có thể được sử dụng quá mức.


Ai đang sa thải? Tôi sử dụng Linq mọi lúc, tôi chỉ quan tâm đến số lần tôi gặp phải của những người sử dụng nó (hoặc cố gắng sử dụng nó) cho các vấn đề lặp đi lặp lại rõ ràng và không dựa trên thiết lập.
Aaronaught

Tôi rất quen với việc cố gắng giải quyết các vấn đề đã được yêu cầu viết bằng SQL và sử dụng logic dựa trên tập hợp thay vì các con trỏ để làm như vậy. Lạm dụng công cụ sẽ luôn xảy ra, nhưng tôi đoán ít nhất nếu họ viết mã LINQ kém thay vì mã thủ tục kém, một phiên bản .NET tiếp theo sẽ dễ dàng ít nhất có thể song song hóa nó.
dotjosh

2

LINQ và jQuery là "đồ chơi" mới nhất và các nhà phát triển thích thể hiện cách họ có thể làm mọi thứ bằng cách sử dụng thứ mới nhất.


Tôi đồng ý với câu nói này. Tôi không chắc chắn nếu nó giải thích hiện tượng đặc biệt này. Những người hỏi những câu hỏi này dường như không phải là kiểu phô trương - mặc dù nó sẽ giúp giải thích lý do tại sao các lập trình viên khác cố gắng trả lời các câu hỏi như được hỏi thay vì ủng hộ cách tiếp cận saner.
Aaronaught

@Aaronaught - Vâng, tôi đoán tôi đã suy nghĩ nhiều hơn về lý do tại sao mọi người trả lời với các câu hỏi bằng cách sử dụng phương pháp này.
Dan Diplo

2

Nếu bạn sử dụng Linq đúng cách và hiểu nó dưới mui xe, bạn sẽ tìm thấy tất cả các loại kỹ thuật lập trình tiên tiến mới.

Vì vậy, nếu bạn suy nghĩ sâu sắc về các cải tiến, tôi lập luận rằng nó làm cho bạn trở thành một lập trình viên tốt hơn. Cho dù một lập trình viên nhất định có thực sự làm điều này hay không, đó không phải là lỗi của Linq.

Lập luận tương tự có thể được đưa ra cho các Mappers quan hệ đối tượng. Có ai thực sự viết các truy vấn SQL thô đối với các bảng cơ sở dữ liệu nữa không? :)


10
Xin chào, tôi viết SQL thô ... sniff
Aaronaught

2
SQL thô là đặt cược tốt nhất nếu bạn biết những gì bạn đang làm.
Fosco

1
+1 cho đối số "làm cho bạn trở thành một lập trình viên tốt hơn". Hiểu linq và đặc biệt là các phương pháp hỗ trợ nó chắc chắn đã cải thiện sự hiểu biết của tôi về một số khái niệm lập trình rất hữu ích.
John M Gant

1
Tôi nghĩ ai đó đã xúc phạm ORM so với nhận xét SQL thô. Đó không phải là tôi; Tôi sử dụng cả hai, và tôi hiểu nhận xét là tặc lưỡi.
Aaronaught

1
Tôi sẽ không bao giờ tin tưởng các truy vấn cơ sở dữ liệu phức tạp của mình vào crap mà ORM viết, Nó tốt cho các công cụ đơn giản, nhưng ugh cho các truy vấn loại báo cáo. Một lần nữa, trong tay một người biết họ đang làm gì ORM là một điều tốt, trong tay của một người quá lười biếng để hiểu cơ sở dữ liệu, thảm họa phía trước.
HLGEM

1

Một số trong những điều điên rồ đó là do mọi người đang sử dụng búa sai, những người khác là vì họ đang chế tạo một siêu búa thực sự thanh lịch, nhưng họ đã gặp phải một chi tiết kỳ quặc cần phải khắc phục.

Ví dụ: nếu bạn thấy một câu hỏi về việc sử dụng linq để tạo linq động để sử dụng chống lại linq không động, chín lần trong số mười người, chỉ là tò mò nếu có thể, hoặc sủa sai cây, nhưng có một vài những điều bạn có thể giải quyết theo cách này rất khó đến mức không hợp lý để giải quyết theo cách khác.

Tôi lấy những loại câu hỏi này thành hai phần:

  1. nó có thể được thực hiện không, và nếu vậy nó sẽ trông như thế nào
  2. nó nên được thực hiện, có rủi ro, hoặc một sự thay thế tốt hơn

Tôi đã thấy rằng tôi hầu như luôn luôn làm chúng theo thứ tự đó. Nó trả lời câu hỏi và cũng giúp bạn đưa ra lời giải thích tốt hơn cho các lựa chọn thay thế tiềm năng.


0

Tôi không biết về bất kỳ hiệu ứng gây tê nào trong tâm trí của các nhà phát triển nhưng hãy xem ở đây về tác động của các công cụ / ngôn ngữ có đầu óc đánh giá về tỷ lệ. Nói về việc hạ thấp thanh!


0

Tôi đồng ý với Mason Wheeler. Tuy nhiên, không hoàn toàn điên rồ khi cố gắng giải quyết https://stackoverflow.com/questions/3762202/get-range-of-integers-with-linq bằng cách vận hành theo "trình tự". Vấn đề là các trình lặp của Java và .Net không hỗ trợ cả 3 thao tác: giá trị hiện tại, giá trị tiếp theo và chuyển sang tiếp theo. Clojure có thể làm cả 3 và tôi nghi ngờ rằng trong Clojure sẽ dễ dàng hơn để làm điều này đúng. Python cũng có các thói quen chung và tôi muốn thử bẻ khóa nó. http://clojure.org/ Hậu quả http://www.try-clojure.org/

Trong thực tế, nếu đầu vào là một chuỗi vô hạn, chẳng hạn như http://oeis.org/A007401 , thì lười biếng là cách duy nhất.


"Linq" không có nghĩa là "lặp" hay "lười" nhất thiết - thực tế, hầu hết Linq thực sự là về cây biểu hiện. Bạn có thể dễ dàng, nếu bạn muốn, đã triển khai tổng hợp 3 giá trị hoặc N có giá trị của riêng bạn với một bao đóng và không có nhiều mã trong C #. Rắc rối xảy ra khi mọi người không biết làm thế nào để thực sự làm điều đó, hoặc thậm chí làm thế nào để bắt đầu, và chỉ tìm kiếm một câu thần chú sống trong System.Linqkhông gian tên.
Aaronaught

@Aaronaught ... " , sẽ trông tương đương với một nhóm [<T>] được nối với nhau. Những thứ đó là lười biếng và sử dụng các điều tra viên, mà trong các ngôn ngữ khác sẽ được gọi là iterators. Nhưng vâng, vấn đề là LINQ làm cho việc mã hóa trở nên dễ dàng và người không đủ tiêu chuẩn thử nó. Một số vẫn có thể trở thành lập trình viên phong nha có lẽ. Nếu C # là ngôn ngữ đầu tiên của họ và họ là tổng số noobs, thì họ đang xử lý một ngôn ngữ lớn.
Công việc

Chắc chắn, Linq to Object (không phải Linq to SQL, Linq to Entities, Linq to Dataset hay bất kỳ nhánh nào khác của Linq) đều dựa trên các trình vòng lặp và thực thi hoãn lại, nhưng tất cả đều nằm dưới mui xe. Khối lặp và yieldtuyên bố tồn tại trước Linq, cũng như các đại biểu. Đóng cửa trong cùng một bản phát hành như Linq, nhưng một vài hoạt động "Linq" thuần túy thực sự đòi hỏi phải nắm bắt biến cục bộ. Hỏi "Làm thế nào tôi có thể làm [mô tả về hoạt động / chức năng lặp hoàn toàn] với Linq?" phản bội một sự thiếu hiểu biết sâu sắc về cả Linq (ý nghĩa của nó) và ngôn ngữ.
Aaronaught
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.