Việc sử dụng LINQ và Lambda Expressions có dẫn đến mã ít đọc hơn không? [đóng cửa]


43

Tôi đang thảo luận với đồng nghiệp trên Linq, tôi sẽ sao chép ở đây:

Đồng nghiệp: Hãy trung thực ở đây. Cú pháp Linq hút. Nó khó hiểu và không trực quan.

Tôi: oh nào, khó hiểu hơn T-SQL?

Đồng nghiệp: uh, vâng.

Tôi: nó có các phần cơ bản giống nhau, chọn, ở đâu và từ

Đồng nghiệp: Linq, với tôi, là một sự khốn của quan hệ + OO. Đồng nghiệp: Đừng hiểu sai ý tôi - nó cực kỳ mạnh mẽ, nhưng họ đã tái sử dụng SQL để sử dụng lại các bộ sưu tập đối tượng.

Tôi cho rằng việc sử dụng Linq + Lamda rất mạnh mẽ (anh ấy đồng ý) và cũng làm cho mã dễ đọc hơn (anh ấy không đồng ý ở điểm đó):

pickFiles = from f in pickFolder.GetFiles("*.txt")
where ValidAuditFileName.IsMatch(f.Name)
select f;

hoặc là

var existing = from s in ActiveRecordLinq.AsQueryable<ScannedEntity>()
where s.FileName == f.FullName && s.DocumentType != "Unknown"
select s;

hoặc (mã VB tại đây)

   Dim notVerified = From image In images.AsParallel
     Group Join verifyFile In verifyFolder.GetFiles("*.vfy").AsParallel.Where(
      Function(v) v.Length > 0
      ).AsParallel
   On image.Name.Replace(image.Extension, ".vfy") Equals verifyFile.Name
     Into verifyList = Group
    From verify In verifyList.DefaultIfEmpty
    Where verify Is Nothing
    Select verify

Đối với tôi điều này là sạch sẽ và dễ dàng (ít nhất là dễ dàng hơn so với các lựa chọn thay thế) để đọc, ý kiến ​​của bạn về nó là gì?


11
Con người, nói chung, ghét thay đổi. Một tỷ lệ lớn ghét nó đến mức họ thực sự sợ nó.
Tony

9
Hãy đối mặt với nó ... linq chỉ là một cú pháp lập trình chức năng được thêm vào C # và VB.Net. Bashing linq và lambda biểu hiện về cơ bản là nói "FP hút". Đó là những gì đồng nghiệp của bạn đang nói. Tôi nghĩ rằng cuộc tranh luận đã được băm ra ở nơi khác.
Scott Whitlock

48
Có ai làm phiền người khác rằng mọi người có xu hướng sử dụng từ "trực quan" khi họ thực sự có nghĩa là "quen thuộc"?
Larry Coleman

7
Dù sao, nhóm C # (bao gồm Eric Lippert) đã cố gắng giải thích rằng Linq không phải là một bản dịch của SQL, nó được thiết kế từ đầu giống như hầu hết các tính năng khác. Tôi phải nói rằng đồng nghiệp của bạn là một Luddite.
Aaronaught

16
Đối với những gì nó có giá trị: Tôi chỉ có vợ (quản trị văn phòng - bên cạnh zero kinh nghiệm lập trình thực tế) của tôi nhìn vào 3 ví dụ aaronaught và đã có thể giải mã các mục đích của LINQ và lambda ví dụ xa dễ dàng hơn ví dụ bắt buộc truyền thống.
Steven Evers

Câu trả lời:


73

Tôi không thể tìm thấy bài viết phù hợp nữa, nhưng Eric Lippert (và có thể một số loại kẹo mềm khác) đã đôi khi nói về cách Linq khai báo , trong một số loại vấn đề, trực quan hơn nhiều so với cú pháp bắt buộc .

Linq cho phép bạn viết mã thể hiện ý định , không phải cơ chế .

Bạn cho tôi biết cái nào dễ đọc hơn. Điều này:

IEnumerable<Customer> GetVipCustomers(IEnumerable<Customer> source)
{
    List<Customer> results = new List<Customer>();
    foreach (Customer c in source)
    {
        if (c.FirstName == "Aaron")
        {
            results.Add(c);
        }
    }
    results.Sort(new LastNameComparer());
    return results;
}

