Có thể chấp nhận sử dụng các hàm lambda \ phương thức trong phần mềm doanh nghiệp không?


26

Tôi đã nhận thấy các bài đăng trên đây thể hiện việc sử dụng các hàm đại biểu \ lambda để giải quyết lỗ hổng trong ý tưởng trung bình mà không có nhiều sự lặp lại: http://www.markhneedham.com/blog/2009/04/04/feftal-c -the-Hole-in-the-middle-mẫu /

Vấn đề dường như là các nhà phát triển cơ sở và những người khác không nhất thiết phải hiểu khái niệm hàm con trỏ \ ủy nhiệm \ lambda là gì, điều này dường như làm cho việc đọc (và có thể gỡ lỗi) mã trở nên khó khăn hơn.

Chúng ta có nên tránh hoặc hạn chế nghiêm ngặt việc sử dụng công cụ này trong việc viết phần mềm kinh doanh, đặc biệt là trong các cửa hàng nhỏ hoặc nhà phát triển duy nhất không?

Hoặc có thể chấp nhận sử dụng nó với các nhận xét phù hợp và hy vọng rằng khi tôi không còn ở đó, nhà phát triển tiếp theo sẽ hiểu hoặc tìm hiểu về các chức năng lambda?


10
Trong Ruby, lambdas (như chính chúng, và ở dạng khối) là một khái niệm ngôn ngữ cốt lõi. Chúng được sử dụng ở mọi nơi, từ Arraylớp đến ORM phức tạp. Vâng, không ai phàn nàn.
Whitequark

18
Tôi đang đăng bài này dưới dạng một bình luận chứ không phải là một câu trả lời vì đó chỉ là một biến thể về những gì mọi người đã nói: Tôi sẽ tiếp tục và sử dụng chúng. Trái với những gì hầu hết mọi người đã nói, tôi sẽ không bận tâm đến việc thêm bình luận khắp nơi chỉ để giải thích rằng bạn đang sử dụng một tính năng ngôn ngữ khá đơn giản. Nhận xét nên giải thích logic kinh doanh và tại sao các lựa chọn triển khai được đưa ra, không giáo dục các nhà phát triển về các tính năng ngôn ngữ mà họ đã quen thuộc. Nếu bạn biết các thiếu gia của bạn không hiểu lambdas, hãy ngồi xuống và giải thích khái niệm này.
Mitch Lindgren

3
Điều gì sẽ xảy ra nếu một lập trình viên Junior muốn sử dụng lambdas nhưng lo lắng rằng các tin tặc C ++ cũ sẽ không có được nó? Âm thanh như không phải lambdas, hay ... thuật toán nên được sử dụng trong phần mềm kinh doanh.
Công việc

10
Nếu là vì thái độ này, chúng tôi vẫn sẽ tạo ra lửa bằng cách cọ xát hai màn hình đơn sắc.
sbi

3
Con trỏ tốt cho các chức năng được nghĩ trong các khóa học đại học C. Và bạn cũng có các đại biểu trong C #, vì vậy hầu như bất kỳ nhà phát triển nào cũng khá thoải mái với các chức năng như một kiểu / tham số dữ liệu. Viết mã mà bạn có thể viết tốt nhất.
Daniel Iankov

Câu trả lời:


23

Vấn đề dường như là các nhà phát triển cơ sở và những người khác không nhất thiết phải hiểu khái niệm hàm con trỏ \ ủy nhiệm \ lambda là gì

Thẳng thắn mà nói, đó là vấn đề của họ. Đó là những gì bạn đảm bảo họ được đào tạo. Bạn không thể sử dụng một kỹ thuật tốt chỉ vì một số người có thể không hiểu nó. Nếu họ cần giúp đỡ với nó, họ có thể đến hỏi tác giả. Quan trọng hơn, các chức năng lambda đang trở thành các tính năng ngôn ngữ cực kỳ phổ biến.

Chúng ta không nên sử dụng thừa kế vì một số người không hiểu nó? Địa ngục, một số người từ chối tin vào khoa học hoặc vi trùng hoặc bất kỳ cách thức vô lý. Bạn phải có khả năng tiếp tục và không để khả năng người khác không thể theo kịp bạn ngăn bạn viết mã tốt nhất bạn có thể. Các hàm Lambda là một tính năng tuyệt vời và giúp ích rất nhiều trong việc viết mã, và bạn nên thực hiện tất cả các trợ giúp bạn có thể nhận được.

