Параметризуйте методи проти глобальних змінних


10

У мене дуже просте питання, яке переслідує мене протягом певного часу, коли мій код починає зростати.

Чи слід замінювати параметри глобальними змінними, коли вони проходять довгі маршрути вкладених функцій викликів?

Я розумію, що глобальне середовище може зробити стан програми непередбачуваним, оскільки багато функцій можуть змінювати загальні змінні, але все-таки глобальний простір робить так просто.

Дозвольте мені пояснити:

functionA(){
   x = something
   functionB(x)
}
functionB(x){
   functionC(x)
}
functionC(x){
   finallyDoSomethingWithX(x)
}
finallyDoSomethingWithX(x){
  x += 1 //Very dummy example ignoring pass by value, not reference.
}

Замінено:

globalX;
functionA(){
   globalX = something
   functionB()
}
...
...
...
finallyDoSomethingWithX(){
   globalX += 1
}

Я вважаю, що другий спосіб дає стільки свободи програмуванню, оскільки параметри можуть накопичуватися легко, а також можуть бути дуже обмежуючими, коли код потрібно повторно використовувати, але в той же час я відчуваю, що функція втратить свою модульність, коли вона пов'язана зі змінною у глобальному середовищі також втрачає можливість повторного використання, коли, наприклад, я хочу працювати finallyDoSomethingWithXз іншою змінною, відмінною від tha globalX.

Я думаю, що це трапляється зі мною, тому що я фактично не використовую шаблони дизайну, тому що я програмую в Javascript, що для мене відчуває себе як єдиний скрипт-угод для всіх середніх проектів.

Якісь поради? візерунки? Я можу бути більш конкретним, якщо потрібно.


5
Як правило, якщо ви передаєте змінні дуже глибоко, ви неправильно не вирішили проблему. Що стосується глобальних змінних, що призводять до стану інших місць у системі, уникайте цього, як чуми. Неможливо керувати в певний момент, і ви виявите, що речі розбиваються випадковим чином, оскільки деякий стан мутується функцією, якої ви не очікували випадково.
mgw854

Уникайте його, як чуми. Зрозумів. Не могли б ви детальніше зупинитися на тому, що "ви неправильно не вирішили проблему". Я розумію загальну ідею, але не можу привести приклад чи щось, щоб реально її зрозуміти.
AFP_555

2
Поширений засіб захисту, коли ви переносите аргументи на багато шарів глибиною, - це створити об’єкт методу : об’єкт нового класу, методи якого відповідають функціям, які передають параметри. Потім параметри можуть стати змінними, локальними для об'єкта, і його методи вже не повинні передавати значення.
Кіліан Фот

@KilianFoth Дякую Чи можете ви, будь ласка, розробити якийсь код, щоб я міг перевірити відповідь?
AFP_555

1
Розгляньте поводження зі структурою коду JavaScript так, як і в інших мовах (наприклад, у тих, що використовують "реальні" класи). Кілька корисних посилань на це пов’язане питання щодо SO: stackoverflow.com/questions/927651/…
Бен Коттрелл

Відповіді:


7

Не використовуйте глобальні змінні.

Крім того, не передайте параметри вниз по ланцюгах функцій!

Це складно, оскільки ти не використовуєш фактичний приклад. Але зазвичай буде кращий підхід.

Скажімо, у нас є змінна пароля, яку нам потрібно використовувати для виклику apis, який вбудований, використовується різними функціями низького рівня.

Глобальний підхід (псудо-код)

var pass;

function multiply(a,b) {
   return apiMultiply(pass,a,b);
}

Підхід параметри проходження

function multiply(a,b,pass) {
    return apiMultiply(pass,a,b);
}

Об'єктний підхід

class math {
    var api;
    constructor(pass) {
        api = new api(pass);
    }

    function Multiply(a,b) {
        api.Multiply(a,b); //uses pass from constructor
    }
}

Відмінний. Цей шлях проходження не знаходиться у глобальному середовищі, а також не є параметром для багатозмінних функцій, оскільки його можна взяти з атрибутів об'єкта. Дякую.
AFP_555

3

Уникайте глобалів, як чума.

Будь-який код може змінювати глобальний. Отже, якщо у вас був ланцюг A (x) -> B (x) -> C (x) -> ... -> Z (x), і ви зберігаєте x у глобальний X, і тепер у вас є ланцюг A- > B-> C -> ...-> Z, то на кожному кроці цього довгого ланцюга або в абсолютно незалежному коді хтось може змінити X. І значення, яке використовує Z, може бути зовсім іншим від того, яке A почав з.

Це кошмар, якщо ви хочете коли-небудь бути впевненим, що ваш код робить те, що він повинен робити, або що він робить те, що ви думаєте, що робить.


1
Повністю згоден. Якщо ви вирішили свою проблему, ви маєте дві проблеми.
Калеб Мауер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.