2012-05-01 11 views
6

Vì nó có thể rõ ràng từ tiêu đề mà phương pháp tiếp cận chúng ta nên chọn?Vượt qua một tham số so với trả lại thông số từ hàm

Ý định là chuyển một vài tham số phương thức và nhận được kết quả. Chúng ta có thể vượt qua một tham số và phương thức khác sẽ cập nhật nó và phương thức không cần trả về bất cứ thứ gì ngay bây giờ, phương thức sẽ chỉ cập nhật biến đầu ra và nó sẽ được phản ánh cho người gọi.

Tôi chỉ đang cố gắng đặt khung câu hỏi thông qua ví dụ này.

List<String> result = new ArrayList<String>(); 

for (int i = 0; i < SOME_NUMBER_N; i++) { 
    fun(SOME_COLLECTION.get(i), result); 
} 

// in some other class 
public void fun(String s, List<String> result) { 
    // populates result 
} 

so

List<String> result = new ArrayList<String>(); 

for (int i = 0; i < SOME_NUMBER_N; i++) { 
    List<String> subResult = fun(SOME_COLLECTION.get(i)); 
    // merges subResult into result 
    mergeLists(result, subResult); 
} 

// in some other class 
public List<String> fun(String s) { 
    List<String> res = new ArrayList<String>(); 
    // some processing to populate res 
    return res; 
} 

Tôi hiểu rằng một vượt qua tham khảo và khác thì không.

Chúng ta nên chọn cái nào (trong các tình huống khác nhau) và tại sao?

Cập nhật: Chỉ xem xét nó cho các đối tượng có thể thay đổi.

+0

Tôi không chắc chắn những gì bạn đang yêu cầu. Bạn có yêu cầu trong những tình huống bạn nên vượt qua một biến đến một phương pháp vs mua nó trong phương pháp với một getArg() hoặc bất cứ điều gì nó có thể được gọi? – Charles

+0

Không, bạn hiểu lầm hoặc tôi không thể truyền đạt. Tôi hỏi: Chúng ta có nên chuyển một biến cho hàm như một tham chiếu hoặc trả về hàm đó từ hàm không? Trong trường hợp nào chúng ta nên sử dụng một trong hai trường hợp này? Hy vọng, tôi rõ ràng! – instanceOfObject

Trả lời

14

Trả lại giá trị từ hàm thường là cách viết mã rõ ràng hơn.Việc chuyển một giá trị và sửa đổi nó là phong cách C/C++ do bản chất của việc tạo và phá hủy các con trỏ. Các nhà phát triển thường không mong đợi rằng giá trị của họ sẽ được sửa đổi bằng cách chuyển nó qua một hàm, trừ khi hàm đó tuyên bố rõ ràng nó thay đổi giá trị (và chúng ta thường đọc lướt qua tài liệu).

Có ngoại lệ.

Hãy xem xét ví dụ về Collections.sort, thực tế thực hiện sắp xếp danh sách. Hãy tưởng tượng một danh sách của 1 triệu mặt hàng và bạn đang phân loại đó. Có thể bạn không muốn tạo danh sách thứ hai có thêm 1 triệu mục (mặc dù các mục này trỏ ngược về bản gốc).

Nó cũng là thực hành tốt để ưu tiên có các đối tượng bất biến. Các đối tượng bất biến gây ra ít vấn đề hơn trong hầu hết các khía cạnh phát triển (chẳng hạn như luồng). Vì vậy, bằng cách trả về một đối tượng mới, bạn không buộc tham số phải có thể thay đổi được.

Phần quan trọng là phải rõ ràng về ý định của bạn trong các phương pháp. Đề xuất của tôi là tránh sửa đổi tham số khi có thể vì nó không phải là hành vi điển hình nhất trong Java.

+0

Làm cho tinh thần! Cảm ơn! – instanceOfObject

0

Trả lại mã sẽ giữ mã của bạn sạch hơn và ít bị ràng buộc giữa các phương pháp/lớp học hơn.

0

Đây là thông tin thêm về các phương pháp hay nhất và phương pháp của riêng bạn để lập trình. Tôi có thể nói nếu bạn biết đây sẽ là một giá trị hàm kiểu trả về như:

