¿Cuál es el término utilizado para describir una función / método que modifica el objeto al que se llama?

12

Perdón por la pregunta genérica. He buscado por todas partes y he encontrado tantos hilos similares a este, sin embargo, ninguno que responda a mi pregunta específica, tal vez porque el término que estoy buscando ni siquiera existe.

Un amigo mío está aprendiendo programación, específicamente JavaScript, y me preguntó por qué esto no estaba funcionando:

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

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

La razón es porque replaceno se modifica a, ya que las cadenas son inmutables en JavaSript. Becuase que devuelve una cadena, que había necesidad de hacer algo así ...

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

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

Sin embargo, la alternativa es una función como la de JavaScript reverse(), ya que modifica lo que sea que la llame. Por ejemplo:

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

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

Cuando mi amigo me preguntó por qué el suyo replaceno funcionaba, me di cuenta de que estaba buscando una palabra que no sé (que yo sepa) ...

"Debe establecer la cadena en" reemplazo de punto de cadena ", porque la función de reemplazo es ________."

No es necesario establecer una matriz igual a "matriz de puntos inversa", porque la inversa es ________.

Estoy familiarizado con las funciones del prototipo , aunque no creo que esa sea la palabra que estoy buscando. ¿Alguien puede ayudarme a completar estos espacios en blanco?

Santi
fuente
66
Tal vez la palabra es "mutador"? como en: You don't need to set an array equal to "array dot reverse", because reverse is a mutator function. Yo creo que he oído que la terminología para referirse a las funciones que "mutar" la instancia que les llama. Pero probablemente deberías volver a verificar eso en otro lugar.
FrustratedWithFormsDesigner
¡Lo aprecio! Acabo de leer un poco sobre los métodos de mutación y creo que definitivamente encaja bastante bien en esta conversación. Ciertamente en el ámbito de lo que estoy buscando.
Santi
Estoy confundido: en el título, le preguntas acerca de una función que modifica el objeto que lo llamó, pero en sus ejemplos, se muestran los métodos que modifican el objeto se les llama en , es decir, exactamente lo contrario del título. ¿Cuál de los dos es?
Jörg W Mittag
Bueno, seguramente el explicado en 30 líneas de detalle. Modificaré el título para que sea preciso, ¡gracias por el aviso!
Santi

Respuestas:

12

El par de conceptos que está buscando son parámetros mutables / inmutables y resultados in situ / devueltos.

En tus ejemplos:

Debe establecer la cadena en "string dot replace", porque la función de reemplazo opera en una cadena que, en python, es inmutable, por lo que la función de reemplazo devuelve una nueva cadena.

Para un programador de C / C ++, esto es más familiar como parámetros "pasados ​​por valor", en lugar de "pasados ​​por referencia", lo que los hace inmutables y devuelve el resultado.

No es necesario establecer una matriz igual a "matriz de puntos inversa", porque la inversa opera en una matriz, que es mutable , por lo que puede realizar cambios en el lugar antes de regresar.

En lenguajes como C / C ++, esto se conoce como parámetros "pasados ​​por referencia", es decir, pasar la dirección que, si no es modificada por const, permite que la función cambie, mute , los contenidos de esa dirección alteran los resultados en el lugar antes de regresar.

Por supuesto, no es inusual tener una función que devuelva resultados por ambos mecanismos, por ejemplo int SomeFn(int p1, int p2, int *ErrCode), puede, potencialmente devolver resultados tanto en el valor de retorno como modificando el contenido de ErrCode.

Un tercer método

Para completar, un tercer mecanismo para devolver resultados es por efecto secundario o global , es decir, modificar el alcance del archivo, todo el programa, valores compartidos o ambientales. En general, esto se considera una mala noticia , ya que, a menos que esté muy bien documentado, solo puede averiguar qué se está cambiando mediante una lectura cuidadosa del código. En lenguajes como C / C ++, esto es demasiado fácil de hacer teniendo una variable de alcance externo con un nombre dado, posiblemente incluso en otro módulo, y sin enmascarar la variable de alcance local del mismo nombre. En Python, si bien puede leer los valores de los valores en ámbitos externos, a menos que los valores de ámbito externo se establezcan explícitamente como disponibles para ser modificados conglobal palabra clave, al intentar modificar una variable de ámbito externo crea automáticamente un local con el mismo nombre.

Steve Barnes
fuente
Ah, estoy familiarizado con estos términos, aunque no estaba seguro de si había una palabra real que describiera la función en sí . Como en (The reverse function is a _______ function.) Dicho esto, esta es una respuesta casi idéntica a la que terminé dando a mi amigo, así que agradezco su confirmación, aunque todavía me pregunto si hay términos específicos. Dejaré que la pregunta permanezca abierta por un tiempo, pero ciertamente aceptaré esto como la respuesta en caso de que estas palabras simplemente no existan.
Santi
2
En algunos lenguajes, como python, también puede tener clases que se modifiquen a sí mismas, mientras que en algunos contextos este "parche de mono" se considera algo bueno en muchos, se considera "código auto modificable" y está prohibido. También puede tener un "código evolutivo" donde los fragmentos de código son aleatoriamente "mutados" y / o combinados, luego se prueban y seleccionan para obtener el "mejor" rendimiento de alguna manera.
Steve Barnes
-1. Si las cadenas son mutables o inmutables no tiene nada que ver con la función que está operando en él. La función no es mutable o inmutable, y no es "retornada o in situ". Las funciones pueden modificar sus argumentos y aún regresar.
Miles Rout
@MilesRout agregó que las funciones que se modifican en su lugar aún regresan y algunos ejemplos de C / C ++ para mayor claridad y resultados por efectos secundarios para completar.
Steve Barnes
4

