Código consistente o código fácil de leer

En ocasiones, las discusiones más populares entre programadores están relacionadas con asuntos aparentemente triviales. Este es el caso de la última discusión del grupo de desarrolladores de Symfony, que trata sobre la constante DIRECTORY_SEPARATOR de PHP.

Si echas un vistazo al código fuente de Symfony, verás que utiliza masivamente la constante DIRECTORY_SEPARATOR de PHP. Desde hace mucho tiempo esta constante se utilizaba para que las aplicaciones PHP que utilizan rutas de archivos funcionaran correctamente y sin hacer cambios tanto en Windows como en Linux:

// Ruta para Linux
<?php include dirname(__FILE__).'/ruta/hasta/archivo.php'; ?> 

// Ruta para Windows
<?php include dirname(__FILE__).'\ruta\hasta\archivo.php'; ?> 

// Ruta compatible con Windows y Linux
<?php include dirname(__FILE__).DIRECTORY_SEPARATOR.'ruta'.DIRECTORY_SEPARATOR.'hasta'.DIRECTORY_SEPARATOR.'archivo.php'; ?>

No obstante, desde hace tiempo la constante DIRECTORY_SEPARATOR se puede dejar de utilizar para operaciones de este tipo porque PHP ya se encarga de traducir correctamente las rutas:

// Ruta compatible con Windows y Linux
<?php include dirname(__FILE__).'/ruta/hasta/archivo.php'; ?>

Por lo tanto, el uso de la constante DIRECTORY_SEPARATOR sólo es necesario cuando se realizan operaciones con los valores devueltos por las funciones relacionadas con el sistema de archivos:

<?php if (dirname(__FILE__) == DIRECTORY_SEPARATOR) {
  ...
} ?>

Como la constante DIRECTORY_SEPARATOR tiene un nombre muy largo, se utiliza mucho y en la mayoría de casos es prescindible, algunos programadores piden que Symfony deje de utilizarla y se pase directamente a la barra /  Otros programadores prefieren que el código sea consistente aunque eso suponga complicar su facilidad de lectura. La discusión sigue abierta ¿consistencia o facilidad de lectura?

Comentarios

  1. Por supuesto fácil de leer, ya que si se consiguen los mismos resultados, ¿para qué complicar el código?

    Creo que es uno de los principios de symfony la sencillez.

    pablodip el 30 de septiembre de 2008, 9:25:00

  2. Tienes un pequeño error:

    // Ruta para Windows

    // Ruta para Linux

    Es al revés, para windows la '\' es el separador de directorios, mientras que para sistemas *nix es '/', imagino que ya los tienes claro per se te ha colado :-D

    Yendo al tema no creo que sean incompatibles, para mi leer DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR es lo mismo que '/apps/' (incluso es más fácil de leer con la segunda opción, aunque claro sólo es mi opinión)

    Marc el 30 de septiembre de 2008, 12:49:03

  3. Hola Javier, los ejemplos por OS, ¿no estan al reves?, no deberia ser

    // Ruta para Windows

    // Ruta para Linux

    saludos

    puentesdiaz el 30 de septiembre de 2008, 14:14:30

  4. Robustez,consistencia, esta claro. La simplicidad de la lectura de un código depende de la experiencia del lector en el lenguaje y del conocimiento del mismo, por tanto no depende del propio código.

    Se pueden considerar lenguajes más o menos faciles de leer, pero aqui entra un factor clave, todo lenguaje puede ser llevado hacia la ofoscación del propio código con lo cual entramos en la difilcutad de la lectura.

    Quizas el error de Symfony ha sido usar la constante de PHP y no una propia como referencia al separador de PHP, solo por el mero hecho de tender Symfony hacia un MVC completo.

    Marcos el 30 de septiembre de 2008, 18:39:56

  5. Muchas gracias a Marc y Roberto por avisarme de que me había equivocado con las rutas en los ejemplos de Windows y Linux. Ahora ya están corregidas.

    Respecto a la discusión, tres de los programadores del core (Nicolas Perriault, Carl Vondrick y Jonathan Wage) ya han dicho que prefieren la consistencia de utilizar la constante DIRECTORY_SEPARATOR en todo el código aunque algunas líneas sean larguísimas. Así que parece que el resultado de la "encuesta" está muy claro.

    Javier Eguiluz el 30 de septiembre de 2008, 22:18:56

  6. Pues a Fabien parece que no le va demasiado la constante :-D

    http://trac.symfony-project.org/changeset/11835

    pablodip el 30 de septiembre de 2008, 23:21:36

  7. define('DS', 'DIRECTORY_SEPARATOR');

    Jaime el 8 de octubre de 2008, 12:24:05

  8. Jaime, esa solución parece buena, pero algunos programadores importantes de Symfony creen que no lo es:

    1) Ian Christian dice lo siguiente: "Some project 'alias' the constant to just 'DS' don't they? I think perhaps that's worse...." (Lo de "Some project" se refiere a CakePHP)

    2) Nicolas Perriault dice: "Yes, Cakesomething does that, but I don't really like it as well." ("Cakesomething" también se refiere a CakePHP)

    Asi que los dos dicen que no es una buena solución pero no explican sus razones.

    Javier Eguiluz el 8 de octubre de 2008, 21:51:54

Este artículo ya no permite añadir más comentarios.
¿Por qué? Los artículos cierran sus comentarios automáticamente unos meses después de su publicación para asegurar que estos sigan siendo relevantes.

Publicada el

30 de septiembre de 2008

Etiquetas

Proyectos Symfony destacados

La forma más sencilla de generar el backend de tus aplicaciones Symfony. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.