2009-05-07 28 views
12

¿Puede alguien explicarme qué es exactamente tan malo utilizar la barra diagonal inversa como operador del espacio de nombres? Leí muchos comentarios burlones al respecto. One StackOverflower incluso dijo que renunció a PHP por eso.El operador del Espacio de nombres ... ¿cuál es el problema?

Sí, sé que la barra diagonal inversa tiene un significado especial como el carácter de escape dentro de las cadenas, pero en realidad no es peor que usar ->, o el punto . como en muchos otros idiomas.

Me recuerda a todas las burlas de Nintendo cuando anunciaron el nombre de la Wii. Todo el mundo hace un gran alboroto y una vez que sale y estás acostumbrado, a nadie le importa y siguen adelante.

Entonces, por favor, ilumíname. ¿Qué tiene de malo? ¿Qué hubiera sugerido en su lugar?

Respuesta

12

Qué hay de malo en ello: ¿Puedes encontrar el error en el siguiente código?

if(class_exists("namespace1\namespace2\myClass")) 
    echo "This will never be true"; 

¿Qué habría sugerido: Por desgracia, '\' es el único personaje sola individual disponible. Si PHP6 fuera mío para diseñar, reemplazaría todos los operadores bit a bit (^, &, |, ~) con palabras clave (ya que se usan muy poco) y usaré '|' como el separador del espacio de nombres. De hecho, sugeriría muchos cambios de sintaxis más simples para hacer que PHP sea más fácil de leer y escribir, pero es más fácil simplemente usar Python ...

+0

sé lo que estás diciendo, pero está escribiendo class_exists ("namespace1 \\ namespace2 \\ myClass") mucho más difícil? – nickf

+3

encuentro la tecla "\" inconveniente para alcanzar en un teclado alemán. Además, ningún otro idioma (afaik) utiliza la barra invertida como ns-separator, lo que conduce a otra forma de hacer lo mismo ligeramente diferente. – stefs

+0

no entiendo cómo es el único personaje disponible? Por qué no usar que no tiene un significado especial dentro de una cadena (o estoy equivocado) \ tiene un significado especial dentro de una cadena y se ha usado. –

3

El problema es que es el carácter de escape en casi cualquier otro contexto. Esto significa que las personas lo estropearán inadvertidamente, pero también hace que sea difícil de leer porque sus ojos están sintonizados para leer una barra diagonal inversa como un meta-carácter, en lugar de simplemente como otro símbolo.

Hubiera preferido tres puntos, que en realidad se sugirieron en algún momento.

+0

Por "cualquier otro contexto", ¿te refieres a cadenas y expresiones regulares? El punto final tiene diferentes significados ya sea que se use como operador (concatenación de cadenas), en expresiones regulares (coincide con cualquier carácter) o en una cadena (es punto). Esto no parece causar confusión, ¿por qué? – nickf

+0

En realidad, lo decía en un sentido más amplio. La mayoría de los lenguajes usan la barra diagonal inversa como un carácter de escape. Creo que el \ es diferente de a. en que aumenta los caracteres que lo siguen (al menos cuando se usa para escapar). Estoy de acuerdo en que * técnicamente * no es un gran problema, pero mis ojos están entrenados para asignar un significado especial a ese personaje. – troelskn

3

Además, si quisiera un lenguaje que reinventara la sintaxis sin ninguna razón particularmente buena, usaría Ruby.

+0

no está reinventando nada, solo está usando un carácter diferente al de otros idiomas. – nickf

+3

¿De verdad? La última vez que revisé, PHP se ve bastante parecido a C++. Esa es la razón por la que lo recogí, era una buena manera de transferir mi conocimiento de programación sin reajustar significativamente mis expectativas. En este punto, es una mala decisión pero es sobrevivible. Pero no hay forma de que cualquiera que haya preguntado a una población considerable de usuarios de PHP lo que les gustaría haya llegado a la conclusión de que '\' está en línea con lo que los usuarios quieren. De hecho, está totalmente desalineado con las expectativas del usuario, que es lo que hace enojar a la gente. Esta decisión parece no reflejar ninguna entrada de los codificadores de PHP. –

1

