que - coldfusion tutorial español
¿Por qué los diseñadores de ColdFusion decidieron indexar arrays desde 1 en lugar de 0? (10)
Bueno, a menos que tengamos a alguno de los diseñadores originales, va a ser difícil hacer otra cosa que especular. Pero después de haber usado CF en una vida anterior, tengo algunas ideas.
Si observa el idioma original, fue diseñado para el desarrollo de tipo RAD para las personas que querían crear aplicaciones dinámicas sin mucha complejidad. Aún recuerdo la alegría cuando finalmente lanzaron las Funciones definidas por el usuario, así que no tuve que usar etiquetas en todas partes.
Basado en eso, entonces tendría sentido que aspectos del lenguaje con los que las personas tuvieran que lidiar, como arreglos, hicieran más "amigables". Para mí, ver array [0] tiene perfecto sentido. Pero para las personas nuevas en el paradigma que no han aprendido eso, no tendría ningún sentido. ¿Por qué debería acceder a un objeto en la posición "0"?
Lo curioso es que ahora que CF es Java en el backend, en realidad tiene que lidiar con casos en los que su índice comienza en 1 y en los casos en que comienza en 0. Entonces, al tratar de ser útil, en realidad agregaron más complejidad como el idioma ha crecido
Tengo curiosidad sobre esto realmente, ¿alguien sabe por qué rompieron la convención en este caso?
Gracias, Ciaran
Cuente la cantidad de dedos que tiene en una mano. ¿Empezaste a contar con 0 o con 1?
Las ideas abstractas que coinciden estrechamente con la vida real siempre se entienden y aplican con mayor facilidad (por ejemplo, piense en una "pila" física y luego en la estructura de datos abstracta).
Hay dos convenciones, la común a la mayoría de los lenguajes de programación, y la común a la mayoría de los no programadores. Probablemente estaban apuntando a las personas que no comienzan a contar con 0.
Incluso dentro del mundo de programación de las API de Java, existe una excepción interesante, el recuento basado en 0: la API de JDBC. Comienza a contar con 1, para sorpresa de cada programador que hace su primer acceso a la base de datos.
No hay convención sobre el punto de partida de una matriz. La mayoría de los conceptos básicos comienzan en 1 también, por ejemplo. Algunos idiomas le permiten iniciar la matriz donde lo desee, o permitir que los índices de asignación sean enumeraciones, etc. (Ada, por ejemplo). C usó la noción de aguijón en 0 y muchos idiomas siguieron, pero no todos lo hacen. Una razón por la que no lo hacen es que las matrices que comienzan en 1 son mucho más intuitivas.
Si tuviera que adivinar, es porque ColdFusion estaba destinado a atraer al principiante, y las matrices basadas en 1 podrían tener más sentido: el primer elemento es el número 1, el segundo es el número 2, etc.
¡Somos nosotros los informáticos que somos raros!
La idea de iniciar matrices en 0 se popularizó con el lenguaje C. Los lenguajes antiguos como FORTRAN y COBOL empezaron a contar matrices en 1 (en realidad denominadas tablas en COBOL).
Como un giro diferente en él, preguntémonos por qué en algunos idiomas el índice de la matriz comienza en cero. Para contar objetos discretos (como elementos de matriz), esto tiene poco sentido y no es natural desde una perspectiva humana.
Esto originalmente parecía provenir de lenguajes como C (aunque no sugiero que surgió por primera vez en C: no sé, y no importa a los efectos de esto) en el que el lenguaje y su programación es bastante estrecha acoplado a la gestión de la memoria ( malloc
, etc.). Algunos conceptos del lenguaje C se corresponden bastante con lo que está pasando en la memoria debajo del capó. Las variables son un ejemplo de esto: así como los nombres de variables, siempre nos ocupamos de la dirección de memoria en la que la variable está (o comienza ) con punteros y demás.
Así que llegamos a las matrices en C, y están indexadas de tal manera que hay una serie de elementos que residen en la memoria, comenzando en la ubicación de la memoria base de la variable de matriz, y cada elemento se compensa con el tamaño del tipo de datos (por ejemplo: un char es un byte, etc.). Entonces, para encontrar cada elemento en la matriz en la memoria, hacemos esto:
arrayBaseAddress + (whichElementItIsInTheArray * sizeOfDataType)
Y uno realmente se encuentra a sí mismo pensando así cuando hace cosas en C, ya que mapea bastante de cerca lo que la computadora tiene que hacer debajo del capó para encontrar el valor que el código quiere.
Entonces, whichElementItIsInTheArray
se usa para compensar la dirección de memoria (en unidades de sizeOfDataType
).
Obviamente, si uno inicia el índice de matriz en 1, se compensaría en la memoria con un sizeOfDataType
, a todos los efectos, desperdiciando una cantidad de memoria arrayBaseAddress
entre el arrayBaseAddress
y donde reside realmente el primer elemento.
Uno podría pensar que esto apenas importa, pero en días pasados, cuando todo esto se estaba implementando, la memoria era como el oro: no podía desperdiciarse de esa manera. Así que uno podría pensar "OK, bueno, simplemente compensar el whichElementItIsInTheArray
de whichElementItIsInTheArray
por -1 y terminarlo. Sin embargo, al igual que la memoria, los ciclos del reloj eran dorados, así que en lugar de perder el procesamiento, la idea era que el programador solo tendría que acostumbrarse a una forma antinatural de contar.
Entonces, había una razón legítima para iniciar matrices en el índice cero en estas situaciones.
Me parece (y esto está entrando en la tendencia editorial ahora) cuando aparecieron los siguientes lenguajes de "llaves" (como Java), simplemente siguieron el ejemplo de si realmente era relevante o no, porque "así es como se hace". En lugar de "de esa manera tiene sentido".
Por otro lado, idiomas más modernos, y más alejados del funcionamiento interno de la computadora, alguien se detuvo a pensar "¿por qué estamos haciendo esto?", Y "en el contexto de este lenguaje y sus usos previstos, ¿esto hace ¿sentido?". Estoy de acuerdo aquí que la respuesta es - firmemente - "no". El desperdicio de recursos para compensar el índice de matriz por -1, o simplemente ignorar la memoria del elemento zeroth ya no es una consideración relevante en muchas circunstancias. Entonces, ¿por qué hacer que el lenguaje y el programador tengan que compensar la forma en que cuentan las cosas de una en una, por una razón puramente heredada? No hay una razón legítima para hacerlo.
En C, hay un elemento de una matriz a[0]
. Este es el primer elemento de la matriz (no el elemento "zeroth"), y si esa es la extensión total de la matriz, su longitud es uno . Entonces, el comportamiento idiosincrático aquí es de parte del lenguaje de programación, no de la forma en que se cuentan / enumeran las cosas "en la vida real" (que es donde reside la mayoría de nosotros). Entonces, ¿por qué persistir con eso?
Algunas personas aquí han contrarrestado este argumento de "dónde comenzar el índice" con "bueno, cuando nacemos, no somos UNO, estamos CERO". Esto es cierto, pero eso es una medida continua, y no es lo mismo. Entonces es irrelevante para la conversación. Una matriz es una colección de elementos discretos, y al medir la cantidad de elementos discretos (es decir, contarlos), comenzamos en uno.
¿Cómo se agrega esto a la conversación? Bueno, no es mucho, pero es una forma diferente de ver lo mismo. Y supongo que es un poco de racionalización / reacción a esta noción que algunas personas tienen de que los índices de matriz iniciales en 1 son de alguna manera "incorrectos". No está mal, desde una perspectiva humana es más correcto que comenzar en cero. Así que deje que el ser humano escriba el código como lo haría un ser humano, y haga que la máquina le dé sentido como lo necesita. Básicamente es solo por las limitaciones tecnológicas heredadas que comenzamos a contar desde cero en primer lugar, y no hay necesidad de perpetuar esa práctica si ya no es necesario.
Todo "IMO", por supuesto.
@Cory: te sorprendería saber quién acecha en . :-)
Tienes mucha razón. El diseño original de CFML era permitir que los no programadores construyeran aplicaciones web complejas. ColdFusion / CFML fue el primer lenguaje diseñado específicamente para crear aplicaciones web. En 1995, la web era en su mayoría estática HTML y su típico "desarrollador web" no estaba haciendo demasiada programación. El lenguaje en sí fue diseñado para ser lo más simple posible, razón por la cual sigue siendo uno de los idiomas más rápidos / fáciles de aprender.
Puede causar confusión, especialmente cuando el código de ColdFusion interactúa directamente con Java o .NET. Sin embargo, se ha convertido en uno de esos "caprichos". La decisión fue revisada nuevamente en 2000/2001 cuando CF fue reconstruida como una aplicación Java EE, pero la compatibilidad con versiones anteriores impidió el cambio.
Tal vez no fue solo cosa de un lego ... Creo que la mayoría de las personas que se acercan a cualquier lenguaje web al menos han jugueteado con javascript (y lo mismo ocurrió hace 10,15 años). Los índices basados en 0 no eran tan extraños.
Lo que más me gusta de los lenguajes que inician índices / posiciones (para cadenas) en 1 es que puedes hacer cosas como
<cfif find("c","cat")>
que evalúa true
si se encuentra c, y lo será.
mientras que un lenguaje basado en 0 como javascript
if ("cat".indexOf("c")) {
evalúa como false
, por lo que debe decir algo como if ("cat".indexOf("c") >= 0) {
Sin embargo, traducir entre idiomas es una molestia menor que no debe olvidarse, porque olvidarse de hacerlo u olvidarse de rellenar sus matrices puede llevar a una falla en la traducción de datos, y el cambio entre los dos estilos puede llevar a la frustración.
Creo que, si Allaire hubiera sabido dónde estaría la web eventualmente y cómo el cliente y el servidor realmente pueden trabajar juntos, tendríamos índices basados en 0.