class LastNameComparer : IComparer<Customer>
{
    public int Compare(Customer a, Customer b)
    {
        return x.LastName.CompareTo(b.LastName);
    }
}

Hay cái này?

IEnumerable<Customer> GetVipCustomers(IEnumerable<Customer> source)
{
    return from c in source
           where c.FirstName == "Aaron"
           orderby c.LastName
           select c;
}

Hay thậm chí là cái này?

IEnumerable<Customer> GetVipCustomers(IEnumerable<Customer> source)
{
    return source.Where(c => c.FirstName == "Aaron").OrderBy(c => c.LastName);
}

Ví dụ đầu tiên chỉ là một loạt các nồi hơi vô nghĩa để có được kết quả đơn giản nhất. Bất cứ ai nghĩ rằng đó là hơn dễ đọc hơn so với các phiên bản LINQ cần phải có đầu kiểm tra. Không chỉ vậy, nhưng cái đầu tiên lãng phí bộ nhớ. Bạn thậm chí không thể viết nó bằng cách yield returnphân loại.

Đồng nghiệp của bạn có thể nói những gì anh ấy muốn; cá nhân, tôi nghĩ Linq đã cải thiện khả năng đọc mã của tôi vô cùng.

Không có gì "quan hệ" về Linq cả. Nó có thể có một số điểm tương đồng bề ngoài với SQL nhưng nó không cố gắng ở bất kỳ hình dạng hoặc hình thức nào để thực hiện phép tính quan hệ. Nó chỉ là một loạt các phần mở rộng giúp cho việc truy vấn và trình tự dự án dễ dàng hơn. "Truy vấn" không có nghĩa là "quan hệ" và trên thực tế có một số cơ sở dữ liệu không liên quan sử dụng cú pháp giống như SQL. Linq hoàn toàn hướng đối tượng, nó chỉ hoạt động với cơ sở dữ liệu quan hệ thông qua các khung như Linq sang SQL vì một số voodoo của cây biểu thức và thiết kế thông minh từ nhóm C #, làm cho các hàm ẩn danh có thể chuyển đổi thành các cây biểu thức.


6
+1 Nếu bạn không thích LINQ thì có lẽ vì "bạn không làm đúng" :)
Darknight

1
Linq is purely object-oriented+1 cho điều này. Đây cũng là lý do tại sao hướng dẫn kiểu nhóm của chúng tôi thi hành bằng cách sử dụng cú pháp lưu loát qua cú pháp truy vấn. Tôi thấy điều đó làm cho bản chất liên kết OO trở nên rõ ràng hơn đối với ai đó được sử dụng để phản đối ký hiệu trong các ngôn ngữ giống như C.
SBI

1
Tôi biết rằng bài viết là 7 tuổi. Nhưng đây là câu hỏi: bạn đã sử dụng ngôn ngữ chức năng làm công cụ chính trước khi gặp Linq chưa?
Sergey.quixoticaxis.Ivanov

4
Thẳng thắn mà nói, tôi thích vòng lặp foor hơn, bởi vì sau đó tôi thấy ngay nơi chúng ta có thể và sẽ có các ngoại lệ tham chiếu NULL, cách xử lý null và nó không bị hoãn thực thi khiến việc gỡ lỗi khó khăn và nó không tạo ra danh sách n cũng vậy, vòng lặp for cũng hiệu quả hơn.
Quandary

1
@Aaronaught, Nếu bạn loại bỏ việc sắp xếp và định dạng lại mã thủ tục theo kiểu Horstmann , tôi sẽ nói rằng nó dễ đọc hơn phiên bản LINQ . Và theo nguyên tắc trách nhiệm duy nhất, việc phân loại không thực sự thuộc về GetVipCustomers(), mà đúng như tên gọi của nó, sẽ chỉ trả lại một bộ sưu tập của khách hàng VIP, theo thứ tự tùy ý. Đối với những trường hợp hiếm hoi mà thứ tự là quan trọng, chẳng hạn như đầu ra ra màn hình, hãy để người gọi sắp xếp bộ sưu tập.
Ant_222

69

Đồng nghiệp: Hãy trung thực ở đây. Cú pháp Linq hút. Nó khó hiểu và không trực quan.