Bueno, hay otro problema al usar "\" como espacio de nombres.

  1. Es el personaje de escape. Si tiene que usar \ en "cadena" y \ en 'cadena'. Siento que alguien confundirá con él en algún punto. Tarde o temprano. el char de escape te atrapará.
  2. '\' no está muy bien ubicado en todos los teclados. En mi teclado, tengo que usar una combinación de teclas que no son muy cercanas entre sí y otras veces es solo un dolor. Si bien no es tan malo como '^'. En otras palabras, no será posible escribir con fluidez el código que necesita acceder al espacio de nombres en ciertos mapas de teclas.
  3. Recuerdo cuando lo votaron y cuán absurdos son los resultados. Lo eligieron porque era más simple que el otro char y necesitaban menos tipeo. Para ser sincero, todo depende de la distribución de tu teclado.

Esa es toda la razón por la que puedo encontrar por qué podría ser una mala cosa usar el carácter de escape. Para ser sincero, todavía estoy esperando el lenguaje que creará sus propios símbolos unicode. Por lo tanto, daría mucha más flexibilidad sobre qué operador puede anular. Digamos que en C++ podrías escribir algo como.

bool operator ≤ (Dog dog); 
//and then do this 
if(myDog ≤ thisDog){ 
} 
//Seems useful? 
bool operator ≅ thisDog){ 
    // this wouldn't check for equality 
    // but for something close to it 
} 

Ser capaz de utilizar nuestro propio operador arbitraria tiene mucho más sentido que el uso de + para agrupar las cosas ... "∪" tendría mucho más sentido ... Y si desea obtener intersección sólo a usted "∩ "y luego la gente podría decir ..." ¿y si no tenemos esos caracteres en nuestra fuente? " Solo puedo responder con: "¡Busca una fuente que los tenga !!!!"

+0

Aunque estoy de acuerdo en que '∪' tiene más sentido que' + 'en algunos contextos, no es un carácter fácil de ingresar sin una paleta de caracteres, o una amplia combinación de teclas, etc. Si desea formar una unión de dos conjuntos, es probablemente sea más rápido escribir 'set1.union (set2);' que ingresar '∪', incluso si' (set1 ∪ set2) 'se ve mucho mejor. – dreamlax

0

asumamos que el espacio de nombres siguiente:

jp\nintendo\rvl\testing

Qué observas los errores?

el espacio de nombres (interna) real es muy probable que algo como esto:

jp 
intendo 
vl esting

La solución a esto es utilizar siempre dos barras invertidas como un separador de espacio de nombres similar a la forma en que estamos usando esto en ventanas de nombres de archivo.

usando dos barras invertidas es completamente dañino, ya que es una secuencia de escape en sí misma, que se expande en una sola barra invertida literal, que es el separador de espacio de nombres real.

Ahora, si usamos

jp\\nintendo\\rvl\\testing
como un espacio de nombres (con 2 barras invertidas) como separador de espacio de nombres (interna) real se convierte en:
jp\nintendo\rvl\testing

+3

No hay errores en su espacio de nombres de ejemplo. Si eso estuviera en una cadena citada doble, sería diferente, pero no lo es. – nickf

0

La verdadera pregunta es, ¿por qué no sólo hay que poner como /? Yo personalmente odio porque es un personaje de escape ... ¡eso me arruina todo!

+4

'/' es el operador de la división. ¿Cómo '' 'atornillar todo? – nickf

1

Los documentos oficiales RFC y el respaldo se puede encontrar en

Incluyen una IRC log about the decision process.

Citando Sección "Problemas"

  • \ se parece mucho a / y es fácil de mover de un tirón accidental, especialmente para los usuarios de UNIX
  • \ se utiliza para escapar
  • dentro de una cadena un nombre de espacio de nombres se convierte en \\like\\this o podemos obtener caracteres extraños. Esto podría ser confuso para los usuarios al principio.
  • todos los códigos de espacio de nombres existentes deben estar casi reescritos, una simple búsqueda/reemplazo de :: no sería posible.
  • el parche toca una gran parte del motor, y necesitará rigurosas pruebas de batalla.
  • a muchos, \this\way se verá raro al principio.

Cualquiera de las Observaciones burla que mencionar son probablemente debido a que por encima o por opinión personal "razones". Yo, por ejemplo, los encuentro bastante feos de leer y engorrosos de escribir, especialmente en cadenas donde tengo que usar barras diagonales inversas dobles. Pero, una vez más, me acostumbro a él con más frecuencia los uso.

Cuestiones relacionadas