Nhà phát triển nên biết cách sử dụng ngôn ngữ mà họ đang học hoặc không. Nếu họ không, sau đó sa thải họ và tìm ai đó làm, hoặc đào tạo họ để họ làm.


11
Chà, tôi sẽ cấm thừa kế trước khi cấm lambdas ...;)
dòng chảy

49

Vâng, sử dụng chúng.

Tôi là một nhà phát triển cơ sở và tôi biết / hiểu lambdas (và các khái niệm khác mà bạn đã đề cập). Không có gì tôi có thể thấy trước việc ngăn cản một nhà phát triển cơ sở học hỏi tất cả các khái niệm đó trong một khoảng thời gian rất ngắn. Người cao niên có thể không có cùng kinh nghiệm / chuyên môn khi nói đến nhiều vấn đề phát triển phần mềm, tuy nhiên, các khái niệm như lambdas có thể dễ hiểu đối với bất kỳ ai có hiểu biết cơ bản về lập trình và kết nối internet. Ngoài ra, có vẻ kỳ lạ khi bạn chọn lambdas làm ví dụ, xem xét nếu bạn đang sử dụng C #, có khả năng bạn thậm chí không có nhiều khởi đầu trong việc học lambdas so với các nhà phát triển cơ sở (chúng chỉ được giới thiệu vào năm 2008, nếu tôi nhớ chính xác).

Nói tóm lại, không cần phải làm giảm mã của bạn cho chúng tôi. Chúng tôi sẽ ổn, và thực sự muốn làm việc trên triển khai tốt nhất có thể mà bạn có thể đưa ra. :)


4
Trừ khi chúng ta, neophyte là chậm. Trong trường hợp đó, vui lòng tắt mã cho chúng tôi hoặc ... không thuê chúng tôi ở nơi đầu tiên.
Công việc

19
@Job - Tôi nghĩ rằng chúng ta chỉ cần thẳng thắn và nói rằng nếu một thiếu niên không thể hiểu cú pháp lambda được đưa ra một vài ngày (khá hào phóng), thì đó thực sự có thể là một vấn đề tuyển dụng.
Morgan Herlocker

2
Chỉ các tân sinh viên vào stackoverflow.com/questions/2167360/ cấp ... đây là một câu trả lời tuyệt vời cho câu hỏi của tôi vào thời điểm đó và giúp thúc đẩy sự hiểu biết của tôi về Linq và lambdas.
Tôi chấp nhận

20

Nếu chúng là một giải pháp hợp lý cho vấn đề của bạn thì bạn nên sử dụng chúng.

Đừng hạn chế một cách giả tạo - bạn có nhiều khả năng kết thúc với mã chất lượng kém khó bảo trì.

Nếu mã được viết tốt với các bình luận thích hợp thì những người theo dõi trên sẽ có thể học hỏi từ bạn.


13

Đặt một liên kết đến tài liệu msDN trong các bình luận ở đầu một khối sử dụng nó sau đó tiếp tục. Bạn không nên sợ sử dụng công nghệ mới / phức tạp, một phần công việc của các nhà phát triển để tìm hiểu những điều họ không biết.


14
một liên kết có thực sự cần thiết?
Morgan Herlocker

3
Bạn có thực sự đặt một liên kết mỗi khi bạn sử dụng lambda?
Federico klez Culloca

sự phức tạp là kẻ thù ...
Robert S Ciaccio

11

Vấn đề dường như là các nhà phát triển cơ sở và những người khác không nhất thiết phải hiểu khái niệm hàm con trỏ \ ủy nhiệm \ lambda là gì

Sau đó, họ cần phải học chúng. Giai đoạn.

  1. Đây không phải là một góc bí truyền của C #. Bạn phải hiểu chúng để sử dụng nhiều thư viện .Net.
  2. Nói chung, đây không phải là một chủ đề ngôn ngữ bí truyền. Hầu như mọi ngôn ngữ trong sử dụng phổ biến ngày nay đều có một số hương vị của con trỏ hàm và hầu hết đều có (hoặc sắp có, trong trường hợp đóng cửa Java và C ++).

