Có phải là một thực hành tốt để tạo biến mới để xem đầu ra của hàm?


8

Hãy xem xét 2 loại thực hiện này:

public int add(int x, int y) {
    return mysteriousAdd(x, y);
}


public int add(int x, int y) {
    int output = mysteriousAdd(x, y);
    return output;
}

Một đồng nghiệp của tôi nói rằng việc thực hiện thứ hai tốt hơn bởi vì trong quá trình gỡ lỗi, chúng ta có thể thấy biến mysteriousAddtrả về và nó không phải là quá nhiều để tạo ra biến đó trong ngăn xếp. Tôi nghĩ rằng việc triển khai đầu tiên là tốt hơn và quan điểm của ông không hợp lệ vì ngày nay hầu hết các trình biên dịch có thể hiển thị phản hồi của hàm trong quá trình gỡ lỗi mà không có biến phụ và chúng tôi cũng đang tránh tạo thêm biến trong ngăn xếp.

Là tạo biến tham chiếu trong ngăn xếp là một hoạt động giá rẻ? Bạn muốn đề xuất phương pháp nào trong 2 phương pháp trên là tốt hơn cho việc viết mã và tại sao?


2
Câu hỏi tương tự cho C #: softwareengineering.stackexchange.com/questions/141711/iêu , gần như là một bản sao.
Doc Brown

Câu trả lời:


16

Nếu bạn so sánh đầu ra của assembly / bytecode / IL / etc của hai hàm như thế, bạn sẽ thấy cả hai đều giống nhau. Tất cả trừ các trình biên dịch mạnh nhất sẽ tối ưu hóa giá trị bổ sung.

Vì vậy, bất kỳ cân nhắc hiệu suất / bộ nhớ nên được ném ra.

Vì vậy, hãy lựa chọn về khả năng đọc. Trong ví dụ này, thực sự không có giá trị để xác định giá trị trả về trước khi trả về. Tuy nhiên, nếu bạn ở dưới cùng của phép tính 20 dòng hoặc một cái gì đó, thường có thể đáng để tạo giá trị được đặt tên trước khi trả về, vì tên đó có thể chỉ ra cho người đọc thông tin về việc tính toán được cho là gì.


4
Tôi thường tạo các biến hoàn toàn không cần thiết, vì sau đó có thể đặt điểm dừng và kiểm tra giá trị sắp được trả về.
Simon B

3
@SimonB, một cách tiếp cận khác để tránh "biến gỡ lỗi" là viết bài kiểm tra. Các thử nghiệm sẽ loại bỏ 90% thời gian gỡ lỗi.
Fabio

@Fabio, tất nhiên ngoại trừ khi thử nghiệm của bạn thất bại và bạn cần gỡ lỗi và sau đó bạn thoát ra biến để bạn có thể đặt điểm dừng: D
Hangman4353 15/12/18

1
@ Hangman4353 đúng trong 10% thời gian :) Nhưng trong các thử nghiệm, bạn sẽ luôn có một người tiêu dùng sẽ xác nhận kết quả đầu ra, vì vậy tôi sẽ luôn bắt được giá trị trả về ở mức thử nghiệm. Và nếu bạn có các bài kiểm tra cụ thể thì bạn sẽ biết lý do của các bài kiểm tra thất bại là gì;)
Fabio

Nếu tôi có một địa phương tôi (gần như) luôn luôn trả về (vì không có nó sẽ phức tạp hơn), tôi thường gọi nó result(có thể viết tắt). Cái tên đó thực sự nói lên tất cả.
Ded repeatator

1

Chứng minh trong môi trường lập trình của bạn rằng bạn có thể đọc kết quả của lệnh gọi hàm mà không có biến chính xác dễ dàng mà không cần biến tạm thời. Tôi đang sử dụng những gì tôi nghĩ là một môi trường mã hóa tốt, và tôi không thể.

Vì vậy, chứng minh điều đó. Nếu bạn có thể, đồng nghiệp của bạn đã học được điều gì đó. Nếu bạn không thể, bạn đã học được điều gì đó.

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.