Mi forma preferida de expresarlo es:

  • El reversemétodo de matriz es mutante . Es un mutador . Un caso especial común es un setter .

  • El replacemétodo de cadena no es mutante . No es un mutador . Si no modifica nada , está libre de efectos secundarios . Un caso especial común es un captador .

  • Dado que las cadenas de JavaScript son inmutables , los métodos de cadena no pueden mutar.

    "Hello World" .replace ("Hola", "Adiós");

    debería hacerte sentir incómodo. No modifica un literal de cadena. Descarta el resultado. Los analizadores de código estático a veces pueden detectar tales errores.

  • Dado que las matrices de JavaScript son mutables , los métodos de matriz pueden mutar. JavaScript tiende a utilizar matrices como contenedores de almacenamiento local, fácilmente modificables y copiados con poca frecuencia.
Jerry101
fuente
2

A veces, cuando se usa en el contexto de la programación funcional pura, he escuchado funciones que modifican el valor de entrada (y por lo tanto no son funciones puras) llamadas destructivas . Sin embargo, no estoy seguro de si este es el término correcto.

En su caso, diría:

Debe establecer la cadena en "reemplazo de punto de cadena", porque la función de reemplazo no es destructiva .

No necesita establecer una matriz igual a "matriz de puntos inversa", porque la inversa es destructiva .

Challenger5
fuente
1

¿Tal vez pura es la palabra que estás buscando?

replace()es (o parece ser) puro porque no parece tener ningún efecto secundario (es decir, modificar la cadena) mientras que reverse()es impuro porque cambia el estado de la matriz.

Kyle Rush
fuente
Es un concepto relacionado, pero también implica otras propiedades (por ejemplo, no acceder al estado global y siempre producir la misma salida para la misma entrada).
Jacob Raihle
1

Estos generalmente se separarían en funciones y métodos (donde los métodos son un subconjunto de funciones). Una función es una sección de código que se puede llamar de forma aislada, mientras que un método tiene un concepto de un 'contexto' actual en el que opera. La acción de un método cambia el estado de su contexto.

En la programación orientada a objetos, el contexto es la instancia en la que opera la función.

richzilla
fuente
0

No sé si hay una respuesta oficial, pero aquí hay dos que te pueden gustar.

Procedimiento

Solo porque parecía una buena respuesta a esta pregunta , que se parece mucho a tu pregunta, por cierto, deberías echarle un vistazo.

Operación unaria en el lugar

Revise esta página: java.util.function . Proporciona una especie de nombre inventado para los delegados (firmas de entrada / salida) de varios prototipos, por ejemplo, un delegado que toma un argumento y no devuelve nada se llama consumidor .

Ahora, como estudiante astuto de OOP, debe saber que un método es solo una función que toma un parámetro oculto ( this). Como se proporciona como referencia, sirve como parámetro de entrada y de salida.

Según estos chicos de Java (y parecen bastante inteligentes), un delegado que acepta una sola entrada y devuelve un valor del mismo tipo se llama operador unario .

Ahora, en el caso de array::Reverse(), una matriz no es inmutable y potencialmente puede ocupar mucho espacio, por lo que es más eficiente y conveniente realizar la operación en el lugar. Por Reverse()lo tanto, es un operador unario en el lugar .

Pero para mí, un "operador" es un símbolo especial (como el operador de suma, también conocido como +) o una palabra clave matemática como mod. Por tanto, yo prefiero llamarlo una operac iones , produciendo en el lugar operación singular .

John Wu
fuente
Estás mezclando conceptos. Reverse()no es un operador, un operador unario no tiene que devuelve un valor del mismo tipo (por ejemplo !, delete, typeof), y los operadores no son delegados. Pero "in situ" es un buen término para un método que modifica su instancia. [No voté en contra, pero parece que alguien votó en contra de todas las respuestas a pesar de que todas son útiles.]
Jerry101
No estoy seguro de que lo sigas. Cualquier prototipo puede ser representado por un delegado. "Operador" no funciona para mí (como dije), así que digo "Operación", y sí, de hecho, Reverse()es una operación unaria. Pero, en general, estoy de acuerdo en que todo esto es un poco extraño, pero estoy usando textualmente la terminología del documento vinculado , que parece haber sido escrito por algunas personas bastante inteligentes. Al menos es mejor que nada.
John Wu
¡Oh ya veo! Tenga en cuenta que para adaptar lambdas a Java, se basaron en la idea de una interfaz funcional (una interfaz Java con solo 1 método) para que podamos pasar objetos Java comunes para aplicarlos como "funciones". (Brian Goetz tiene una charla técnica sobre la adición de lambdas. Varias veces dice "el enfoque obvio hubiera sido un asco"). Al crear interfaces funcionales para procesar objetos, procesan términos como "operador". Eso es confuso! Deben haberse quedado sin buenos nombres. No creo que sea una buena fuente de términos para los métodos OOP que modifican / no modifican el objeto receptor.
Jerry101