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?
Trả lời
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ị.
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ề.
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.
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.
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.
Đâ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
Đ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
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.
- 1. Tại sao hàm Perl này trả về một giá trị?
- 2. Tại sao printf trả về một giá trị?
- 3. Tại sao chúng ta nên thay đổi giá trị Salt Security trong CakePHP?
- 4. Tại sao chúng ta không nên gọi phương thức công khai từ một công chúng khác?
- 5. GetTemplateChild luôn trả về giá trị rỗng
- 6. Tôi có nên trả về giá trị TRUE/FALSE từ một hàm C không?
- 7. Tại sao UserPrincipal.Enabled trả về các giá trị khác nhau?
- 8. Tại sao ShowDialog luôn trả về DialogResult.Cancel?
- 9. Tại sao chúng ta nên sử dụng mã hóa ui khi chúng ta có Specflow?
- 10. tại sao cout.tellp luôn trả về -1?
- 11. Tại sao malloc luôn trả về NULL
- 12. Random.Next trả về luôn có cùng giá trị
- 13. Tại sao toán tử ++ trả về giá trị không const?
- 14. Tại sao tôi không thể trả về các giá trị lớn hơn từ chức năng chính?
- 15. Chúng ta có nên luôn luôn có một hàm tạo không đối số trong một lớp không?
- 16. tại sao $ address-> hasCouponCode() luôn trả về null?
- 17. Tại sao chúng ta không thể khóa trên một loại giá trị?
- 18. Tại sao CloudBlockBlob.DownloadToStream luôn trả về một luồng trống?
- 19. tại sao chúng ta không nên sử dụng ++ trong javascript?
- 20. Chúng ta có nên luôn ghi đè bằng?
- 21. PHP: Tại sao chúng ta cần hàm so sánh chuỗi?
- 22. Giá trị trả về từ hàm postgresql ẩn danh
- 23. Đối tượng Microsoft, các hàm Release() trả về giá trị?
- 24. Giá trị trả về từ mã Java
- 25. AlertDialog trong một hàm có giá trị trả về
- 26. Tại sao chúng ta cần các nhà thầu tĩnh?
- 27. trả về hai giá trị từ webservice
- 28. Khi nào chúng ta nên sử dụng lớp học và khi chúng ta không nên
- 29. MVC: tại sao chúng ta cần "điều khiển", hoặc khi nào chúng ta nên sử dụng mẫu này?
- 30. Tại sao preferences.getString ("key", "DEFAULT") luôn trả về "DEFAULT"?
Trái với việc làm gì? – Duniyadnd
RTFM: http://php.net/manual/en/function.return.php – diEcho
@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