Bạn không thể tranh luận với những lời chỉ trích đó. Đối với đồng nghiệp của bạn, nó hút . Chúng tôi đã thất bại trong việc thiết kế một cú pháp mà đối với họ là rõ ràng và trực quan. Đó là thất bại của chúng tôi và bạn có thể chuyển lời xin lỗi của tôi đến đồng nghiệp của bạn. Tôi rất vui khi được gợi ý về cách làm cho nó tốt hơn; Điều gì đặc biệt làm đồng nghiệp của bạn thấy khó hiểu hoặc không trực quan?

Tuy nhiên, bạn không thể làm hài lòng tất cả mọi người. Ý kiến ​​cá nhân của tôi và ý kiến ​​của hầu hết những người tôi đã nói về chủ đề này là cú pháp hiểu câu hỏi rõ ràng hơn nhiều so với cú pháp mệnh lệnh tương đương. Rõ ràng không phải ai cũng đồng ý, nhưng may mắn thay, chúng tôi không yêu cầu sự đồng thuận của tất cả hàng triệu khách hàng khi chúng tôi thiết kế ngôn ngữ.

Mặc dù về chủ đề "trực quan", tôi nhớ lại câu chuyện về nhà ngôn ngữ học người Anh đã nghiên cứu nhiều ngôn ngữ khác nhau và cuối cùng kết luận rằng tiếng Anh là ngôn ngữ tốt nhất trong tất cả các ngôn ngữ vì trong tiếng Anh, các từ có cùng thứ tự với bạn nghĩ họ . Không giống như người Pháp, nơi họ liên tục nói những câu như "con chó trắng ăn thịt đỏ". Làm thế nào khó khăn cho người Pháp để nghĩ các từ theo thứ tự chính xác và sau đó phải nói chúng theo thứ tự Pháp ! Tiếng Pháp thật không trực quan! Thật đáng kinh ngạc khi người Pháp quản lý để nói nó. Và tiếng Đức? họ nghĩ "con chó ăn thịt" nhưng rồi phải nói "con chó ăn thịt"!?!

Thông thường những gì "trực quan" chỉ là vấn đề quen thuộc. Phải mất vài tháng làm việc với LINQ trước khi tôi ngừng bắt đầu các truy vấn của mình với mệnh đề "select". Bây giờ nó là bản chất thứ hai và thứ tự SQL có vẻ kỳ quái.

Mà đó là! Các quy tắc phạm vi đều bị rối tung trong SQL. Một cái gì đó bạn có thể muốn chỉ ra cho đồng nghiệp của mình là LINQ đã được thiết kế cẩn thận để (1) giới thiệu các biến và phạm vi xảy ra từ trái sang phải (*) và (2) thứ tự truy vấn xuất hiện trên trang là thứ tự mà nó được thực thi. Đó là khi bạn nói

from c in customers where c.City == "London" select c.Name

c xuất hiện trong phạm vi ở bên trái và ở trong phạm vi qua bên phải. Và thứ tự xảy ra là: "khách hàng" đầu tiên được đánh giá. Sau đó, "nơi" được ước tính để lọc chuỗi. Sau đó, chuỗi được lọc được chiếu bởi "chọn".

SQL không có thuộc tính này. Nếu bạn nói

SELECT Name FROM Customers WHERE City = 'London'

sau đó "Tên" được đưa vào phạm vi bởi một cái gì đó ở bên phải của nó, không phải bên trái của nó và truy vấn được thực hiện theo thứ tự hoàn toàn sai lầm; mệnh đề giữa được đánh giá đầu tiên, sau đó là mệnh đề cuối cùng và sau đó là mệnh đề đầu tiên. Điều đó bây giờ có vẻ điên rồ và không trực quan với tôi, khi chỉ làm việc với LINQ từ lâu.


(*) Quy tắc phạm vi là một chút kỳ lạ trong LINQ với các mệnh đề tham gia. Nhưng khác hơn, phạm vi tổ độc đáo.


5
Nitpick: Trong tiếng Đức, "Der Hund frisst das Fleisch" thực sự giống như tiếng Anh, "Con chó ăn thịt" :) Ngoài ra, tôi thấy cú pháp LINQ Query rất dễ đọc khi tôi nhận ra đó không phải là SQL .
Michael Stum

