Acabo de encontrar esta función en el proyecto en el que estoy trabajando:
-- Just returns the text unchanged.
-- Note: <text> may be nil, function must return nil in that case!
function Widget:wtr(text)
return text
end
Demasiado triste, el codificador ya no trabaja en la empresa. ¿Por qué uno haría una función que no hace nada, pero devuelve el parámetro con el que se llama?
¿Hay algún uso de dicha función, no especificado en este ejemplo, pero en general en cualquier caso?
Debido a
function aFunction(parameter)
return parameter
end
Termina en
aFunction(parameter) == parameter
¿Por qué escribiría algo como
aFunction(parameter) == whatIWantToCheck
en lugar de
parameter == whatIWantToCheck
?
functions
parameters
lua
method-chaining
Sempie
fuente
fuente
this
.int getParam(int param) { //DO NOTHING return param; }
Desde una perspectiva de encadenamiento de métodos, es una llamada completamente redundante e innecesaria, ya que puede dejar la función del OP fuera de una cadena de métodos y no haría una sola diferencia.new Foo()->method();
no era una sintaxis válida yfunction with($what) { return $what; }; with(new Foo())->method();
se usaban construcciones similares como solución alternativa.Respuestas:
Su pregunta es como preguntar cuál es el bien del número cero si cada vez que lo agrega a algo obtiene el mismo valor. Una función de identidad es como el cero para funciones. Un poco inútil por sí mismo, pero ocasionalmente útil como parte de una expresión que utiliza funciones de orden superior, donde puede tomar una función como parámetro o devolverla como resultado. Es por eso que la mayoría de los lenguajes de programación funcionales tienen una
id
oidentity
en su biblioteca estándar.Dicho de otra manera, tiene una práctica función predeterminada. Al igual que es posible que desee establecer
offset = 0
como un entero predeterminado, aunque eso haga que un desplazamiento no haga nada, puede ser útil poder establecerlofilterFunction = identity
como una función predeterminada, aunque eso haga que el filtro no haga nada.fuente
filter
función de orden superior. Una función de primer ordenfilter
tiene el tipo[a] -> [a]
,.OrderBy(x => x)
Seguro. Imagine una API externa que le permita recuperar cosas de un lugar absolutamente necesario, pero debe especificar criterios de filtro y formateadores de salida para cada consulta, incluso si desea todos los resultados y desea obtenerlos exactamente como están almacenados.
Entonces tendrías que inventar una función trivial de "aceptar todo" y una función trivial de "devolver sin cambios" para obtener los datos.
wtr
es precisamente un pseudoformateador tan trivial. Si usa mucho esa API, puede ser muy útil tener esta función de pseudo-ayudante en lugar de tener que crear una función anónima cada vez que consulta algo. (Puede considerar llamarlo enidentity
lugar de hacerlowtr
para que quede claro de inmediato que no hace nada).fuente
null
como argumento, use una función de filtro vacía que filtre con 'nada' para que el programa deje de quejarse.WHERE
cláusula? Eso es una cuestión de azúcar sintáctica. Esencialmente, la ausencia de unaWHERE
cláusula es exactamente la misma que si tuviera unaWHERE
cláusula que simplemente sigue adelante y permite todo. El hecho de que los diseñadores de SQL no le permitan especificar unaWHERE
cláusula, en lugar de obligarlo a dejar una, incluso cuando acepta todo, es más o menos azúcar sintáctica, y simplemente le han brindado esa opción para mayor comodidad. ..¿No es eso solo un polimorfismo?
Desde mi experiencia con Qt
tr()
ywtr()
se supone que los métodos deben usarse (allí, en Qt ) en la localización delWidget
texto de.Por lo tanto, mediante la devolución de texto sin cambios este método se limita a decir:
Widget does no localization (translation of the text) by default. Override this function to enable your own logic
.fuente
Un caso muy común para esto es la "funcionalidad añadida más tarde". Entonces el programador pensó que podría haber algún cambio en esa función más adelante. Dado que accede a él como una función y no como el parámetro en sí mismo, puede cambiarlo globalmente fácilmente. Digamos que tiene un índice con:
y como su índice comienza en 0, todo está bien. Más tarde, cambia un componente en otro lugar, este componente necesita traducir su índice para comenzar en 1. Tendría que agregar cientos de índice + 1 en todas partes en su código. Pero con un método como este, simplemente diga:
Y estás bien. Funciones como esta pueden conducir rápidamente a una ingeniería excesiva, pero en algunos puntos tienen mucho sentido.
fuente
Las funciones de código auxiliar como este son comunes en situaciones de herencia de tipos. La clase base puede no hacer nada útil, pero las clases derivadas pueden hacer varias cosas con las entradas. La declaración de la función stub en la clase base permite que todas las clases derivadas tengan una función de ese nombre, y las clases derivadas individuales la anulan con algo más elaborado y útil.
fuente
Un escenario adicional es similar al uso en Python y C # de propiedades, pero en lenguajes que no tienen la característica.
En general, puede declarar algo solo como un miembro de la clase; digamos 'nombre' como una cadena. Esto significa que tiene acceso de esta manera:
Más tarde, decide que el nombre realmente debe depender de lo que hay en el objeto. Por lo tanto, realmente debería ser una función. ¡Uy! Incluso sin argumentos, eso significa que todo el código que accede ahora debe cambiarse a
Pero si tiene muchas instancias de esta llamada, las posibilidades de que nada salga mal son bastante bajas: en algún lugar este cambio no se realizará, el programa se bloqueará cuando llegue a ese punto, etc.
Las propiedades en C # / Python le permiten sustituir una función por lo que solía ser un atributo, al tiempo que le permite acceder como un atributo, es decir, sin cambios. Ni siquiera tiene que haber planeado con anticipación.
Si su idioma no tiene eso, tiene que planificar con anticipación, pero aún puede apoyarlo de la manera en que la gente lo hacía antes al convertirlo en una función desde el principio que no haga nada. Al principio, no hará nada interesante, y parece que debería eliminarse, y muchas funciones de este tipo nunca cambian. Pero más tarde, si te das cuenta de que realmente cada vez que llamas
Widget.wtr
necesitas eliminar algunos caracteres especiales, no es gran cosa, ya es una función, solo tienes que agregar eso y listo.TL; DR Esto podría ser un programador inteligente que planifica con anticipación para futuros cambios.
fuente
print data
. Luego, más tarde, te das cuenta de que todas las cadenas tienen que estar en mayúsculas: tendrías que buscar cada impresión en tu programa y cambiar aprint data.upper()
. Pero si tienedef cdata(data): return data
y dice en todas partesprint cdata(data)
, entonces simplemente cambiadef cdata(data): return data.upper()
y es el único cambio.No es inútil, en realidad puede ser extremadamente útil, porque hace que su código sea más uniforme y flexible.
Digamos, por ejemplo, que tiene una lista de personas y un menú desplegable para que el usuario seleccione si queremos ver "todos" o solo aquellos que son "masculinos" o "femeninos".
Puede manejar "todos" como un caso especial, en cuyo caso necesitará un if adicional para verificar este caso explícitamente, o puede tener una función de filtro que solo devuelva su parámetro (por ejemplo, permite que todo pase), asignado para ser utilizado para el caso "todos".
fuente
Filter
clase o interfaz conMaleFilter
yFemaleFilter
subclases, y su código requiere algún filtro, un filtro que no hace nada (devuelve su parámetro sin cambios) es la forma en que manejaAll
. La función nunca hace nada, pero puede sustituirse por una que sí lo haga.