Який термін використовується для опису функції / методу, що модифікує об'єкт, на який він викликається?


12

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

Мій друг вивчає програмування, спеціально JavaScript, і він запитав мене, чому це не працює:

var a = "Hello World";
a.replace("Hello", "Goodbye");

console.log(a)  // Logs "Hello World"

Причина в тому, replaceщо не змінюється a, оскільки рядки незмінні в JavaSript. Оскільки він повертає рядок, вам потрібно буде зробити щось на кшталт ...

var a = "Hello World";
a = a.replace("Hello", "Goodbye");

console.log(a);  // Logs "Goodbye World"

Однак альтернативою є така функція, як JavaScript reverse(), оскільки вона змінює все, що викликає. Наприклад:

var fruits = ["Apples", "Oranges", "Bananas"];
fruits.reverse();

console.log(fruits)  // ["Bananas", "Oranges", "Apples"]

Коли мій друг запитав мене, чому його replaceне працює, я зрозумів, що домагаюся слова, якого я не знаю (наскільки мені відомо) ...

"Ви повинні встановити рядок на" заміна точки рядка ", оскільки функція заміни - ________."

Вам не потрібно встановлювати масив, рівний "array dot reverse", тому що зворотний ________ ".

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


6
Може, слово «мутатор»? як в: You don't need to set an array equal to "array dot reverse", because reverse is a mutator function. Я думаю, що я чув цю термінологію для позначення функцій, які "мутують" екземпляр, який їх викликає. Але вам, мабуть, слід ще раз перевірити це десь в іншому місці.
FrustratedWithFormsDesigner

Оцініть це! Я щойно прочитав " Мутаторні методи", і думаю, що це безумовно добре вписується в цю розмову. Звичайно, у царині того, що я шукаю.
Санті

Я збентежений: в назві, ви питаєте про функції , яка модифікує об'єкт , який назвав його, але в ваших прикладах, ви показуєте методи , які змінюють об'єкт їх називають на , тобто повну протилежність назвою. Хто з двох це?
Йорг W Міттаг

Достеменно той, що пояснюється в 30 деталях. Я зміню заголовок на точність, дякую за голову!
Санті

Відповіді:


12

Пара понять , які ви шукаєте є змінними / незмінними параметрами і на місці / повернення результатів.

У ваших прикладах:

Вам слід встановити рядок на "string dot substitution", оскільки функція заміни працює на рядку, який у python є незмінним, тому функція заміни повертає нову рядок.

Для програміста C / C ++ це більш звично, оскільки параметри "передаються за значенням", а не "передані посилання", що робить їх непорушними і повертає результат.

Вам не потрібно встановлювати масив, рівний "array dot reverse", оскільки реверс працює на масиві, який є змінним , тому він може внести зміни на місці перед поверненням.

У таких мовах, як C / C ++, це відомо як параметри "передано посилання", тобто передача адреси, яка, якщо немодифікована const, дозволяє функції змінювати, мутувати зміст цієї адреси, змінюючи результати на місці перед поверненням.

Звичайно, не є незвичайною функція, яка повертає результати за обома механізмами, наприклад, int SomeFn(int p1, int p2, int *ErrCode)може потенційно повертати результати як у поверненому значенні, так і змінюючи вміст ErrCode.

3-й метод

Для повноти третій механізм повернення результатів є побічним ефектом або глобальним , тобто зміною обсягу файлу, загальнопрограмного значення, загального значення або екологічних значень. Це, як правило, вважається поганою новиною, оскільки, якщо це не дуже добре зафіксовано, ви можете дізнатися, що змінюється, уважно прочитавши код. У таких мовах, як C / C ++, це все занадто просто зробити, маючи зовнішню змінну області дії із заданим іменем, можливо, навіть в іншому модулі, і не маскуючи локальну змінну області дії з тим же ім'ям. У Python, хоча ви можете зчитувати значення значень у зовнішніх областях, якщо тільки значення зовнішньої області прямо не встановлено як доступні для зміни з допомогоюglobal Ключове слово, намагаючись змінити змінну зовнішньої області, автоматично створює локальний однойменний набір.


Ах, я знайомий з цими термінами, хоча я не був впевнений, чи є власне слово, яке описує саму функцію . Як і в (The reverse function is a _______ function.). Коли це сказано, це майже ідентична відповідь на ту, яку я нарешті дав своєму другові, тому я ціную ваше підтвердження - хоча мені все ще цікаво, чи є конкретні умови. Я дозволю трохи зупинитися на питанні, але, безумовно, прийму це як відповідь, якщо ці слова просто не існують.
Санті

2
У деяких мовах, таких як python, ви також можете мати класи, які змінюють себе - в той час як в деяких контекстах ця "виправлення мавп" у багатьох вважається хорошою справою, вона вважається "самомодифікуючим кодом" і забороняється. Ви також можете мати "еволюційний код", коли фрагменти коду випадковим чином "мутуються" та / або поєднуються, а потім тестуються та відбираються певним чином для "найкращого" виконання.
Стів Барнс

-1. Незалежно від того, чи є рядки змінні чи незмінні, це не має нічого спільного з функцією, яка працює на ньому. Функція не змінюється і не змінюється, вона не "повертається чи не встановлюється на місці". Функції можуть змінювати свої аргументи і все одно повертатися.
Майлз Рут