18
@gbjbaanb: Tôi không biện minh cho cú pháp LINQ trên cơ sở hoàn toàn chủ quan của nó là dễ hiểu hơn . Thay vào đó, tôi biện minh cho nó trên cơ sở hoàn toàn khách quan rằng việc thiết kế các công cụ hỗ trợ người dùng trong việc xây dựng các truy vấn LINQ dễ dàng hơn nhiều vì cú pháp LINQ được thiết kế với công cụ và dễ hiểu hơn về mặt tinh thần theo thứ tự các sự kiện xảy ra trong một truy vấn vì chúng theo cùng một thứ tự từ vựng.
Eric Lippert

2
Eric, từ góc độ lập trình của phong cách khai báo, tôi hiểu Linq là phù hợp (tôi nói có thể đọc được) hơn SQL. Nhưng nó có dễ đọc hơn con người không? Không đời nào. Nếu 'con chó ăn thịt đỏ' khó, thì 'từ nhà bếp có màu đỏ là con dao' dễ dàng hơn bao nhiêu? Trong thực tế, tất cả chúng ta đều nói chuyện và suy nghĩ như 'lấy con dao đặt trên bàn từ bếp'. Và đó là nơi SQL gần với cuộc sống thực hơn LINQ.
nawfal

6
Tôi muốn một tách cà phê từ starbucks nơi cửa hàng mở cửa đến nửa đêm. Điều đó nghe có vẻ quen thuộc với bạn? Nó theo đúng thứ tự như một truy vấn SQL. Có, LINQ có thể dễ đọc hơn mã không cần thiết bạn phải tạo để thực hiện truy vấn SQL tiêu chuẩn, nhưng LINQ không dễ đọc hơn chính truy vấn SQL. Vì vậy, có; các nhà phát triển LINQ có thể có lợi từ phạm vi từ trái sang phải, nhưng với tư cách là người dùng, tại sao tôi lại quan tâm? Tôi chỉ quan tâm đến khả năng sử dụng.
KyleM

8
@KyleM: Tất nhiên rồi; khả năng sử dụng là một khía cạnh rất quan trọng của thiết kế LINQ. Đặc biệt, có thể tuân theo các công cụ năng suất là chìa khóa. Vì phạm vi chảy từ trái sang để viết trong truy vấn LINQ, nên khi bạn nhập c.IDE đã biết loại cvà có thể cung cấp cho bạn IntelliSense. Trong LINQ bạn nói "từ c trong khách hàng nơi c." và bùng nổ, bạn có được IntelliSense giúp bạn bằng cách liệt kê các thành viên của Customer. Trong SQL khi bạn nhập "CHỌN tên TỪ khách hàng", bạn không thể nhận bất kỳ trợ giúp IDE nào để cho bạn biết rằng "tên" là một lựa chọn tốt vì bạn đã nhập name trước đó customers .
Eric Lippert

22

Giống như bất cứ điều gì khác trong thế giới lập trình, bạn phải làm quen với cú pháp, và sau đó nó (có khả năng) dễ đọc hơn.

Giống như bất cứ điều gì khác trong thế giới lập trình, có tiềm năng cho mã spaghetti hoặc lạm dụng khác.

Giống như bất cứ điều gì khác trong thế giới lập trình, bạn có thể làm theo cách này hoặc cách khác.

Giống như bất cứ điều gì khác trong thế giới lập trình, số dặm của bạn có thể thay đổi.


6

Tôi đã thấy một bình luận / nhận xét trong đó nó đã nêu điều gì đó - liên quan đến LINQ / lambda - dọc theo dòng: "Viết mã có thể đọc được cho con người, thay vì có thể đọc được trên máy tính của bạn".

Tôi nghĩ rằng tuyên bố này có rất nhiều giá trị, tuy nhiên, hãy xem xét nhà phát triển (chẳng hạn như tôi), người đã trải qua toàn bộ các ngôn ngữ phát triển từ hội, thông qua thủ tục, thông qua OO, thông qua quản lý, thông qua các giải pháp song song nhiệm vụ thông lượng cao .

Tôi đã tự hào về việc làm cho mã của mình dễ đọc và có thể tái sử dụng nhất có thể và áp dụng nhiều nguyên tắc mẫu thiết kế GOF để cung cấp các hệ thống và dịch vụ chất lượng sản xuất trên nhiều lĩnh vực kinh doanh khác nhau.