Chỉ cần dành vài phút để giải thích cho họ. Nó không khó.


5

Bạn nên sử dụng công cụ phù hợp cho công việc. Nếu có cách đơn giản hơn, rõ ràng hơn để giải quyết vấn đề trong tay, hãy sử dụng cách đó. Nếu bạn cần tham gia vào một cái gì đó mà bạn nghĩ có thể là một chủ đề nâng cao cho các nhà bảo trì trong tương lai, hãy đánh dấu nó rõ ràng và bao gồm một con trỏ đến tài liệu giải thích kỹ thuật.

con trỏ hàm \ đại biểu \ khái niệm hàm lambda

Cần lưu ý rằng đó là ba điều khác nhau.


3

Hai tình huống có thể xảy ra:

a) Các đồng nghiệp của bạn (hoặc hầu hết trong số họ) có kỹ năng hợp lý. Họ cần học lambdas, họ là một phần của ngôn ngữ và đôi khi, họ chính xác là công cụ phù hợp cho công việc. Vì vậy, khi chúng thực sự là công cụ tốt nhất, bằng mọi cách, hãy sử dụng chúng. Chỉ cần tránh sử dụng chúng vì bạn chỉ tự tìm hiểu về chúng và bạn rất phấn khích và nghĩ rằng chúng là một viên đạn bạc.

b) Bạn đồng nghiệp (hoặc hầu hết trong số họ) không đủ năng lực. Không có cách nào họ sẽ hiểu đầy đủ lambdas, đóng cửa, con trỏ hàm hoặc bất kỳ khái niệm mã hóa meta tương tự nào khác. Có lẽ họ đang vật lộn để hiểu con trỏ, tài liệu tham khảo và đệ quy. Trong tình huống này, điều tốt nhất bạn có thể làm là cắn viên đạn, sử dụng giải pháp vụng về, dài dòng, không có lambda và chải cv của bạn, bởi vì bạn nên tìm việc làm.


2

Đây là nơi nhất quán có thể giúp rất nhiều. Nếu bạn sử dụng nó một cách nhất quán với cùng một phong cách, v.v., thì độc giả chỉ phải học nó một lần, và sau đó họ nhận ra nó ở mọi nơi.

Ngoài ra, nó có thể giúp được rõ ràng, ít nhất là lúc đầu. Chẳng hạn, hai cái này tương đương nhau:

doSomething(() => someMethod());

doSomething(someMethod);

private void doSomething(Action someAction) { ... }
private void someMethod() { ... }

... nhưng trong trường hợp đầu tiên, rõ ràng, nếu bạn biết cú pháp lambda, chúng ta đang làm gì. Ngay cả khi bạn không biết cú pháp lambda, rõ ràng bạn đang nhìn thấy một cái gì đó mới và bạn phải tìm kiếm nó. Trong trường hợp thứ hai, có vẻ như bạn đang truyền một biến.

Tôi biết rằng ReSharper thúc đẩy bạn thay đổi nó sang trường hợp thứ hai, nhưng tôi tự hỏi liệu đó có phải là một ý tưởng hay không. Trong trường hợp thứ hai, bạn phải biết rằng doSomethingcó một Action.


1
Tôi sẽ sử dụng cái thứ hai, tôi thấy một sốMethod được truyền vào và để xác định một sốMethod là gì, tôi nhấp chuột phải và đi đến def'n. xem đó là một chức năng / phương thức và nó có ý nghĩa với bất kỳ lập trình viên nào tại thời điểm đó.
CaffGeek

@Chad - Điều đó giống như nói "Tôi sử dụng một từ ngắn hơn mà người đọc ít có khả năng biết và tôi sẽ cho rằng họ đang đọc nó trên Kindle, vì vậy họ phải di chuyển đến từ đó, vì vậy nó trông nó có trong từ điển cho họ, thay vì chỉ sử dụng một từ mô tả dài hơn tôi chắc chắn họ biết. Và lừa mọi người mà không có Kindles. " Tôi không đồng ý với logic đó. Mã được đọc nhiều hơn nó được viết.
Scott Whitlock

