Мені особисто не подобається функціонал "пройти посилання", який пропонують різні мови програмування. Можливо, це тому, що я просто відкриваю поняття функціонального програмування, але я завжди отримую goosebumps, коли бачу функції, що викликають побічні ефекти (наприклад, маніпулювання параметрами, що передаються посиланням). Я особисто сильно приймаю принцип "єдиної відповідальності".
IMHO, функція повинна повертати лише один результат / значення, використовуючи ключове слово return. Замість того, щоб змінювати параметр / аргумент, я б просто повернув змінене значення параметра / аргументу і залишив би будь-які бажані перепризначення до виклику коду.
Але іноді (сподіваємось, дуже рідко) необхідно повернути два і більше значення результату з тієї ж функції. У цьому випадку я б вирішив включити всі ці отримані значення в одну структуру або об'єкт. Знову ж таки, обробка будь-яких перепризначень повинна відповідати коду виклику.
Приклад:
Припустимо, параметри передачі підтримуватимуться за допомогою спеціального ключового слова типу "ref" у списку аргументів. Мій код може виглядати приблизно так:
//The Function
function doSomething(ref value) {
value = "Bar";
}
//The Calling Code
var value = "Foo";
doSomething(value);
console.log(value); //Bar
Натомість я хотів би зробити щось подібне:
//The Function
function doSomething(value) {
value = "Bar";
return value;
}
//The Calling Code:
var value = "Foo";
value = doSomething(value); //Reassignment
console.log(value); //Bar
Коли мені потрібно буде написати функцію, яка повертає кілька значень, я також не використовував би параметри, передані посиланням. Тому я б уникав такого коду:
//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
Натомість я хотів би повернути обидва нові значення всередині об'єкта, як-от так:
//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);
Ці приклади коду досить спрощені, але це приблизно демонструє, як я особисто поводився з подібними матеріалами. Це допомагає мені тримати різні обов'язки в потрібному місці.
Щасливе кодування. :)