Aquí hay un problema de programación / lenguaje en el que me gustaría escuchar sus pensamientos.
Hemos desarrollado convenciones que la mayoría de los programadores (deberían) seguir que no son parte de la sintaxis de los lenguajes pero sirven para hacer que el código sea más legible. Por supuesto, estos son siempre un tema de debate, pero hay al menos algunos conceptos básicos que la mayoría de los programadores encuentran agradables. Nombra tus variables apropiadamente, nombra en general, hace que tus líneas no sean exageradamente largas, evitando funciones largas, encapsulaciones, esas cosas.
Sin embargo, hay un problema que todavía no he encontrado a nadie comentando y que podría ser el más grande del grupo. Es el problema de que los argumentos sean anónimos cuando se llama a una función.
Las funciones provienen de las matemáticas donde f (x) tiene un significado claro porque una función tiene una definición mucho más rigurosa que la que suele tener en la programación. Las funciones puras en matemáticas pueden hacer mucho menos de lo que pueden hacer en programación y son una herramienta mucho más elegante, generalmente solo toman un argumento (que generalmente es un número) y siempre devuelven un valor (también generalmente un número). Si una función toma múltiples argumentos, casi siempre son solo dimensiones adicionales del dominio de la función. En otras palabras, un argumento no es más importante que los otros. Están ordenados explícitamente, claro, pero aparte de eso, no tienen un orden semántico.
Sin embargo, en programación, tenemos más funciones que definen la libertad, y en este caso diría que no es algo bueno. Una situación común, tienes una función definida como esta
func DrawRectangleClipped (rectToDraw, fillColor, clippingRect) {}
Mirando la definición, si la función está escrita correctamente, está perfectamente claro qué es qué. Al llamar a la función, incluso podría tener algo de magia de finalización de código / intellisense en su IDE / editor que le dirá cuál debería ser el siguiente argumento. Pero espera. Si necesito eso cuando estoy escribiendo la llamada, ¿no hay algo que nos falta aquí? La persona que lee el código no tiene el beneficio de un IDE y, a menos que salte a la definición, no tiene idea de cuál de los dos rectángulos pasados como argumentos se utiliza para qué.
El problema va más allá que eso. Si nuestros argumentos provienen de alguna variable local, puede haber situaciones en las que ni siquiera sabemos cuál es el segundo argumento, ya que solo vemos el nombre de la variable. Tome por ejemplo esta línea de código
DrawRectangleClipped(deserializedArray[0], deserializedArray[1], deserializedArray[2])
Esto se alivia en diversos grados en diferentes idiomas, pero incluso en lenguajes estrictamente tipados e incluso si nombra sus variables con sensatez, ni siquiera menciona el tipo que es la variable cuando la pasa a la función.
Como suele ocurrir con la programación, hay muchas posibles soluciones a este problema. Muchos ya están implementados en idiomas populares. Parámetros con nombre en C #, por ejemplo. Sin embargo, todo lo que sé tiene inconvenientes significativos. Nombrar cada parámetro en cada llamada de función no puede conducir a un código legible. Casi parece que tal vez estamos superando las posibilidades que nos brinda la programación de texto sin formato. Nos hemos movido de SOLO texto en casi todas las áreas, pero todavía codificamos lo mismo. ¿Se necesita más información para que se muestre en el código? Agrega más texto. De todos modos, esto se está volviendo un poco tangencial, así que me detendré aquí.
Una respuesta que obtuve al segundo fragmento de código es que probablemente primero desempaquetarás la matriz en algunas variables con nombre y luego las usarás, pero el nombre de la variable puede significar muchas cosas y la forma en que se llama no necesariamente te dice la forma en que se supone que debe hacerlo. ser interpretado en el contexto de la función llamada. En el ámbito local, es posible que tenga dos rectángulos llamados leftRectangle y rightRectangle porque eso es lo que representan semánticamente, pero no necesita extenderse a lo que representan cuando se asigna a una función.
De hecho, si sus variables se nombran en el contexto de la función llamada, entonces está introduciendo menos información de la que potencialmente podría con esa llamada de función y, en algún nivel, si conduce a un código peor. Si tiene un procedimiento que da como resultado un rectángulo que almacena en rectForClipping y luego otro procedimiento que proporciona rectForDrawing, entonces la llamada real a DrawRectangleClipped es solo una ceremonia. Una línea que no significa nada nuevo y está ahí solo para que la computadora sepa exactamente lo que quieres, aunque ya lo hayas explicado con tu nombre. Esto no es algo bueno.
Realmente me encantaría escuchar nuevas perspectivas sobre esto. Estoy seguro de que no soy el primero en considerar esto un problema, entonces, ¿cómo se resuelve?