17

duplicados posibles:
Is there any advantage of being a case-sensitive programming language?
Why are many languages case sensitive?¿Cuál es el propósito de la distinción entre mayúsculas y minúsculas en los idiomas?

algo que siempre me he preguntado, ¿por qué se están diseñados para ser lenguas entre mayúsculas y minúsculas?

Mi cerebro de guisante no puede comprender ninguna posible razón de por qué es útil.

Pero estoy seguro de que hay uno por ahí. Y antes de que nadie lo diga, tener una variable llamada dog y Dog diferenciada por sensibilidad de mayúsculas y minúsculas es realmente una mala práctica, ¿verdad?

¡Cualquier comentario apreciado, junto con quizás cualquier historia sobre el asunto! En general, soy insensible a la sensibilidad a las mayúsculas y minúsculas, pero soy sensible a la sensibilidad en torno a la distinción de mayúsculas y minúsculas, así que mantengamos todas las respuestas y los comentarios en forma civil.

+1

La sensibilidad de mayúsculas hace que todo sea más fácil de leer ... Aunque no está relacionado con mayúsculas y minúsculas mira la sangría; idiomas como Python tienen éxito debido a la 'sangría', que en cierto modo puede ser mayúsculas y minúsculas. –

+2

La forma en que lo veo es que los beneficios micro de ella son muy superiores a los negativos del uso indebido, la depuración, etc. –

+1

@Tom: Digamos que tienes clase llamada PIT, y tienes un const llamado TAX ... O qué pasa si usted tiene una variable regular llamada hEllO. –

Respuesta

17

No es necesariamente una mala práctica tener dos miembros que solo se diferencian por caso, en los idiomas que lo soportan. Por ejemplo, aquí está un poco bastante común de C#:

private readonly string name; 
public string Name { get { return name; } } 

Personalmente estoy bastante contento con mayúsculas y minúsculas - especialmente en lo que se permite código como el de arriba, donde la variable miembro y convenciones complementarias propiedad de todos modos, no inducir a error.

Tenga en cuenta que entre mayúsculas y minúsculas tiene un aspecto cultura también ... no todas las culturas se consideran los mismos caracteres que son equivalentes ...

+0

Gracias por la respuesta, ¿podría ampliar el aspecto cultural? No estoy seguro de entender completamente. –

+4

El ejemplo más a menudo dado, es las variaciones turcas de "I". La insensibilidad a las mayúsculas en inglés es insensible a esto, porque "i" =/= "I" en este caso. – maxwellb

+3

+1 Jon, porque también respaldo mis propiedades con samenames en minúsculas. Personalmente no me gusta usar prefijos "_" para campos privados. – maxwellb

3

Imagine que tiene un objeto llamado dog, que tiene un método llamado Bark(). También ha definido una clase llamada Dog, que tiene un método estático llamado Bark(). Usted escribe dog.Bark(). Entonces, ¿qué es lo que va a hacer? ¿Llamar el método del objeto o el método estático de la clase? (en un idioma donde :: no existe)

+3

¿Por qué no llamarles cosas diferentes para que no se confundan más adelante? Tener una clase llamada Perro y un objeto llamado perro va a ser confuso. Esto es lo que no entiendo. –

+2

El perro es demasiado genérico ... Un objeto de Perro como el labrador tendría más sentido. –

+3

Así que ahora el compilador sabe qué método llamar, pero el lector aún se confundirá. Creo que deberías usar algo mejor para diferenciar entre los dos que la mayúscula de 1 letra. – Miel

1

comparación entre mayúsculas y minúsculas es (desde un punto de vista ingenuo que ignora canónica equivalencia) trivial (simplemente compare puntos de código), pero la comparación insensible a mayúsculas y minúsculas no está bien definida y es extremadamente compleja en todos los casos, y las reglas son imposibles de recordar. Implementarlo es posible, pero conducirá inadvertidamente a un comportamiento inesperado y sorprendente. Por cierto, algunos idiomas como Fortran y Basic siempre han sido insensibles a mayúsculas y minúsculas.