Lần đầu tiên tôi bắt gặp biểu cảm lambda tôi đã nghĩ: "Cái quái gì thế!? Nó ngay lập tức phản trực giác với cú pháp khai báo rõ ràng (và do đó thoải mái) quen thuộc của tôi . Tuy nhiên, những người trẻ hơn 5 tuổi trong công việc đã đưa nó lên như thể đó là manna từ thiên đường!

Đó là bởi vì trong nhiều năm suy nghĩ như một máy tính (theo nghĩa cú pháp) đã dịch rất dễ dàng thành cú pháp mã hóa trực tiếp (không phân biệt ngôn ngữ). Khi bạn có tư duy tính toán cho khoảng 20+ năm (30+ trong trường hợp của tôi), bạn phải đánh giá cao cú sốc cú pháp ban đầu của biểu thức lambda có thể dễ dàng chuyển thành sợ hãi và ngờ vực.

Có lẽ đồng nghiệp trong OP đã đến từ một nền tảng tương tự như tôi (tức là đã ở quanh khối một vài lần) và nó phản tác dụng với họ vào thời điểm đó? Câu hỏi của tôi là: bạn đã làm gì về nó? Bạn đã cố gắng giáo dục lại đồng nghiệp của mình để hiểu được lợi ích của cú pháp nội tuyến hay bạn đã cố chấp / tẩy chay họ vì đã không "đồng hành cùng chương trình"? Người trước có thể đã thấy đồng nghiệp của bạn đi theo lối suy nghĩ của bạn, người sau có thể sẽ khiến họ không tin vào cú pháp LINQ / lambda hơn nữa và do đó làm trầm trọng thêm ý kiến ​​tiêu cực.

Đối với bản thân tôi, tôi đã phải giáo dục lại cách suy nghĩ của riêng mình (như Eric nói ở trên, đó không phải là một sự thay đổi tâm trí không đáng kể và tôi phải lập trình ở Miranda vào những năm 80 vì vậy tôi đã chia sẻ kinh nghiệm lập trình chức năng của mình) nhưng một khi tôi đã trải qua nỗi đau đó thì lợi ích là rõ ràng nhưng - quan trọng hơn - khi sử dụng nó đã được sử dụng quá mức (nghĩa là được sử dụng cho mục đích sử dụng nó), qua sự phức tạp và lặp đi lặp lại (xem xét nguyên tắc DRY trong trường hợp đó).

Là một người không chỉ viết nhiều mã mà còn phải xem xét kỹ về nhiều mã, điều bắt buộc là tôi phải hiểu các nguyên tắc này để tôi có thể xem xét các mục một cách vô tư, khuyên rằng việc sử dụng biểu thức lambda có thể hiệu quả hơn / có thể đọc được và cũng để khiến các nhà phát triển xem xét khả năng đọc của các biểu thức lambda nội tuyến rất phức tạp (trong đó một lệnh gọi phương thức - trong các trường hợp đó - làm cho mã dễ đọc hơn, có thể duy trì và mở rộng hơn).

Vì vậy, khi ai đó nói rằng họ "Đừng lấy lambda?" hoặc cú pháp LINQ, thay vì đặt thương hiệu cho họ một luddite cố gắng giúp họ hiểu các nguyên tắc cơ bản. Rốt cuộc họ có thể có một nền tảng "trường học cũ" như tôi.


Nhận xét thú vị - Tôi đã có điều này khi tôi chuyển từ ngôn ngữ tĩnh, gõ mạnh sang ngôn ngữ động. Mất một lúc để điều chỉnh (sợ hãi và không tin tưởng) và bây giờ tôi thấy thật khó để quay lại, thành thật mà nói.
bữa ăn trưa317

4

Biểu thức Lambda dẫn đến mã ít đọc hơn nếu các truy vấn quá dài. Tuy nhiên, nó tốt hơn nhiều so với quá nhiều vòng lặp lồng nhau .

Nó tốt hơn với hỗn hợp của cả hai .

Viết nó trong Lambda nếu nó nhanh hơn (bạn cần nó nhanh) hoặc dễ đọc hơn.


