Các đối số được đặt tên (tham số) là một trợ giúp dễ đọc


11

Cách đây rất lâu, tôi đã lập trình rất nhiều trong ADA và việc đặt tên đối số là bình thường khi gọi một hàm - someObject.DoSthing (someParameterName => someValue);

Bây giờ C # hỗ trợ các đối số được đặt tên, tôi đang suy nghĩ về việc trở lại thói quen này trong các tình huống có thể không rõ ràng về ý nghĩa của một đối số.

Bạn có thể lập luận rằng nó luôn luôn rõ ràng về ý nghĩa của một đối số, nhưng nếu bạn có một đối số boolean và người gọi chuyển thành "true" hoặc "false" thì việc xác định giá trị với tên sẽ khiến trang web cuộc gọi dễ đọc hơn.

contentFetcher.D DownloadNote (lưu ý, hướng dẫn sử dụng: true);

Tôi đoán rằng tôi có thể tạo Enums thay vì sử dụng đúng hoặc sai (Thủ công, Tự động trong trường hợp này).

Bạn nghĩ gì về việc thỉnh thoảng sử dụng các đối số được đặt tên để làm cho mã dễ đọc hơn?


Nhận xét tham số trên đầu phương pháp cũng giúp.
Amir Rezaei

1
@ amir-rezaei: Nhận xét tham số trên đầu phương thức chỉ giúp nếu bạn có thể tin tưởng vào nhận xét. Trừ khi bạn có nhà phát triển tốt quy trình đánh giá mã tốt, tôi sẽ không tin vào các bình luận.
btilly

Là một người dùng Ada một lần, tôi thường xuyên sử dụng như bạn mô tả. Đó là cách tôi nhớ chúng được sử dụng trong Ada, BTW - Tôi sẽ không gọi nó là "bất thường", nhưng từ "bình thường" dường như ám chỉ hầu hết các cuộc gọi sẽ chỉ định tên tham số, không phải là cách tôi nhớ mọi thứ. Tất nhiên các quy ước khác nhau, nhưng sự lộn xộn không cần thiết là một quy ước tồi trong bất kỳ ngôn ngữ IMO nào.
Steve314

Tôi đồng ý sử dụng lại của bạn trong Ada - đó không phải là thứ chúng tôi đã làm mọi lúc, nhưng nó giúp ích.
Damian

Câu trả lời:


7

Điều này đã được đề xuất trong quá trình phát triển C ++ và Stroustrup thảo luận về nó trong "Thiết kế và tiến hóa của C ++", trang 153 và tiếp theo. Đề xuất này được hình thành rõ ràng và rút ra kinh nghiệm trước đó với Ada. Nó đã không được thông qua.

Lý do lớn nhất là không ai muốn khuyến khích các hàm có số lượng lớn các tham số. Mỗi tính năng bổ sung trong một ngôn ngữ có chi phí gì đó và không muốn thêm một tính năng để dễ dàng viết các chương trình xấu hơn.

Nó cũng đặt ra câu hỏi về tên tham số chính tắc là gì, đặc biệt là trong quy ước tệp tiêu đề và mã thông thường. Một số tổ chức có tên tham số mô tả dài hơn và dài hơn trong tệp .h và nhập tên ngắn hơn và dễ dàng hơn trong tệp .cpp (thay thế hậu tố tệp như mong muốn). Yêu cầu chúng giống nhau sẽ là một chi phí bổ sung cho quá trình biên dịch và việc đặt các tên bị trộn lẫn giữa các tệp nguồn có thể gây ra các lỗi tinh vi.

Nó cũng có thể được xử lý bằng cách sử dụng các đối tượng thay vì gọi hàm. Thay vì một cuộc gọi GetWindow với hàng tá tham số, hãy tạo một lớp Window với hàng tá biến riêng tư và thêm setters khi cần thiết. Bằng cách xâu chuỗi các setters, có thể viết một cái gì đó như my_window.SetColor(green).SetBorder(true).SetBorderSize(3);. Cũng có thể có các chức năng khác nhau với các giá trị mặc định khác nhau gọi hàm đó thực sự hoạt động.

Nếu bạn chỉ lo lắng về hiệu ứng tài liệu của contentFetcher.DownloadNote(note, manual : true);, bạn luôn có thể viết một cái gì đó như thế contentFetcher.DownloadNote(note, /* manual */ true);, vì vậy nó thậm chí không hữu ích lắm trong tài liệu.


Thật thú vị khi tôi chuyển từ Ada sang C, tôi bắt đầu sử dụng quy ước mà bạn mô tả - những người đánh giá mã mặc dù rất ghét nó. Đồng ý không sử dụng nó cho số lượng lớn các tham số.
Damian

7

Tôi nghĩ đây là vấn đề làm cho mã xấu dễ đọc hơn, thay vì thực hành tốt nhất.

Có một phương thức (hoặc nhà thầu) có 20 tham số là một mùi hôi của Bỉ và có khả năng là do một vấn đề trong thiết kế của bạn. Tuy nhiên, nếu tôi buộc phải làm việc với mã khi các phương thức có nhiều tham số, thì tham số được đặt tên làm cho mã ít khó hiểu hơn.

