2012-09-10 38 views
5

Tôi không phải là một người lập trình lớn nhưng đã lắng nghe từ các lập trình viên rất nhiều lần rằng chúng ta nên luôn luôn trả về các giá trị từ một hàm. Tôi muốn biết lý do.Tại sao chúng ta nên luôn trả về các giá trị từ một hàm?

+0

Trái với việc làm gì? – Duniyadnd

+3

RTFM: http://php.net/manual/en/function.return.php – diEcho

+6

@diEcho - Liên kết tới hướng dẫn không thực sự trả lời câu hỏi này cả ... – Lix

Trả lời

5

Một chức năng không cần quay trở lại bất cứ điều gì ... Nếu bạn nhìn vào (++) chức năng C, nhiều người trong số họ không (tốt, không rõ ràng):

void nonReturningFunction(const int *someParam); 
int main() 
{ 
    int i = 12; 
    nonReturningFunction(&i); 
    return 0; 
} 
void nonReturningFunction(const int *someParam) 
{ 
    printf("I print the value of a parameter: %d",someParam); 
} 

Sau đó không trả về gì cả, tốt, nó trả về một khoảng trống. Chức năng chính trả lại một cái gì đó: 0, đây thường là một tín hiệu cho hệ thống để cho nó biết chương trình được hoàn thành, và nó đã hoàn thành tốt.

Logic tương tự áp dụng cho PHP hoặc bất kỳ ngôn ngữ lập trình nào khác. Giá trị trả về của một số hàm có liên quan, một hàm khác có thể không bắt buộc phải trả về bất kỳ giá trị nào. Trong các hàm tổng quát trả về các giá trị vì chúng có liên quan đến luồng của chương trình của bạn.

Đi một lớp học, ví dụ:

<?php 
    class Foo 
    { 
     private $foo,$bar; 
     public function __construct() 
     { 
      $this->foo = 'bar'; 
     } 
     public function getFoo() 
     { 
      return $this->foo;//<-- getter for private variable 
     } 
     public function getBar() 
     { 
      return $this->foo;//<-- getter for private variable 
     } 
     public function setBar($val = null) 
     { 
      $this->bar = $val; 
      return $this;//<-- return instance for fluent interfacing 
     } 
     public function setFoo($val = null) 
     { 
      $this->foo = $val; 
      return $this; 
     } 
    } 
    $f = new Foo(); 
    $f->setFoo('foo')->setBar('bar');//<-- fluent interface 
    echo $f->getFoo(); 
?> 

Nếu hàm setter không trở về bất cứ điều gì, bạn phải viết:

$f->setFoo('foo'); 
$f->setBar('Bar'); 

Vì vậy, trong trường hợp này, giá trị trả lại là liên quan, thích hợp. Một ví dụ khác, nơi họ đang không liên quan:

function manipulateArray(array &$arr)//<-- pass by reference 
{ 
    sort($arr); 
} 
$arr = range('Z','A'); 
manipulateArray($arr); 
var_dump($arr);//array is sorted 

như trái ngược với:

function manipulateArray(array $arr)//<-- pass by copy 
{ 
    sort($arr); 
    return $arr; 
} 
$arr = range('Z','A'); 
manipulateArray($arr); 
var_dump($arr);//array is not sorted! 
$arr = manipulateArray($arr);//<-- requires reassign 

Đi qua bằng cách tham khảo được coi là nguy hiểm trong nhiều trường hợp, đó là lý do tại sao tiếp cận thứ hai thường được coi là tốt hơn. Vì vậy, trong nhiều trường hợp, các hàm không cần trả về một giá trị, nhưng chúng làm tất cả như nhau vì nó làm cho mã an toàn hơn.
Đó có thể là lý do bạn ấn tượng rằng các hàm phải luôn là trả về một giá trị.

7

Việc này được thực hiện để có điểm kết thúc dứt khoát cho hàm. Nó chủ yếu là để tăng khả năng đọc và giúp các lập trình viên tương lai hiểu được những gì bạn đang cố gắng làm.

Sẽ không có giả định về hàm trả về.

5

Có quá nhiều lý do ...

Tốt hơn cho kiến ​​trúc của bạn: một hàm lấy thông số, làm việc với chúng và trả về kết quả mong đợi. Bằng cách đó bạn có thể sử dụng lại và sắp xếp mã của bạn.

Tốt hơn cho unit testing, bạn có thể dễ dàng kiểm tra xem chức năng của bạn có trả về kết quả mong đợi hay không.

3

Nói chung trong lập trình máy tính, một hàm là đơn vị mã có thể tái sử dụng để lấy một số đầu vào (kể cả không có gì) và trả về một giá trị.

Một số ngôn ngữ có cấu trúc tương tự với các hàm gọi là thủ tục và đây là các đoạn mã có thể sử dụng lại để lấy một số đầu vào (không bao gồm) và thực hiện một số hoạt động nhưng không trả lại kết quả.

