Qual è il termine usato per descrivere una funzione / metodo che modifica l'oggetto su cui è chiamato?


12

Ci scusiamo per la domanda generica. Ho cercato dappertutto e ho trovato così tanti thread simili a questo, tuttavia nessuno dei quali risponde alla mia domanda specifica, forse perché il termine che sto cercando non esiste.

Un mio amico sta imparando la programmazione, in particolare JavaScript, e mi ha chiesto perché non funzionava:

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

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

Il motivo è perché replacenon si modifica a, poiché le stringhe sono immutabili in JavaSript. Perché restituisce una stringa, dovresti fare qualcosa come ...

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

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

Tuttavia, l'alternativa è una funzione come JavaScript reverse(), in quanto modifica qualunque cosa la chiami. Per esempio:

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

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

Quando il mio amico mi ha chiesto perché replacenon stava lavorando, mi sono reso conto che stavo cercando una parola che non conosco (per quanto ne so) ...

"Devi impostare la stringa su" stringa punto sostituisci ", perché la funzione di sostituzione è ________."

Non è necessario impostare un array uguale a "array dot reverse", poiché reverse è ________. "

Conosco le funzioni del prototipo anche se non credo che sia la parola che sto cercando. Qualcuno può aiutarmi a riempire questi spazi vuoti?


6
Forse la parola è "mutatore"? come in: You don't need to set an array equal to "array dot reverse", because reverse is a mutator function. Io penso che ho sentito dire che la terminologia di riferimento a funzioni che "mutare" l'istanza, che li chiama. Ma dovresti probabilmente ricontrollarlo da qualche altra parte.
FrustratedWithFormsDesigner

Apprezzalo! Ho appena letto dei metodi mutatori e penso che si adatta perfettamente a questa conversazione. Certamente nel regno di ciò che sto cercando.
Santi,

Sono confuso: nel titolo, si chiede su una funzione che modifica l'oggetto che lo ha chiamato, ma nel tuo esempi, vi mostrerà i metodi che modificano l'oggetto sono chiamati a , vale a dire l'esatto contrario del titolo. Quale dei due è?
Jörg W Mittag

Bene sicuramente quello spiegato in 30 righe di dettaglio. Modificherò il titolo per essere accurato, grazie per l'heads-up!
Santi,

Risposte:


12

La coppia di concetti che stai cercando sono parametri mutabili / immutabili e risultati sul posto / restituzione.

Nei tuoi esempi:

Devi impostare la stringa su "stringa punto sostituisci", perché la funzione di sostituzione opera su una stringa che, in Python, è immutabile, quindi la funzione di sostituzione restituisce una nuova stringa.

Per un programmatore C / C ++ questo è più familiare come parametri "passati per valore", piuttosto che "passati per riferimento", il che li rende immutabili e restituisce il risultato.

Non è necessario impostare un array uguale a "array dot reverse", poiché reverse opera su un array, che è mutabile , quindi è in grado di apportare modifiche sul posto prima di tornare.

In linguaggi come C / C ++ questo è noto come parametri "passati per riferimento", ovvero passando l'indirizzo che, se non modificato da const, consente alla funzione di cambiare, mutare , il contenuto di tale indirizzo alterando i risultati sul posto prima di tornare.

Naturalmente non è inusuale avere una funzione che restituisce risultati con entrambi i meccanismi, ad esempio int SomeFn(int p1, int p2, int *ErrCode)può potenzialmente restituire risultati sia nel valore di ritorno sia modificando il contenuto di ErrCode.

Un terzo metodo

Per completezza, un terzo meccanismo per la restituzione dei risultati è basato su effetti collaterali o globali , ovvero modifica dell'ambito del file, dell'intero programma, dei valori condivisi o ambientali. Questa è generalmente considerata una cattiva notizia in quanto, se non molto ben documentata, puoi scoprire cosa viene modificato solo leggendo attentamente il codice. In linguaggi come C / C ++ questo è fin troppo facile da fare avendo una variabile di ambito esterna con un determinato nome, possibilmente anche in un altro modulo, e senza mascherare la variabile di ambito locale con lo stesso nome. In Python, mentre puoi leggere i valori dei valori negli ambiti esterni, a meno che i valori degli ambiti esterni non siano esplicitamente impostati come disponibili per essere modificati conglobal parola chiave, tentando di modificare una variabile dell'ambito esterno crea automaticamente un locale con lo stesso nome.


Ah, ho familiarità con questi termini, anche se non ero sicuro che ci fosse una parola vera che descrive la funzione stessa . Come in (The reverse function is a _______ function.). Detto questo, questa è quasi una risposta identica a quella che ho finito per dare al mio amico, quindi apprezzo la tua conferma, anche se mi sto ancora chiedendo se ci sono termini specifici. Lascio che la domanda rimanga aperta per un po ', ma certamente accetterò questa come risposta nel caso in cui queste parole semplicemente non esistano.
Santi,

2
In alcuni linguaggi, come Python, puoi anche avere classi che si modificano da sole - mentre in alcuni contesti questo "rattoppare le scimmie" è considerato una buona cosa in molti è considerato "codice auto-modificante" ed è proibito. Puoi anche avere un "codice evolutivo" in cui i frammenti di codice vengono casualmente "mutati" e / o combinati, quindi vengono testati e selezionati per la "migliore" prestazione in qualche modo.
Steve Barnes