"Trong trường hợp thứ hai, bạn phải biết rằng doSomethingphải mất một Action." Và làm thế nào mà khác với việc phải biết rằng functionWithNameThatDoesNotSpecifyItsArgumentTypesphải mất một ObjectOfSomeType? Trong thực tế, trong các ngôn ngữ nơi các hàm là các đối tượng hạng nhất thực sự, nó không khác nhau.
JAB

1

Tôi thường thấy một số khái niệm khó hiểu vì chúng chỉ được mô tả trong bản tóm tắt, thay vì bắt gặp chúng trong các tình huống thực tế, thực tế. Vì vậy, cá nhân tôi rất thích gặp các công trình như vậy.

Kịch bản chính tôi có thể nghĩ đến để tránh làm điều này là nếu lập trình không phải là nhiệm vụ chính của người khác. Ví dụ: quản trị viên hệ thống hoặc nhà sinh học dành phần lớn thời gian để thực hiện các thí nghiệm thực tế ("chuột thí nghiệm").


1
itemsList.ForEach(item => DoAction(item));
...
public void DoAction(Item item) {
  //...do various things here...
}

Bây giờ, có lẽ ở đây chúng ta đang gọi DoAction vì cơ thể của nó quá dài để phù hợp với chính lambda. Trong trường hợp đó, sử dụng phương thức mở rộng ForEach () cho Danh sách không mang lại cho chúng ta nhiều lợi ích so với việc sử dụng vòng lặp foreach thông thường, mặc dù nó tiết kiệm được một vài dòng mã, tôi cho rằng. Nhưng trong trường hợp cụ thể này, việc sử dụng ForEach () có thể khiến chúng ta phải làm một việc gì đó thực sự lấy nhiều mã hơn và gây ra một số cú đập mạnh vào stack hơn mức cần thiết; Luận cứ đã qua không cần phải là một Lambda

Bạn chỉ cần gọi DoAction như thế này:

itemsList.ForEach(DoAction);

Không có Lambda nào cả. Điều quan trọng là phải nhớ những gì bạn đang thực sự vượt qua khi bạn tạo một biểu thức lambda: một cái gì đó của một phím tắt để xác định một thể hiện ủy nhiệm. Vâng, nó cũng có những lợi ích như đóng cửa, nhưng người ta không nên mất trang web về những gì cuộc gọi phương thức đang mong đợi. Trong trường hợp này, nó mong đợi một địa chỉ cho một phương thức phù hợp với chữ ký của Hành động. DoAction đã là một phương thức như vậy, vì vậy việc tạo lambda chỉ là thêm vào một cuộc gọi phương thức hoàn toàn không cần thiết.


-1

IMHO, viết ở bất kỳ cấp độ kỹ thuật nào cao hơn trình độ kỹ thuật của nhóm, là sai. Nếu các thành viên trong nhóm của bạn không thực sự thoải mái với các biểu thức và chức năng lambda và họ không có thời gian để học nó (họ nên dành thời gian cho cơ sở dữ liệu điều chỉnh hiệu suất, làm việc trên UI nhiều hơn, tạo các thành phần, v.v.), thì tôi mạnh mẽ đề nghị không sử dụng chúng . Tuy nhiên, nếu họ sẵn sàng học hỏi và có thời gian rảnh, hoặc họ đã biết kiến ​​thức, thì tại sao không?

Tôi nghĩ rằng đây là một vấn đề tương đối cần được đánh giá theo trình độ kỹ thuật của đội và đội. Và đây không chỉ là trường hợp của các hàm lambda. Đây là trường hợp của kiến ​​thức kỹ thuật. Vì vậy, ví dụ, bất cứ khi nào một nhóm biết về mẫu kho lưu trữ có chuyên môn để thực hiện và duy trì nó, thì hãy thực hiện nó. Nhưng nếu họ không, chỉ cần tìm một cách khác. Nếu họ biết về OO JavaScript, thì hãy tạo mã có thể mở rộng hơn trong JavaScript. Nhưng nếu họ không, chỉ cần quay lại JavaScript thủ tục.

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.