Перевага полягає в тому, що чисті функції полегшують ваш код. Або, іншими словами, побічні ефекти збільшують складність вашого коду.
Візьмемо приклад computeProductPrice
методу.
Чистий метод вимагає від вас кількості товару, валюти і т. Д. Ви знаєте, що коли метод буде викликаний з однаковими аргументами, він завжди дасть однаковий результат.
- Ви навіть можете кешувати його та використовувати кешовану версію.
- Ви можете зробити його ледачим і відкласти його дзвінок, коли вам це справді потрібно, знаючи, що значення тим часом не зміниться.
- Ви можете викликати метод кілька разів, знаючи, що він не матиме побічних ефектів.
- Ви можете міркувати про сам метод у відриві від світу, знаючи, що все, що йому потрібно, - це аргументи.
Нечистий метод буде складнішим у використанні та налагодженні. Оскільки це залежить від стану змінних, крім аргументів, і можливо їх зміни, це означає, що він може давати різні результати при виклику декількох разів, або не мати однакову поведінку, коли не викликається взагалі або викликається занадто рано або занадто пізно.
Приклад
Уявіть, що в рамках є метод, який аналізує число:
decimal math.parse(string t)
Він не має референтної прозорості, оскільки це залежить від:
Змінна середовища, яка вказує систему нумерації, тобто База 10 або щось інше.
Змінна в math
бібліотеці, яка визначає точність розбору чисел. Тож зі значенням 1
, розбір рядка "12.3456"
дасть 12.3
.
Культура, яка визначає очікуване форматування. Наприклад, з fr-FR
, синтаксичний розбір "12.345"
дасть 12345
, оскільки символом розділення повинен бути ,
, а не.
Уявіть, як легко та важко було б працювати з таким методом. З тим самим входом ви можете мати докорінно різні результати залежно від моменту, коли ви викликаєте метод, оскільки щось десь змінило змінну середовища або переключило культуру або встановило іншу точність. Недетермінований характер методу призведе до більшої кількості помилок і більшого налагодження кошмару. Телефонувати math.parse("12345")
та отримувати 5349
як відповідь, оскільки якийсь паралельний код розбирав восьмеричні числа, не приємно.
Як виправити цей очевидно зламаний метод? Запроваджуючи референтну прозорість. Іншими словами, позбувшись глобального стану та перемістивши все до параметрів методу:
decimal math.parse(string t, base=10, precision=20, culture=cultures.en_us)
Тепер, коли метод чистий, ви знаєте, що незалежно від того, коли ви будете викликати метод, він завжди дасть однаковий результат для тих же аргументів.