¿Qué es una buena arquitectura (ordenada) en la programación de un sitio web simple, por ejemplo, un libro de contactos?


28

Cuando construyo un sitio web simple, por ejemplo, un libro de contactos donde puedo agregar, eliminar y actualizar contactos, creo un index.phparchivo donde un usuario, si no ha iniciado sesión, debe ingresar una contraseña y si ingresa la contraseña correcta, es asignado una sesión y puede hacer ciertas cosas con los contactos.

Tengo dos archivos:

  1. El primero ( contacts.php) es para mostrar el código HTML. Sobre el código HTML, incluyo el segundo archivo y creo la clase.
  2. El segundo ( contacts_class.php) contiene todos los métodos para agregar, eliminar y actualizar.

Creo que está bien, pero cuando se trata de implementar un gran proyecto, ¿cómo debo hacerlo? ¿Tengo que crear carpetas para cada página y colocar archivos en ellas (como arriba, HTML y clase), y cómo debo hacerlo? ¿Cuál es una arquitectura buena y ordenada para construir grandes proyectos que cualquier otro programador entendería perfectamente?

Respuestas:


67

Planteaste una pregunta muy interesante y fundamental. La pregunta sobre la arquitectura del proyecto a gran escala y la organización de la estructura de carpetas (que es secundaria a la arquitectura).

Hoy, el enfoque más común para construir la arquitectura del marco CMS es el uso del patrón MVC. Hay algunos buenos artículos sobre cómo crear sus propios frameworks MVC, uno de ellos es Build an MVC Framework with PHP .

MVC significa Modelo, Vista, Controlador. Puede llamar a estos enfoques lo que quiera: MVC, HMVC, MVP. La esencia es aislar los componentes individuales de su sistema. El "Controlador" recupera los datos del "Modelo" y los envía a "Ver", que representa el HTML final. Ya ha implementado la "V" en su contacts.phpy "MC" en su contacts_class.php. Entonces ha aislado la vista del modelo y el controlador. Ahora puede cambiar fácilmente su "Vista" dejando otras partes intactas.

No te estoy sugiriendo que sigas ciegamente el MVC, MVP o cualquier otro patrón "MV". Es cuestión de adecuación, eficacia y sabor.

La aplicación de sitio web dinámico común puede incluir componentes como:

  • El punto de entrada, digamos index.php
  • Las bibliotecas / clases auxiliares
  • El enrutador de solicitud
  • Los módulos, componentes o controladores.
  • El motor de plantillas o quizás vistas individuales

La aplicación web real puede incluir cualquier otro componente como controladores de eventos, despachadores de eventos y enlaces, pero de hecho son matices. Bueno, permítanme presentarlo de la forma en que quiero presentarlo:

El diagrama de rutina de operación

La rutina de operación de marco común de la siguiente manera:

  1. La solicitud del navegador se envía directamente al punto de entrada ejecutable / script ( index.php).
  2. El script de punto de entrada carga las bibliotecas auxiliares, las clases y realiza una inicialización adicional de nuestro entorno de programación.
  3. La URL se pasa a la instancia del enrutador de solicitud. Este paso puede ser parte del paso 2.
  4. El enrutador de solicitud analiza la URL y envía la operación a un componente, módulo o controlador en particular.
  5. El componente (o controlador) procesa la solicitud enrutada y envía los datos a la vista que se representará.

La estructura de carpetas del proyecto correspondiente se muestra en el diagrama.

Le sugiero que investigue cómo se implementan los otros marcos. Los CMS / frameworks recomendados para comenzar son CodeIgniter, OpenCart, Joomla 1.5 y Tango CMS.


3
¿Qué usaste para hacer esa imagen? ¡Gran respuesta!
Mark Tomlin

3
¡Gracias por la evaluación positiva de mi respuesta! ¡Realmente lo aprecio! Esta respuesta es completamente el resultado del análisis de varios marcos de aplicaciones web de código abierto, que realicé anteriormente por mí mismo. Para aquellos interesados ​​en cómo se creó la imagen y el software que se utiliza, la imagen se creó con Inkscape 0.48 y GIMP 2.6.10. Ningún problema con eso. Solo use dos capas: una para los rectángulos con texto, otra para las sombras (los rectángulos negros borrosos). ¿Supongo que entiendes el resto?