@MilesRout додав, що функції, що змінюють на місці, все ще повертаються, а деякі приклади C / C ++ для наочності плюс результати призводять до побічних ефектів для повноти.
Стів Барнс

4

Мій кращий спосіб виразити це:

  • Масив reverseметод мутує . Це мутатор . Поширений особливий випадок - це сетер .

  • Рядок replaceметод НЕ-Mutating . Це не мутатор . Якщо це не змінює нічого , це побічний ефект безкоштовно . Поширений особливий випадок - геттер .

  • Оскільки рядки JavaScript незмінні , струнні методи не можуть бути мутованими.

    "Hello World" .замінити ("Hello", "Goodbye");

    повинні зробити вам незручно. Він не змінює літеральний рядок. Це відкидає результат. Аналізатори статичного коду іноді можуть виявити такі помилки.

  • Оскільки масиви JavaScript є мутаційними , методи масиву можуть мутувати. JavaScript, як правило, використовує масиви як місцеві контейнери для зберігання, легко змінюються та нечасто копіюються.

2

Іноді, використовуючи в контексті чистого функціонального програмування, я чув функції, які змінюють вхідне значення (і, отже, не є чистими функціями), називаються руйнівними . Я не впевнений, чи це правильний термін.

У вашому випадку ви б сказали:

Ви повинні встановити рядок на "заміна точки рядка", оскільки функція заміни не є руйнівною .

Вам не потрібно встановлювати масив, рівний "array dot reverse", оскільки реверс є руйнівним .


1

Можливо, чистим є слово, яке ви шукаєте?

replace()чистий (або, здається, чистий), тому що він не схожий на те, що він має будь-які побічні ефекти (тобто, зміна рядка), тоді reverse()як нечистий, оскільки він змінює стан масиву.


Це пов'язана концепція, але також передбачає інші властивості (наприклад, не доступ до глобального стану та завжди даючи той самий вихід на один і той же вхід).
Яків Райхле

1

Зазвичай їх можна розділити на функції та методи (де методи - це підмножина функцій). Функція - це розділ коду, який можна викликати ізольовано, тоді як метод має концепцію поточного «контексту», на якому він працює. Дія методу змінює стан його контексту.

В об'єктно-орієнтованому програмуванні контекст - це екземпляр, над яким функціонує функція.


0

Я не знаю, що є офіційна відповідь, але ось два, що вам можуть сподобатися.

Порядок

Тільки тому, що це здавалося гарною відповіддю на це запитання , яке дуже схоже на ваше запитання BTW-- вам слід це перевірити.

Внутрішня операція

Перегляньте цю сторінку: java.util.function . Він надає свого роду складене ім’я для делегатів (підписи вводу / виводу) різних прототипів, наприклад, делегат, який бере аргументи і нічого не повертає, називається споживачем .

Тепер, як проникливий студент ООП, ви повинні знати, що метод - це лише функція, яка приймає прихований параметр ( this). Оскільки він подається в якості посилання, він служить і вхідним, і вихідним параметром.

Відповідно до цих хлопців Java (і вони здаються досить розумними), делегат, який приймає єдиний вхід і повертає значення одного типу, називається одинарним оператором .

Тепер у випадку array::Reverse()масив не є незмінним і потенційно може зайняти багато місця, тому ефективніше і зручніше виконувати операцію на місці. Тому Reverse()є єдиним оператором .

Але для мене "оператор" - це спеціальний символ (як оператор додавання, також відомий як +) або математичне ключове слово на зразок mod. Тому я вважаю за краще це називати операційним іоном , приводячи в дію одинарну роботу .


Ви змішуєте поняття. Reverse()не є оператором, унарний оператор не повинен повертати значення одного і того ж типу (наприклад !, delete, typeof), а оператори не є делегатами. Але "на місці" - це чіткий термін для методу, який модифікує його примірник. [Я не проголосував, але схоже, що хтось відповів усіма відповідями, хоча вони всі корисні.]
Jerry101

Не впевнений, що ви стежите. Будь-який прототип може бути представлений делегатом. "Оператор" не працює для мене (як я вже заявив), тому я кажу "Операція", і так, дійсно Reverse(), це неоднакова операція. Але в цілому я згоден, що це все трохи дивно, але я використовую дослівно термінологію з пов'язаного документа , який, схоже, є автором деяких досить розумних людей. Принаймні, це краще, ніж нічого.
Джон Ву

О Я бачу! Зауважте, що для вдосконалення лямбдів на Java вони побудували на ідеї функціонального інтерфейсу ( інтерфейс Java лише з 1 методом), щоб ми могли пройти навколо звичайних об’єктів Java та застосувати їх як "функції". (Брайан Гетц веде технічну розмову щодо додавання лямбда. Багато разів він каже, що "очевидний підхід би висмоктався".) При створенні функціональних інтерфейсів для обробних потоків об'єктів вони зловживають термінами типу "оператор". Це заплутано! Вони, мабуть, закінчилися добрими іменами. Я не думаю, що це гарне джерело термінів для методів OOP, які роблять / не змінюють об'єкт приймача.
Джеррі101
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.