Có, nhưng những gì sẽ làm cho nó linq / lamda không dễ đọc hơn?
BlackICE

xin lỗi, có nghĩa là không dễ đọc hơn thay thế.
BlackICE

1

Tôi nghĩ rằng nó phụ thuộc vào hầu hết các trường hợp (trừ khi làm điều gì đó rất kỳ quái) nếu bạn có nghĩa là "có thể đọc được" khi ai đó có ý tưởng về những gì đang xảy ra hoặc nếu họ có thể dễ dàng tìm thấy tất cả các chi tiết nhỏ.

Tôi nghĩ rằng liên kết giúp với cái trước, nhưng thường (đặc biệt là khi gỡ lỗi) làm tổn thương cái sau.

IMHO khi tôi đang xem mã tôi không quen thuộc với cái trước thì cực kỳ quan trọng hơn cái sau, vì vậy tôi thấy nó dễ đọc hơn nhiều.


Điểm tốt. Thứ hai thường được bao phủ bởi bài kiểm tra đơn vị tốt.
Scott Whitlock

Vì vậy, bạn nghĩ rằng nội bộ của đánh giá linq làm cho khó tìm thấy tất cả các chi tiết? Bạn có thể cung cấp một ví dụ về khi điều này có thể được?
BlackICE

3
@David: Biểu thức Linq không chỉ được đánh giá lười biếng, chúng là biểu thức . Mã nhận của biểu thức linq thực sự có thể sửa đổi biểu thức để nó thực hiện một cái gì đó hoàn toàn khác, giống như một macro không thể làm việc trên biểu thức s. Chẳng hạn, khi làm việc với linq sang SQL, nó thực sự lấy biểu thức where e.FirstName == "John"và chuyển nó thành truy vấn SQL! Nó thực hiện điều đó bằng cách nhìn vào biểu thức chưa được biên dịch (nhưng được phân tích cú pháp), xem đó là so sánh một thuộc tính được gọi FirstNametrên một thực thể bền vững và nó so sánh với một chuỗi, v.v. Có rất nhiều điều đang diễn ra.
Scott Whitlock

@david nói chung tôi không tìm thấy chi tiết khó tìm cho đến khi bạn bắt đầu sử dụng linq với chính nó. Một ví dụ "đơn giản" về điều này khiến tôi mất nhiều thời gian để quẩn quanh là đây: bugquash.blogspot.com/2008/07/y-combinator-and-linq.html nhưng có một số ví dụ nhất thiết hơn trong một số về những điều mọi người đang làm với các biểu thức trong các khu vực động, DynamicObject và IDAVEMetaObjectProvider. Nơi bạn vẽ đường thẳng như thế nào là linq đang gây tranh cãi, nhưng như scott chỉ ra tất cả những thứ đó có sẵn cho / trong linq vì linq sử dụng cùng một cây biểu thức.
Hóa đơn

@Bill được rồi, tôi sẽ cung cấp cho bạn điều đó khó khăn, nhưng chức năng y-combinator và thứ tự cao sẽ làm tổn thương hầu hết các đầu của chúng tôi, nó giống như đệ quy, bạn hiểu hay không. Việc thực hiện đệ quy có dễ đọc hơn không (nếu bạn không biết một trong hai)?
BlackICE

1

Tôi thấy cú pháp LINQ trực quan và dễ đọc, đặc biệt là khi họ đặt TỪ ở đầu nơi nó thuộc về thay vì ở giữa như trong SQL. Nhưng lambdas IMO gây nhầm lẫn và làm cho mã khó đọc hơn.


Tại sao bạn nghĩ lambdas là khó hiểu? Đây có phải là loại suy luận?
ChaosPandion

1
@ChaosPandion: Đầu tiên là loại suy luận và thứ hai là ký hiệu. Đặt một = và a> cùng nhau trông giống như một> = rằng ai đó đã viết sai và viết ngược lại, và nó có xu hướng ném bộ não của tôi cho một vòng lặp.
Mason Wheeler

@Mason - Bạn có thích cú pháp của Haskell ( \x -> x * x) hoặc F # ( fun x -> x * x) không?
ChaosPandion

