Tôi nghi ngờ tôi sẽ không xem xét câu hỏi này, nhưng tôi là một lập trình viên rất có kinh nghiệm và tôi hy vọng một số độc giả cởi mở hơn sẽ chú ý.
Tôi tin rằng nó phù hợp với các ngôn ngữ lập trình hướng đối tượng tốt hơn cho các thủ tục trả về giá trị (VRP) của chúng là mang tính xác định và thuần túy.
'VRP' là tên học thuật hiện đại cho một hàm được gọi là một phần của biểu thức và có giá trị trả về thay thế cho cuộc gọi trong khi đánh giá biểu thức. Ví dụ, trong một tuyên bố như x = 1 + f(y)
hàm f
đang phục vụ như một VRP.
'Xác định' có nghĩa là kết quả của hàm chỉ phụ thuộc vào các giá trị của tham số. Nếu bạn gọi nó một lần nữa với cùng các giá trị tham số, bạn chắc chắn sẽ nhận được kết quả tương tự.
'Pure' có nghĩa là không có tác dụng phụ: gọi hàm không làm gì ngoài việc tính toán kết quả. Điều này có thể được hiểu là không có tác dụng phụ quan trọng , trong thực tế, do đó, nếu VRP xuất ra một thông báo gỡ lỗi mỗi khi nó được gọi, ví dụ, điều đó có thể bị bỏ qua.
Do đó, nếu trong C #, hàm của bạn không xác định và thuần túy, tôi nói bạn nên biến nó thành void
hàm (nói cách khác, không phải VRP) và bất kỳ giá trị nào nó cần trả về phải được trả về trong một out
hoặc một ref
tham số.
Ví dụ: nếu bạn có chức năng xóa một số hàng khỏi bảng cơ sở dữ liệu và bạn muốn nó trả về số lượng hàng đã xóa, bạn nên khai báo nó như sau:
public void DeleteBasketItems(BasketItemCategory category, out int count);
Nếu đôi khi bạn muốn gọi hàm này nhưng không nhận được count
, bạn luôn có thể khai báo quá tải.
Bạn có thể muốn biết tại sao phong cách này phù hợp với lập trình hướng đối tượng tốt hơn. Nhìn rộng ra, nó phù hợp với một phong cách lập trình có thể (một chút không chính xác) được gọi là "lập trình thủ tục", và đó là một phong cách lập trình thủ tục phù hợp với lập trình hướng đối tượng tốt hơn.
Tại sao? Mô hình cổ điển của các đối tượng là chúng có các thuộc tính (còn gọi là thuộc tính), và bạn thẩm vấn và thao tác đối tượng (chủ yếu) thông qua việc đọc và cập nhật các thuộc tính đó. Một kiểu lập trình thủ tục có xu hướng làm cho việc này dễ dàng hơn, bởi vì bạn có thể thực thi mã tùy ý ở giữa các hoạt động nhận và đặt thuộc tính.
Nhược điểm của lập trình thủ tục là bởi vì bạn có thể thực thi mã tùy ý ở mọi nơi, bạn có thể nhận được một số tương tác rất khó hiểu và dễ bị lỗi thông qua các biến toàn cầu và tác dụng phụ.
Vì vậy, khá đơn giản, đó là một thực tiễn tốt để báo hiệu cho ai đó đọc mã của bạn rằng một hàm có thể có tác dụng phụ bằng cách làm cho nó không trả về giá trị.