2008-09-19 8 views
5

Recientemente me he involucrado en un proyecto en el que un juego basado en la web utiliza un motor escrito en PHP. El juego funciona bien, pero podría ser más robusto y tener algunas características más, y el código es viejo y bastante feo.¿Cómo se refactoriza su antiguo código PHP?

El problema con este código (y mucho código PHP en general, sospecho) es que ha evolucionado hasta donde está y no está estructurado muy bien, tiene una gran cantidad de fragmentos de código cortados/pegados casi idénticos, y hace un uso intensivo de los globales aun cuando las funciones estén involucradas. Ni una sola prueba de unidad en ninguna parte, por supuesto, y el código está codificado para usar una base de datos particular y depende de cadenas $ _REQUEST de la página web que llama al código.

Lo correcto sería extraer partes del código como subfunciones, ponerlas en orden y agregar algunas pruebas de unidad para asegurarse de que sigan funcionando, agregando algunos objetos simulados en el camino. Sin embargo, hacer esto completamente a mano es tedioso y propenso a errores y me pregunto cómo se hace esto: ¿hay un IDE o herramienta que pueda ayudar, por ejemplo? Me gustaría tener una herramienta que pueda ayudar a producir una función a partir de una pieza definida de código, sugerir qué variables deben ser parámetros, por valor o referencia, agregar automáticamente $ this-> referencias, etc.

¿Esto es demasiado preguntar, o hay una buena solución?

Gracias!

Respuesta

11

Allan, nunca he visto una herramienta de refactorización tan poderosa. Incluso la refactorización de Eclipse para Java no es una característica completa. Sin embargo, hay algunos consejos comunes sobre refactorización. Usualmente refactorizo ​​aplicaciones en dos pasos.

1. Separa las cosas. Extraigo material relacionado con db y modelo y los extraigo del código principal. Alguna representación de objetos ayudaría. Compruebe Active Record o DAO patrón para cualquier trabajo ORM. El código HTML puede quitarse del código principal y moverse a los archivos de plantilla. Eche un vistazo al buen motor de plantillas con un sólido soporte para ver el procesamiento lógico: Smarty.

2. Ponga cosas en el marco de MVC.MVC es una arquitectura robusta que se adapta excepcionalmente bien a las aplicaciones web. Utilice uno de los marcos de PHP para vincular archivos PHP sueltos en métodos de controlador. Los marcos facilitan la administración de URL, las solicitudes HTTP, la aprobación de parámetros, la administración de la información de inicio de sesión y, por lo general, proporcionan algunos mecanismos de control de acceso.

Pero lo más importante es: no rompa las cosas más allá de la reparación. Es refactorización, no Reurbanización ;-)

0

Siento tu dolor. Sin embargo, nunca había escuchado sobre una herramienta así, al menos no para PHP.

0

No creo que el lenguaje esté lo suficientemente estructurado como para permitir ningún tipo de refactorización semiautomática. De todos modos, no conozco ninguna aplicación que pueda hacer esto, pero por el lado positivo: hacerlo todo a mano lo hará familiarizarse íntimamente con la fuente, podría ayudarlo más adelante que usted sepa moverse mucho mejor que usted lo haría con herramientas automatizadas.

9

Este artículo realmente pone de manifiesto los peligros de refactorización/volver a desarrollar antiguo código feo:

http://www.1729.com/blog/EconomicsOfTestingUglyCode.html

Mi enfoque es en general para hacer frente a un pequeño problema a la vez, que comienza ocultando gran parte del viejo código detrás de una interfaz donde se puede tratar "más tarde" sin afectar ningún código nuevo.De esta forma, todo lo que escribo puede estar bien diseñado y tener una estructura sólida, pero no tengo que perder demasiado tiempo tratando de refactorizar y luego probar el código incorrecto de semanas/meses/años.

+0

Enlace roto y aparentemente no más en la red. – Kzqai

+0

[Este artículo] (http://thinkinghard.com/blog/EconomicsOfTestingUglyCode.html) tiene el mismo título, y se escribió en 2008 en consonancia con la fecha de la respuesta de @David. –

1

Ninguna herramienta va a tomar código fugly y de alguna manera volver a hacerlo agradable. La frase "volver a la fórmula" es una perspectiva bastante aterradora para un proyecto maduro, pero desnuda conmigo ...

Sugiero que lo transfiera a un marco MVC decente. Al hacerlo, puede que no sea un mal momento para hacer una reescritura estructural para que todas sus clases estén optimizadas (algo que rara vez sucede de forma natural con el código en evolución). Tomará mucho tiempo y habrá dolor cuando las cosas no funcionen como se esperaba.

Es un gran paso, pero eso es lo que sucede cuando el código se pudre.

Sus otras opciones:

  1. Haz una reestructuración parcial, donde todo el código nuevo sigue un régimen fijo y código antiguo está reconstruyendo lentamente.
  2. Solo arregle sus errores y no realice ninguna reestructuración.
-1

En mi experiencia, una reescritura completa es mucho más económica en esta situación.

+0

La reescritura de piezas está bien, pero una reescritura completa de una gran cantidad de código (como dicen las personas) vuelve a descubrir los viejos errores de mayúsculas, de modo que los mismos casos especiales que cubría el código anterior vuelven a crear burbujas. – Kzqai

Cuestiones relacionadas