Cá nhân tôi không thích chức năng "vượt qua tham chiếu" được cung cấp bởi các ngôn ngữ lập trình khác nhau. Có lẽ đó là vì tôi mới khám phá các khái niệm về lập trình chức năng, nhưng tôi luôn bị nổi da gà khi thấy các hàm gây ra tác dụng phụ (như thao tác các tham số được truyền qua tham chiếu). Cá nhân tôi mạnh mẽ chấp nhận nguyên tắc "trách nhiệm duy nhất".
IMHO, một hàm sẽ trả về chỉ một kết quả / giá trị bằng cách sử dụng từ khóa return. Thay vì sửa đổi một tham số / đối số, tôi sẽ chỉ trả về giá trị tham số / đối số đã sửa đổi và để lại bất kỳ sự gán lại mong muốn nào cho mã gọi.
Nhưng đôi khi (hy vọng rất hiếm khi), cần phải trả về hai hoặc nhiều giá trị kết quả từ cùng một hàm. Trong trường hợp đó, tôi sẽ chọn bao gồm tất cả các giá trị kết quả đó trong một cấu trúc hoặc đối tượng. Một lần nữa, xử lý bất kỳ sự gán lại nào sẽ tùy thuộc vào mã gọi.
Thí dụ:
Giả sử truyền tham số sẽ được hỗ trợ bằng cách sử dụng một từ khóa đặc biệt như 'ref' trong danh sách đối số. Mã của tôi có thể trông giống như thế này:
//The Function
function doSomething(ref value) {
value = "Bar";
}
//The Calling Code
var value = "Foo";
doSomething(value);
console.log(value); //Bar
Thay vào đó, tôi thực sự thích làm một cái gì đó như thế này:
//The Function
function doSomething(value) {
value = "Bar";
return value;
}
//The Calling Code:
var value = "Foo";
value = doSomething(value); //Reassignment
console.log(value); //Bar
Khi tôi cần viết một hàm trả về nhiều giá trị, tôi cũng sẽ không sử dụng các tham số được truyền bởi tham chiếu. Vì vậy, tôi sẽ tránh mã như thế này:
//The Function
function doSomething(ref value) {
value = "Bar";
//Do other work
var otherValue = "Something else";
return otherValue;
}
//The Calling Code
var value = "Foo";
var otherValue = doSomething(value);
console.log(value); //Bar
console.log(otherValue); //Something else
Thay vào đó, tôi thực sự muốn trả về cả hai giá trị mới bên trong một đối tượng, như thế này:
//The Function
function doSomething(value) {
value = "Bar";
//Do more work
var otherValue = "Something else";
return {
value: value,
otherValue: otherValue
};
}
//The Calling Code:
var value = "Foo";
var result = doSomething(value);
value = result.value; //Reassignment
console.log(value); //Bar
console.log(result.otherValue);
Các ví dụ mã này khá đơn giản, nhưng nó đại diện cho thấy cá nhân tôi sẽ xử lý những thứ đó như thế nào. Nó giúp tôi giữ các trách nhiệm khác nhau ở đúng nơi.
Chúc mừng mã hóa. :)