Khi các phương thức chỉ có 1 hoặc 2 tham số và rõ ràng từ tên phương thức tham số đó là gì, thì tham số được đặt tên không thêm gì. Đây là trường hợp lý tưởng để được trong.

Nếu tất cả các mã bạn làm việc được viết là ngang bằng với cuốn sách mã sạch sạch , thì bạn sẽ có rất ít sử dụng cho các tham số được đặt tên, tuy nhiên chúng ta sống trong thế giới thực.


1
Một hàm có hai tham số có thể gây nhầm lẫn, nếu cả hai tham số là cùng loại và không có đầu mối nào. Tất nhiên bạn có thể đặt tên hàm theo cách cung cấp đầu mối đó, nhưng bạn thực sự chỉ đang làm những gì mà tên tham số thực hiện bằng mọi cách - ngoại trừ việc bạn bắt buộc phải bao gồm mức độ chi tiết đó ngay cả khi ngữ cảnh (ví dụ: các biểu thức cung cấp tham số) làm cho nó rõ ràng tham số nào là.
Steve314

1
@ Steve314 Ví dụ:void TrackDataChange(Data oldData, Data newData)
Alexander

3

Tôi đồng ý rằng việc thêm tên tham số làm cho nó dễ đọc hơn. Tuy nhiên, hầu hết các cuốn sách tôi đã đọc dường như coi các công tắc boolean là một thực tiễn tồi. Đôi khi tôi làm điều này:

public Content DownloadNote(Note note)
{
    return downloadNote(note, manual: false);
}

public Content DownloadNoteManually(Note note)
{
    return downloadNote(note, manual: true);
}

Điều đó giúp bạn linh hoạt hơn khi triển khai API. Nó cũng cho phép bạn kiểm soát trường hợp bạn có nhiều công tắc boolean, nhưng không phải tất cả chúng đều có thể hoạt động cùng một lúc.


3
Nếu bạn có x lựa chọn, bạn sẽ thực hiện 2 ^ x frontends?
apoorv020

@ apoorv020 - nếu tôi có đủ tham số cho một cuộc gọi phương thức mà 2 ^ x trở nên quan trọng, tôi sẽ tạo một lớp mới để giữ các giá trị tham số và chỉ cần truyền một tham số.
Scott Whitlock

@ scott-whitlock: Tùy chọn 1 - tạo một đối tượng, đặt thuộc tính x, gọi phương thức một lần với đối tượng của bạn. Tùy chọn 2 - gọi một phương thức với x tham số có tên. Cái nào tốt hơn phụ thuộc vào ngôn ngữ của bạn. Trong một ngôn ngữ được gõ động, tùy chọn 1 yêu cầu nhiều nồi hơi hơn đáng kể mà không đạt được, và như vậy là tồi tệ hơn. Trong một ngôn ngữ được nhập tĩnh, bạn vẫn thêm bản tóm tắt, nhưng kiểm tra các khóa được đặt tên không chính xác sẽ được thực hiện tại thời gian biên dịch thay vì thời gian chạy. Do đó, tùy chọn 1 tốt hơn trong C #, nhưng tùy chọn 2 là một chiến thắng rõ ràng trong Python.
btilly

@btilly - như Ian đã chỉ ra, Clean Code rõ ràng cho bạn biết không có các hàm có nhiều hơn 2 hoặc 3 tham số. Công bằng mà nói, nó đã xử lý Java, được gõ tĩnh. OP cũng đang hỏi về C #, được gõ tĩnh. Tôi vẫn thích sử dụng quá tải hàm và / hoặc các tên hàm được đặt tên chính xác khác với một danh sách dài các tham số.
Scott Whitlock

@ scott-whitlock: Chúng ta có thực sự không đồng ý không? Chúng tôi đồng ý về những gì tốt nhất trong C #. Cả hai chúng tôi đều biết Clean Code nói gì. Quan điểm của tôi là điều quan trọng là phải hiểu tại sao nó tốt, để bạn biết khi nào lời khuyên đó không phù hợp với môi trường khác.
btilly

3

Tôi là một người tin tưởng lớn vào các tham số được đặt tên trong các tình huống trong đó các loại và ngữ nghĩa không rõ ràng từ tên của phương thức. Kinh nghiệm của tôi là rất ít người đọc tài liệu.

Điều đó đang được nói, các tham số được đặt tên không nên thay thế cho việc tạo danh sách đối số hợp lý, sử dụng các đối tượng trợ giúp (để "liên kết" với nhau các đối số liên quan đến ngữ nghĩa) và sử dụng các liệt kê khi có liên quan.


0

Tôi nghĩ rằng điều này hữu ích hơn trong các ngôn ngữ không phải OO, trong đó bạn có thể có một chức năng phải thực hiện một số cách theo một số cách hơi khác nhau và cách nó xác định những việc cần làm dựa trên các giá trị tham số. Trong thế giới OOP, chúng ta sẽ quá tải chức năng, nhưng khi không thể thì bạn sẽ chuyển qua một loạt cờ (hoặc một loạt các giá trị, và liệu chúng có được thông qua hay không là cờ).

Tôi nghĩ rằng nó dễ đọc hơn, ở một mức độ nào đó; nhưng như những người khác đã đề cập, có nhiều tham số là mùi mã, vì vậy tôi không thấy toàn bộ sử dụng cho điều này trong một ngôn ngữ hướng đối tượng như 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.