Una pregunta, ¿por qué separaría los controladores de 'contactos' en 3 archivos? ¿No sería más limpio combinarlos en un solo contacto.php. Todo lo que tiene que hacer es pasar un parámetro de acción desde el enrutador. Lo mismo puede decirse de las vistas de 'contactos' a menos que su vista mezcle plantillas y lógica en un archivo para cada acción. No hago mucho desarrollo en PHP (trabajo principalmente en Python) pero espero que no todos los marcos usen este enfoque. De lo contrario, +1 para una gran crítica.
Evan Plaice

2

Para tener una idea de qué preguntas hacer y qué soluciones están disponibles, recomiendo el libro Patrones de arquitectura de aplicaciones empresariales de Martin Fowler. Puedes hacerte una idea de lo que hay en el libro leyendo su sitio web

Tenga en cuenta que el libro ya es bastante antiguo (en TI), pero muchos principios siguen siendo válidos o debe aprender de ellos. (¿Eso tiene sentido?)

(Software) La arquitectura es un tema muy amplio, no esperes una bala de plata, pero siempre hay más preguntas y más dudas hasta que se acabe el tiempo y el dinero y tengas que seguir con la mejor solución hasta ahora.


2

En primer lugar, eche un vistazo a un proyecto bien desarrollado. Wordpress es un ejemplo muy bueno de estructura de código: es simple de entender pero ofrece muchos "enchufes". Por lo tanto, WordPress es fácil de entender a través de "plug in".

En segundo lugar, una forma muy fácil de verificar su arquitectura es intentar escribir pruebas unitarias. Por ejemplo, si la clase "Baraja de cartas" tiene un método "barajar ()", debe poder crear una Baraja de cartas de tamaño predefinido (es decir, 5 cartas 1,2,3,4,5), llame barajar y verifique en un manera fácil el resultado (id 1,4,2,5,3)

Debe poder hacerlo sin crear instancias de todas las clases de proyecto, y la prueba debe ser muy limpia para leer.

Si no puede hacerlo, debe agregar capas entre clases, reestructurarlas, hasta que obtenga una manera fácil de hacerlo.

Luego repita este paso para todas las clases principales de su proyecto.

Por último, pero no menos importante: una buena arquitectura podría ser "floja" en clases no tan básicas (es una cuestión de economía: las cosas muy bien diseñadas cuestan demasiado en el mundo real).


1

Una buena arquitectura para proyectos a gran escala es MVC (Model View Controller): http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

Sin embargo, si otros programadores lo entenderían es un asunto completamente diferente. MVC puede volverse complejo y, a veces, es excesivo para proyectos pequeños. Uno de los beneficios es que se escala fácilmente.


Eso es un patrón, no una arquitectura.
halfdan

Yo diría que son uno en lo mismo en este caso. ¿Cómo diferenciarías a los dos? Además, lea la primera línea de la página de Wikipedia que publiqué.
Chris Laplante

1
Desde mi experiencia, MVC no es complejo y también es muy útil en proyectos pequeños. Sin embargo, estoy de acuerdo en que es un patrón y no una arquitectura completa.
Danny Varod el

MVC es un patrón, no una arquitectura per se, pero puede considerarse como parte de la arquitectura. Y no es tan complicado después de todo.

1

Si entiendo su pregunta correctamente, está hablando de la estructura de carpetas del proyecto y no esencialmente de una arquitectura. Si mi comprensión es correcta, sigue leyendo; de lo contrario, edite su pregunta o escriba un comentario y editaré mi respuesta en consecuencia.

Al diseñar una aplicación, después de responder algunas preguntas básicas como (¿qué? ¿Y a quién?), Necesitamos identificar los componentes y clasificarlos en función de la funcionalidad \ las responsabilidades. Hay dos formas principales que sé. Puede clasificar los componentes en función de los casos de uso que manejan (como inicio de sesión, búsqueda, etc.) o clasificar en función de los Recursos (Objetos ...). La primera forma se llama Orientada a la actividad y la segunda se llama Orientada a los recursos. Tradicionalmente, la mayoría de las aplicaciones clasifican los componentes en función de las actividades (ya que los diseñadores lo encontraron, fácil mientras se transfieren del dominio del problema al dominio de la solución). Pero estoy divagando.