@ChaosPandion: Không, không đặc biệt. Lambdas có thể nhanh chóng viết, nhưng tôi thấy chúng khó phân tích, đặc biệt khi chúng trở nên không tầm thường trong sự phức tạp. Ví dụ của bạn không tệ đến thế, nhưng chúng có xu hướng tồi tệ hơn rất nhiều.
Mason Wheeler

6
@Mason: Có vẻ như bạn đang phản đối việc lamdas bị lạm dụng, thay vì phản đối ý tưởng về lamdas ngay từ đầu.
Anon.

1

Tôi đồng ý với bạn rằng cú pháp Linq không khác biệt đáng kể so với T-SQL. Tôi nghĩ rằng đồng nghiệp của bạn thực sự có thể phản đối những thứ quan hệ bị trộn lẫn trong đó mã OO đẹp và sáng bóng của anh ấy. Mặt khác, lập trình chức năng cần một chút để làm quen và sẵn sàng làm quen với nó.


0

Nó phụ thuộc. Rõ ràng, T-SQL duy nhất cung cấp một số giải pháp quan hệ DB. Rõ ràng LINQ cung cấp duy nhất một số giải pháp OO.

Tuy nhiên; "khó hiểu hơn T-SQL?" - được thảo luận / hỏi trong câu hỏi ban đầu. Điều này rõ ràng ngụ ý một số tính năng mà không có địa chỉ câu trả lời nào hiện có, thay vào đó cáo buộc nhà phê bình (rõ ràng là SQL quen thuộc) bị mắc kẹt trong quá khứ.

Vì vậy, mặc dù tôi đánh giá cao LINQ về những phẩm chất nhất định và không đồng ý nhiều với các câu trả lời hiện có ở đây, tôi cảm thấy đối trọng xứng đáng đại diện:

Nhiều năm sau khi làm quen với LINQ, việc thực hiện một số loại hoạt động nhóm nhất định, tham gia bên ngoài và không tương đương, làm việc với các khóa tổng hợp và các hoạt động khác trong LINQ vẫn khiến tôi chùn bước. (Đặc biệt là khi nhắm mục tiêu một back-end quan hệ với các câu hỏi nhạy cảm về hiệu suất.)

from c in categories
join p in products on c equals p.Category into ps
from p in ps.DefaultIfEmpty()

Nếu bạn nghĩ rằng đó là trực quan, nhiều sức mạnh hơn cho bạn. ;)


-4

Có lẽ có một lý do tại sao Linq hút, chỉ cần cố gắng làm ví dụ thế giới thực, thay vì các ví dụ trong sách giáo khoa.

Hãy thử hiển thị chức năng này trong linqlamdathings và bạn sẽ thấy, tất cả vẻ đẹp đã biến mất, trong khi cách cổ điển vẫn có thể đọc được. Không đề cập đến các vấn đề thực thi bị trì hoãn và thiết lập các điểm dừng.

Sự thật là LinqLambdaThings rất hữu ích trong một số trường hợp và họ không nghĩ sẽ thay thế tất cả các định hướng đối tượng tiện lợi mà các bạn không bao giờ hiểu

    public IList<Customer> GetVipCustomers(IList<Customer> source, int maxCount)
    {
        var results = new SortedList<string,Customer>();

        foreach (Customer c in source)
        {
            if (maxCount == results.Count)
                break;

            if (c.IsVip && c.FirstName== "Aaron" || c.SecondName== "Aaron")
                results.Add(c.LastName, c);
        }

        return results.Values;
    }

6
Tôi nghĩ rằng nó source.Where(c => c.IsVip && c.FirstName == "Aaron" || c.SecondName == "Aaron").Take(maxCount).OrderBy(d => d.LastName);rất khó để đọc của bạn vì vậy tôi có thể đã phạm sai lầm;)
jk.

1
Theo cách nào bạn đã coi đây là những ví dụ trong sách giáo khoa? Đó thực sự là mã sử dụng sản xuất. Sẽ hữu ích nếu bạn cung cấp cả mã "có thể đọc" cổ điển của bạn và phiên bản linq / lamda để so sánh thay vì mong đợi mọi người chuyển đổi nó.
BlackICE

3
Bạn đã đăng ký cụ thể để khiếu nại về LINQ?
KChaloux

1
@KChaloux Tôi nghĩ rằng họ chỉ đang troll để thành thật
jk.
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.