Tuy nhiên, một số ngôn ngữ có thể không có ngôn ngữ sau làm cấu trúc cú pháp và các hàm sử dụng để thực hiện các thủ tục. Vì vậy, bạn ở đây bạn nhận được chức năng mà bạn bỏ qua kết quả. Ngoài ra một số ngôn ngữ có thể không có yêu cầu thực sự buộc mã trả về một cái gì đó từ một hàm (nghĩa là chúng thực hiện các thủ tục bằng cách sử dụng các hàm).

Vì vậy, nếu bạn chỉ có tùy chọn sau, thì bạn có thể tranh luận như @lix rằng thực tiễn tốt là trả lại mọi thứ từ chức năng. Lý do chính là mặc dù chức năng có thể được sử dụng như một thủ tục - người gọi có thể gọi nó như chức năng và mong muốn làm việc với kết quả. Hãy nhớ rằng mã thử nghiệm là trường hợp sử dụng chính và đó có thể là lý do duy nhất để tuân theo quy ước này.

Cá nhân tôi nghĩ quy ước là câu trả lời. Làm bất cứ điều gì làm việc tốt nhất cho bạn, nhưng cố gắng luôn luôn làm như vậy, và nếu bạn cần phải phân kỳ - tìm cách để cho người dùng biết.

2

Ngoài ra: linh hoạt. Hãy xem xét echo ing so với return ing từ bên trong một hàm. Với, ví dụ, một số điện thoại trả về true hoặc false từ một hàm, bạn có thể sửa đổi cách hiển thị mọi thứ trong các chế độ xem theo nhiều cách tùy ý. Có một chuỗi lặp lại không cho bạn sự linh hoạt này.

7

Đây là di sản của chương trình cũ. Trong các ngôn ngữ cũ như Fortran, bạn luôn phải quay trở lại với một cái gì đó với kiểu int, float, bool, v.v ... Vì C bạn có thể trở lại với kiểu "void", và đó là mặc định trong hầu hết các hàm C nếu bạn không chỉ định return return, nó trả về với void ở cuối. Trong Java ví dụ bạn phải chỉ định một kiểu trả về và sau đó trở về với kiểu đó. Nếu bạn không muốn trả lại bất cứ điều gì, bạn sử dụng loại 'void':

//This works 
public void boo() { 
    return; 
} 


//This gets you an error 
public int boo() { 
    return; 
} 

//This gets you an error too, because you must specify a type for any function in Java 
public boo() { 
    return; 
} 

Vì vậy, nó giống như những gì Lix nói, nếu bạn có thứ gì đó để trở về, bạn làm. Trong hầu hết các chương trình chức năng, các chức năng của bạn có thể trả về dữ liệu, hoặc thành công hoặc thất bại. Trong nhiều hệ thống, một hàm có thể trả về một thành công cho biết thành công hay thất bại như '1' hoặc '-1'. Các chương trình shell Unix sử dụng nó.

Trong các ngôn ngữ khác như PHP bạn không cần phải trả lại bất kỳ điều gì, nhưng trong nền PHP vẫn gắn một loại 'void' làm giá trị trả về cho hàm của bạn, bạn không cần phải viết nó một cách rõ ràng.

Hope this helps

+0

Điều đó sẽ giải thích tất cả số 0 trả về thay vì vô hiệu mà tôi đã thấy gần đây. – Steinin

0

Một số ngôn ngữ trước đó có các quy trình và chức năng. Thủ tục trả lại không có gì (họ chỉ làm một cái gì đó). Chức năng trả về một cái gì đó. Tôi đoán ai đó đã quyết định nó là không cần thiết để có cả hai kể từ khi một chức năng có thể chỉ đơn giản là void (như được sử dụng trong C). Tôi vừa viết một hàm nhanh để lưu trữ dữ liệu trong cơ sở dữ liệu. Vì dữ liệu được lọc theo nhiều cấp độ, tỷ lệ lỗi của một lỗi là không đáng kể, tuy nhiên, tôi đã đưa vào chức năng một cảnh báo, điều đó sẽ lặp lại do lỗi, vì vậy việc trả lại ngay cả cảnh báo lỗi cũng không cần thiết. (Đây là một trang web trong nhà, mà sẽ không được sử dụng công cộng) để có chức năng trả lại bất cứ điều gì là hoàn toàn không cần thiết.

Vì câu hỏi là lý do tại sao chúng ta nên trả về giá trị, đó không phải là lý do tại sao đôi khi trả lại giá trị, nhưng lý do nào tồn tại để yêu cầu chúng tôi luôn trả về giá trị và không có lý do hợp lệ một giá trị từ một hàm.

Các vấn đề liên quan