-1. Se le stringhe sono mutabili o immutabili non ha nulla a che fare con la funzione che vi sta operando. La funzione non è modificabile o immutabile e non è "ritorno o sul posto". Le funzioni possono modificare i loro argomenti e comunque tornare.
Miles Rout

@MilesRout ha aggiunto che le funzioni che si modificano sul posto ritornano ancora e alcuni esempi C / C ++ per chiarezza e risultati per effetti collaterali per completezza.
Steve Barnes,

4

Il mio modo preferito per esprimerlo è:

  • Il reversemetodo Array sta mutando . È un mutatore . Un caso speciale comune è un setter .

  • Il replacemetodo String non è mutante . Non è un mutatore . Se non modifica nulla , è privo di effetti collaterali . Un caso speciale comune è un getter .

  • Poiché le stringhe JavaScript sono immutabili , i metodi String non possono essere mutati.

    "Hello World" .replace ("Ciao", "Arrivederci");

    dovrebbe metterti a disagio. Non modifica una stringa letterale. Elimina il risultato. Gli analizzatori di codici statici possono talvolta rilevare tali bug.

  • Poiché le matrici JavaScript sono mutabili , i metodi di matrice possono essere mutanti. JavaScript tende a utilizzare gli array come contenitori di archiviazione locali, facilmente modificabili e raramente copiati.

2

A volte, quando utilizzato nel contesto della pura programmazione funzionale, ho sentito funzioni che modificano il valore di input (e quindi non sono pure funzioni) chiamate distruttive . Non sono sicuro però che questo sia il termine corretto.

Nel tuo caso, diresti:

Devi impostare la stringa su "stringa punto sostituisci", perché la funzione di sostituzione non è distruttiva .

Non è necessario impostare un array uguale a "array dot reverse", poiché reverse è distruttivo .


1

Forse pura è la parola che stai cercando?

replace()è (o sembra essere) puro perché non sembra avere effetti collaterali (ovvero la modifica della stringa) mentre reverse()è impuro perché modifica lo stato dell'array.


È un concetto correlato, ma implica anche altre proprietà (ad esempio, non accedere allo stato globale e produrre sempre lo stesso output per lo stesso input).
Jacob Raihle

1

Questi di solito sarebbero separati in funzioni e metodi (dove i metodi sono un sottoinsieme di funzioni). Una funzione è una sezione di codice che può essere chiamata in modo isolato, mentre un metodo ha il concetto di un 'contesto' corrente su cui opera. L'azione di un metodo cambia lo stato del suo contesto.

Nella programmazione orientata agli oggetti, il contesto è l'istanza su cui opera la funzione.


0

Non so che esiste una risposta ufficiale, ma eccone due che potrebbero piacerti.

Procedura

Solo perché sembrava una buona risposta a questa domanda , che assomiglia molto alla tua domanda BTW-- dovresti dare un'occhiata.

Operazione unaria sul posto

Rivedi questa pagina: java.util.function . Fornisce una sorta di nome inventato per i delegati (firme di input / output) di vari prototipi, ad esempio un delegato che accetta un argomento e non restituisce nulla che si chiama consumatore .

Ora, come studente astuto di OOP, dovresti essere consapevole che un metodo è solo una funzione che accetta un parametro nascosto ( this). Poiché viene fornito come riferimento, funge sia da parametro di input che da parametro di output.

Secondo questi ragazzi di Java (e sembrano piuttosto intelligenti), un delegato che accetta un singolo input e restituisce un valore dello stesso tipo è chiamato operatore unario .

Nel caso di array::Reverse(), un array non è immutabile e può potenzialmente occupare molto spazio, quindi è più efficiente e conveniente eseguire l'operazione sul posto. Pertanto Reverse()è un operatore unario sul posto .

Ma per me un "operatore" è un simbolo speciale (come l'operatore addizione, noto anche come +) o una parola chiave matematica come mod. Perciò io preferisco chiamarlo un operat ioni , cedendo sul posto operazione unaria .


Stai mescolando concetti. Reverse()non è un operatore, un operatore unario non deve restituire un valore dello stesso tipo (ad esempio !, delete, typeof), e gli operatori non sono delegati. Ma "sul posto" è un termine eccellente per un metodo che modifica la sua istanza. [Non ho votato verso il basso, ma sembra che qualcuno abbia votato in
negativo

Non sono sicuro di seguire. Qualsiasi prototipo può essere rappresentato da un delegato. "Operatore" non funziona per me (come ho detto), quindi dico "Operazione" e sì, in effetti, Reverse()è un'operazione unaria. Ma nel complesso concordo sul fatto che sia tutto un po 'strano, ma sto usando alla lettera la terminologia del documento collegato , che sembra essere stato creato da alcune persone piuttosto intelligenti. Almeno è meglio di niente.
John Wu,

Oh, capisco! Si noti che per adeguare lambda in Java, si sono basati sull'idea di un'interfaccia funzionale (un'interfaccia Java con solo 1 metodo) in modo da poter passare intorno agli oggetti Java ordinari da applicare come "funzioni". (Brian Goetz parla in modo tecnico sull'aggiunta di lambda. Più volte afferma che "l'approccio ovvio sarebbe stato succhiato"). Quando creano interfacce funzionali per l'elaborazione di oggetti in streaming, fanno uso di termini abusati come "operatore". È confuso! Devono essere a corto di buoni nomi. Non penso che sia una buona fonte di termini per i metodi OOP che modificano / non modificano l'oggetto ricevitore.
Jerry101
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.