chức năng IsThisNumberAPrimeNumber {}

Sau đó, bạn biết rằng đây chỉ là sẽ không bao giờ quay trở lại một boolean. Tôi thường sử dụng các chức năng như các chương trình trợ giúp và không phải là các thủ tục con lớn. Tôi cũng áp dụng các quy ước đặt tên giúp điều khiển những gì tôi mong đợi hàm sub \ sẽ trả về. Ví dụ:

GetUserDetailsRecords GetUsersEmailAddress IsEmailRegistered

Nếu bạn nhìn vào những 3 tên, bạn có thể nói là người đầu tiên sẽ cung cấp cho bạn một số danh sách hoặc lớp của nhiều hồ sơ người dùng cụ thể, thứ hai sẽ cung cấp cho bạn một giá trị chuỗi của một email và giá trị thứ ba sẽ cho bạn giá trị boolean. Nếu bạn thay đổi tên, bạn thay đổi ý nghĩa, vì vậy tôi sẽ nói xem xét điều này ngoài ra.

0

Lý do tôi không nghĩ rằng chúng tôi hiểu rằng đó là hai loại hành động hoàn toàn khác nhau. Việc truyền một biến cho một hàm là một phương tiện để đưa ra một dữ liệu hàm. Trả lại nó từ hàm là cách truyền dữ liệu ra khỏi một hàm.

Nếu bạn có nghĩa là sự khác biệt giữa hai hành động này:

public void doStuff(int change) { 
    change = change * 2; 
} 

public void doStuff() { 
    int change = changeStorage.acquireChange(); 
    change = change * 2; 
} 

Sau đó, thứ hai là nói chung sạch, tuy nhiên có nhiều lý do (an ninh, chức năng visibilty, vv) mà có thể ngăn bạn truyền dữ liệu theo cách này.

Nó cũng thích hợp hơn vì nó làm cho việc sử dụng lại mã dễ dàng hơn, cũng như làm cho nó mô đun hơn.

6

Bạn nên trả lại. Ví dụ thứ hai bạn cung cấp là cách để đi.

Trước hết, nó rõ ràng hơn. Khi người khác đọc mã của bạn, không có dấu hiệu nào cho thấy rằng họ có thể không nhận thấy thông số đang được sửa đổi làm đầu ra. Bạn có thể thử đặt tên cho các biến, nhưng khi nói đến khả năng đọc mã, nó thích hợp hơn.

Lý do LỚN lý do bạn nên trả lại thay vì vượt qua, là các đối tượng không thay đổi. Ví dụ của bạn, Danh sách, có thể thay đổi, do đó, nó hoạt động tốt. Nhưng nếu bạn cố gắng sử dụng một chuỗi theo cách đó, nó sẽ không hoạt động.

Như dây là không thay đổi, nếu bạn vượt qua một chuỗi trong như một tham số, và sau đó là chức năng đã nói:

public void fun(String result){ 
    result = "new string"; 
} 

Giá trị của kết quả mà bạn thông qua vào sẽ không được thay đổi. Thay vào đó, biến phạm vi cục bộ 'result' bây giờ trỏ đến một chuỗi mới bên trong vui, nhưng kết quả trong phương thức gọi của bạn vẫn trỏ đến chuỗi ban đầu.

Nếu bạn gọi:

String test = "test"; 
fun(test); 
System.out.println(test); 

Nó sẽ in: "test", không phải "chuỗi mới"!

Vì vậy, chắc chắn, nó là cấp trên để trở về. :)

+0

Yup! Điều đó tôi hiểu, câu hỏi chỉ dành cho các đối tượng Mutable! Cảm ơn bạn đã trả lời btw! – instanceOfObject

+0

Không sao cả. Vâng, đối với các đối tượng có thể thay đổi, nó hoạt động, và trong một số trường hợp nó sẽ thích hợp hơn (bạn không thể trả về nhiều đối tượng mà không sử dụng một bộ tuple), nhưng nói chung nếu nó giống nhau, trả về là kiểu mã tốt hơn. – SpacePrez