Una vez que se identifica la clasificación de componentes, entonces necesitamos identificar la clasificación basada en Niveles. Una aplicación web típica tendrá un nivel de vista, un nivel de modelo y un nivel de controlador (MVC). Por supuesto, podría haber aplicaciones más complejas también. (la mayoría de las aplicaciones del mundo real son más complejas que ser así de sencillo).

Después de identificar estas dos taxonomías, crearé carpetas de nivel superior para identificar cada nivel. (UI, controlador, servicios, utilidades, etc.). Debajo de cada carpeta de alto nivel, crearé carpetas secundarias basadas en Funcionalidad o Recursos (Proyecto - / Proyecto de edición - / Proyecto de búsqueda, etc.). Idealmente, la clasificación funcional será multinivel.


No he profundizado en las diferencias entre el diseño orientado a recursos y el diseño orientado a actividades. Además de divagar, no estaba muy seguro de la pregunta. Pero personalmente cuando se trata de la claridad del diseño (con qué facilidad un nuevo desarrollador puede comprender los componentes y el diseño subyacentes), la Arquitectura Orientada a Recursos es mejor. Con solo mirar la jerarquía de carpetas, un desarrollador podría comprender que todos los recursos y sub recursos participantes y la operación de cada recurso también son uniformes.

1

Hay buenas arquitecturas y malas arquitecturas, sin embargo, no hay balas de plata. Una arquitectura debe adaptarse a los requisitos actuales y futuros altamente posibles.

Una buena guía sería asegurarse de que cada parte de la aplicación se pueda cambiar con un efecto mínimo en las otras partes y que cada parte tenga una unidad de cobertura completa automatizada y pruebas de integración.


1

La arquitectura se trata de asegurarse de que pueda continuar desarrollándose a largo plazo. Para aplicaciones más grandes, esto incluye hacer compensaciones entre hacer que las cosas sean independientes para que varias personas puedan trabajar simultáneamente y evitar la duplicación (DRY) para que el proyecto pueda mantenerse ágil. Los proyectos PHP tienden a centrarse en hacer que las cosas sean independientes y tienen una gran cantidad de duplicación.

Para tener una buena idea de la otra posición extrema, eche un vistazo a Seaside


1

Si no sabe cómo estructurar un proyecto grande, debe tomar prestado el diseño / arquitectura de otros utilizando uno de varios marcos PHP buenos. Recomendaría CakePHP, CodeIgniter o Symfony. Todos estos implementan un modelo, vista, controlador, modelo MVC que funciona bien en el desarrollo web, todos son bastante livianos y fáciles de aprender.

Una vez que conozca uno de estos marcos, podría estar en condiciones de diseñar su propia estructura para su proyecto en particular, pero si recién está comenzando, me pararía en el trabajo de otros en lugar de reinventar la rueda.


0

MVC es la arquitectura más utilizada, que está probada para resolver la mayoría de los problemas. Una buena arquitectura tendrá las siguientes características (y más, por supuesto)

  1. Puede ser probado en la unidad
  2. Separación de intereses
  3. Múltiples personas podrán trabajar en él sin ninguna colisión.
  4. Se puede extender sin mucho problema
  5. Puede ser escalable. Cuando se trata de grandes proyectos, la escalabilidad será una gran preocupación. Checkout Kohana framework, que está bien escrito y se puede escalar muy bien

0

antes de escribir cualquier código de producción, tome 2 semanas (noches :) y lea este libro. Cambiará de opinión durante mucho tiempo sobre la arquitectura de programación, las prácticas y el empaquetado.

Principios, patrones y prácticas ágiles C # por Prentice Hall

Los ejemplos están en C # pero son fáciles de leer, no se trata de cómo escribir la sintaxis correcta del código, sino de cómo pensar como programador.

Te prometo que lo guardarás en tu lugar más accesible en tu PC y te sorprenderá que hayas programado sin saberlo. Cambiará tu forma de pensar.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.