+1

Creo que la comparación de caso "sensible" sería más trivial. ¿Cómo se puede "comparar puntos de código" para decir que "a" ~ "A"? En una codificación de caracteres, uno puede comparar mayúsculas y minúsculas al hacer una comparación binaria simple ... – maxwellb

+1

Confundí sensibilidad a mayúsculas y minúsculas con mayúsculas y minúsculas. – Philipp

+0

Cada buscador que he usado puede hacer búsquedas que no distinguen entre mayúsculas y minúsculas. Muchos (por ejemplo, Emacs) lo hacen por defecto. Sí, las cosas se ponen turbias cuando se trata de idiomas que no están en inglés, pero siempre que las reglas para su compilador y su buscador sean las mismas, no hay ningún problema real allí. –

2

Estoy seguro de que originalmente fue una consideración de rendimiento. Convertir una cadena en mayúscula o minúscula para la comparación de celdas no es una operación cara, pero tampoco es gratis, y en sistemas antiguos puede haber agregado una complejidad que los sistemas del día no estaban listos para manejar.

Y ahora, por supuesto, los idiomas les gusta ser compatibles entre sí (VB por ejemplo no puede distinguir entre clases C# o funciones que difieren solo en el caso), las personas están acostumbradas a nombrar cosas del mismo texto pero con diferentes casos (Ver la respuesta de Jon Skeet, lo hago mucho), y el valor de los idiomas sin carcasa no fue suficiente para superar a estos dos.

+2

Estoy igualmente seguro de que originalmente no tenía nada que ver con el rendimiento que el caso fue ignorado en los lenguajes de programación. En su lugar, se redujo a los esquemas de codificación de 5 bits utilizados en (muchos) teleimpresores de 1950 que simplemente no tenían letras mayúsculas y minúsculas. NO NECESITA MAYÚSCULAS O PUNTUACIÓN EN UN TELEGRAM STOP –

+1

Creo que contradice la teoría del rendimiento que los lenguajes que no distinguen entre mayúsculas y minúsculas, como Fortran y Basic, se encuentran entre los más antiguos de todos los idiomas. – Philipp

+1

Heh, Philipp gana. Ni siquiera pensé en eso. –

8

Una de las mayores razones para la sensibilidad a mayúsculas y minúsculas en los lenguajes de programación es la legibilidad. Las cosas que significan lo mismo también deberían tener el mismo aspecto.

encontré la siguiente interesting example por M. Sandin en una discusión relacionada:

Solía ​​creer mayúsculas y minúsculas fue un error , hasta que hice esto en el caso lenguaje insensible PL/SQL (sintaxis ahora entierly olvidado):

function IsValidUserLogin(user:string, password :string):bool begin 
    result = select * from USERS 
      where USER_NAME=user and PASSWORD=password; 
    return not is_empty(result); 
end 

Este pasado desapercibido durante varios meses en una producción de bajo volumen sistema, y ​​no hubo daño. Pero es es un error desagradable, surgió de la insensibilidad del caso , convenciones de codificación, y la forma en que los humanos leen el código. La lección para mí fue que: Las cosas que son las mismas deben tener el mismo aspecto.

¿Ve el problema inmediatamente? No pude ...

+4

Este es un código que no distingue entre mayúsculas y minúsculas, por lo que 'PASSWORD = password' siempre es verdadero. – Blorgbeard

+1

@Tom Gullen: Se explica [más abajo] (http://lambda-the-ultimate.org/node/1114#comment-12098) en el hilo vinculado. –

+1

mi conjetura? PASSWORD = la contraseña siempre se evalúa como verdadera? Por lo tanto, cualquier nombre de usuario válido se iniciará ... al menos si estoy en lo cierto: P –

9

Me gusta la distinción entre mayúsculas y minúsculas para diferenciar entre clase e instancia.

Form form = new Form();

Si no puede hacer eso, usted termina con variables llamadas myForm o form1 o f, que no son tan limpio y descriptivo como el viejo y simple form.

La sensibilidad de la caja también significa que no tiene referencias a form, FORM y Form que significan lo mismo. Me resulta difícil leer dicho código. Me resulta mucho más fácil escanear el código donde todas las referencias a la misma variable se ven exactamente iguales.

+1

Después de haber trabajado mucho en idiomas que no distinguen entre mayúsculas y minúsculas, creo que es una buena habilidad adquirir diferentes nombres para clases y objetos. –

+1

Este problema no aparece en, p. Visual Basic porque los identificadores de tipo y los identificadores de objeto están claramente separados allí ('Dim forma As Form' etc., solo pueden aparecer tipos después de' As'). De nuevo, es la sintaxis C la que tiene defectos, no la idea en general. – Philipp

+3

@ T.E.D. Depende.A veces es el nombre más obvio y útil, a veces no lo es. Es bueno al menos tener la opción. –

2

La razón por la que no puede entender por qué la distinción entre mayúsculas y minúsculas es una buena idea, es porque no lo es. Es solo una de las rarezas extrañas de C (como las matrices basadas en 0) que ahora parece "normal" porque muchos idiomas copiaron lo que C hizo.

C usa sensibilidad de mayúsculas y minúsculas en los identificadores, pero desde el punto de vista del diseño del lenguaje esa fue una elección extraña. La mayoría de los lenguajes que fueron diseñados desde cero (sin ninguna consideración dada a ser "como C" de ninguna manera) se hicieron insensibles a mayúsculas y minúsculas. Esto incluye Fortran, Cobol, Lisp, y casi toda la familia de idiomas Algol (Pascal, Modula-2, Oberon, Ada, etc.)

Los lenguajes de scripting son mixtos. Muchos se hicieron sensibles a las mayúsculas y minúsculas porque el sistema de archivos Unix era sensible a las mayúsculas y debían interactuar sensiblemente con él. Creo que C creció orgánicamente en el entorno de Unix, y probablemente retomó la filosofía sensible a las mayúsculas y minúsculas desde allí.

+0

i las computadoras eran mucho menos poderosas en la década de 1970 que en la actualidad; pero me pregunto si tal vez no fue un caso de optimización prematura hace 40 años. –

+0

Todo el lenguaje C podría verse de esa manera. Por ejemplo, los incrementos y decrementos previos y posteriores se consagraron como operadores porque la CPU original de C (CISC) tenía variantes de código de operación para la mayoría de las operaciones. –

4

Algo que siempre me he preguntado, ¿por qué los idiomas están diseñados para distinguir entre mayúsculas y minúsculas?

En última instancia, es porque es más fácil implementar correctamente una comparación de mayúsculas y minúsculas correctamente; simplemente compara bytes/caracteres sin ninguna conversión. También puedes hacer otras cosas como hash realmente fácil.

¿Por qué es esto un problema? Bueno, la insensibilidad a mayúsculas y minúsculas es bastante difícil de agregar, a menos que se encuentre en un pequeño dominio de caracteres admitidos (en particular, US-ASCII).Las reglas de conversión de casos varían según la configuración regional (las reglas turcas no son las mismas que en el resto del mundo) y no hay garantía de que voltear un solo bit haga lo correcto, o que siempre sea el mismo bit y bajo el mismo precondiciones. (IIRC, hay algunas reglas realmente complejas en algunos lenguajes para descartar diacríticos al convertir las vocales a mayúsculas, y reintroducirlas al convertir a minúsculas. Olvidé exactamente cuáles son los detalles)

Si distingue entre mayúsculas y minúsculas , simplemente ignoras todo eso; es simplemente más simple. (Tenga en cuenta que todavía debe prestar atención a los formularios de normalización UNICODE, pero esa es otra historia y aplica las reglas de caso que esté usando)

+1

También me alegro de que nadie haga una portada automática del título para los lenguajes de programación (y realmente no estoy seguro de cómo funcionaría); las reglas para * que * son mucho más complejas! –

Cuestiones relacionadas