O que é uma boa arquitetura (pura) na programação de um site simples, por exemplo, um catálogo de contatos?


28

Quando construo um site simples, por exemplo, um catálogo de contatos onde posso adicionar, excluir e atualizar contatos, crio um index.phparquivo em que um usuário, se ele não estiver logado, é solicitado a digitar uma senha e, se digitar a senha correta, ele será atribuiu uma sessão e pode fazer certas coisas com os contatos.

Eu tenho dois arquivos:

  1. O primeiro ( contacts.php) é para o código HTML ser mostrado. Acima do código HTML, incluo o segundo arquivo e crio a classe.
  2. O segundo ( contacts_class.php) contém todos os métodos para adicionar, excluir e atualizar.

Acho que está tudo bem, mas quando se trata de implementar um grande projeto, como devo fazê-lo? Tenho que criar pastas para cada página e colocar arquivos nelas (como acima, HTML e classe), e como devo fazer isso? O que é uma arquitetura boa e organizada para criar grandes projetos que todos os outros programadores entenderiam perfeitamente?

Respostas:


67

Você levantou uma questão muito interessante e fundamental. A questão referente à arquitetura do projeto em larga escala e à organização da estrutura de pastas (secundária à arquitetura).

Hoje, a abordagem mais comum para a construção da arquitetura da estrutura do CMS é o uso do padrão MVC. Existem alguns bons artigos sobre como criar suas próprias estruturas MVC, uma delas é Construir uma estrutura MVC com PHP .

MVC significa Model, View, Controller. Você pode chamar essas abordagens como desejar - MVC, HMVC, MVP. A essência é isolar os componentes individuais do seu sistema. O "Controlador" recupera os dados do "Modelo" e os envia para "Visualizar", que renderiza o HTML final. Você já implementou o "V" no seu contacts.phpe "MC" no seu contacts_class.php. Então você isolou a vista do modelo e do controlador. Agora você pode alterar facilmente sua "Visualização", deixando outras partes intactas.

Não estou sugerindo que você siga cegamente o padrão MVC, MVP ou qualquer outra coisa "MV". É uma questão de adequação, eficácia e sabor.

O aplicativo dinâmico de site comum pode incluir componentes como:

  • O ponto de entrada, digamos index.php
  • As bibliotecas / classes auxiliares
  • O roteador de solicitação
  • Os módulos, componentes ou controladores
  • O mecanismo do modelo ou talvez visualizações únicas

O aplicativo da Web real pode incluir outros componentes, como manipuladores de eventos, expedidores de eventos e ganchos, mas essas são, na verdade, nuances. Bem, deixe-me apresentar da maneira que quero apresentar:

O diagrama da rotina de operação

A rotina de operação de estrutura comum da seguinte maneira:

  1. A solicitação do navegador é enviada diretamente para o ponto de entrada executável / script ( index.php).
  2. O script do ponto de entrada carrega as bibliotecas auxiliares, classes e executa alguma inicialização adicional do nosso ambiente de programação.
  3. O URL é passado para a instância do roteador de solicitação. Esta etapa pode fazer parte da etapa 2.
  4. O roteador de solicitação analisa a URL e despacha a operação para um componente, módulo ou controlador específico.
  5. O componente (ou controlador) processa a solicitação roteada e envia os dados para a exibição a ser renderizada.

A estrutura da pasta do projeto correspondente é mostrada no diagrama.

Eu sugeriria que você investigasse como as outras estruturas são implementadas. Os CMS / framework recomendados para começar são CodeIgniter, OpenCart, Joomla 1.5 e Tango CMS.


3
O que você usou para fazer essa imagem? Ótima resposta!
Mark Tomlin

3
Obrigado pela avaliação positiva da minha resposta! Eu realmente gostei disso! Essa resposta é inteiramente o resultado da análise de várias estruturas de aplicativos da web de código aberto, que eu conduzi anteriormente para mim. Para aqueles interessados ​​em como a imagem foi criada e o software usado, a imagem foi criada usando o Inkscape 0.48 e o GIMP 2.6.10. Não há problema com isso. Basta usar duas camadas: uma para os retângulos com texto e outra para as sombras (os retângulos pretos borrados). Eu acho que você entende o resto?

Uma pergunta: por que você separaria os controladores de 'contatos' em três arquivos? Não seria mais limpo combiná-los em um único contato.php. Tudo o que você precisa fazer é passar um parâmetro de ação do roteador. O mesmo pode ser dito para as visualizações de 'contatos', a menos que sua visualização combine modelos e lógica em um arquivo para cada ação. Eu não desenvolvo muito dev em PHP (trabalho principalmente em Python), mas espero que nem todas as estruturas usem essa abordagem. Caso contrário, +1 para obter uma excelente redação.
Evan Solha

2

Para ter uma idéia de quais perguntas fazer e quais soluções estão disponíveis, recomendo o livro Patterns of Enterprise Application Architecture de Martin Fowler. Você pode ter uma idéia do que está no livro lendo o site dele.

Esteja ciente de que o livro já é bastante antigo (na área de TI), mas muitos princípios ainda são válidos ou você deve aprender com eles. (Aquilo fez sentido?)

A arquitetura (software) é um assunto muito amplo, não espere uma bala de prata, mas sempre mais perguntas e mais dúvidas até que o tempo e o dinheiro acabem e você tenha que ficar com a melhor solução até agora.


2

Primeiro de tudo, dê uma olhada no projeto bem desenvolvido. O Wordpress é um exemplo muito interessante de estrutura de código: é simples de entender, mas oferece bastante "plug". Assim, o wordpress é fácil de obter via "plug-in".

Segundo, uma maneira muito fácil de verificar sua arquitetura é tentar escrever um teste de unidade. Por exemplo, se a classe "Baralho de Cartas" tiver um método "shuffle ()", você deverá criar um Baralho de Cartas de tamanho predefinido (ou seja, 5 cartões 1,2,3,4,5), chamar shuffle e verificar em um maneira fácil o resultado (id 1,4,2,5,3)

Você deve poder fazer isso sem instanciar todas as classes do projeto, e o teste deve ser muito limpo para ler.

Se você não conseguir, adicione camadas entre classes, reestruture-as, até obter uma maneira fácil de fazê-lo.

Em seguida, reitere esta etapa para todas as classes principais do seu projeto.

Por último, mas não menos importante: uma boa arquitetura poderia ser "preguiçosa" em classes não tão essenciais (é uma questão de economia: coisas muito bem projetadas custam muito no mundo real).


1

Uma boa arquitetura para projetos de grande escala é o MVC (Model View Controller): http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

Entretanto, se outros programadores entenderiam isso é uma questão totalmente diferente. O MVC pode se tornar complexo e, às vezes, é um exagero para pequenos projetos. Um dos benefícios disso é que ele pode ser dimensionado facilmente.


Isso é um padrão, não uma arquitetura.
Halfdan 19/04

Eu diria que eles são o mesmo neste caso. Como você diferenciaria os dois? Além disso, leia a primeira linha da página da Wikipedia que publiquei.
31711 Chris Laplante

1
Pela minha experiência, o MVC não é complexo e também é muito útil em pequenos projetos. Concordo, no entanto, que é um padrão e não uma arquitetura inteira.
Danny Varod

O MVC é um padrão, não a arquitetura em si, mas pode ser considerado como parte da arquitetura. E não é tão complicado, afinal.

1

Se entendi sua pergunta corretamente, você está falando sobre a estrutura de pastas do projeto e não sobre uma arquitetura. Se meu entendimento estiver correto, continue lendo; caso contrário, edite sua pergunta ou faça um comentário e eu editarei minha resposta de acordo.

Ao projetar um aplicativo, depois de responder a algumas perguntas básicas como (o quê? E para quem?), Precisamos identificar os componentes e classificá-los com base na funcionalidade \ responsabilidades. Existem duas maneiras principais que eu conheço. Você pode classificar componentes com base nos casos de uso que eles manipulam (como login, pesquisa, etc.) ou classificar com base em Recursos (Objetos ..). A primeira maneira é chamada Orientada a Atividade e a segunda, Orientada a Recursos. Tradicionalmente, a maioria dos aplicativos classifica componentes com base em Atividades (já que os designers o acharam, fácil ao transferir do domínio do problema para o domínio da solução).

Depois que a classificação do componente é identificada, precisamos identificar a classificação com base em Camadas. Um aplicativo da Web típico terá View Tier, Model Tier e Controller Tier (MVC). Claro que também poderia haver aplicativos mais complexos. (a maioria dos aplicativos do mundo real é mais complexa do que simples assim).

Depois de identificar essas duas taxonomias, vou criar pastas de nível superior Identificando cada camada. (UI, Controller, Serviços, Utils etc). Em cada pasta de alto nível, criarei pastas filho com base na Funcionalidade ou Recursos (Projeto - / EditProject - / SearchProject etc). A classificação funcional ideal será multinível.


Eu não fui mais fundo nas diferenças entre Design Orientado a Recursos e Design Orientado a Atividade. Além de divagar, eu não tinha muita certeza sobre a questão. Mas, pessoalmente, quando se trata de clareza de design (com que facilidade um novo desenvolvedor pode entender componentes e design subjacentes), a Arquitetura Orientada a Recursos é melhor. Apenas olhando para a hierarquia de pastas, um desenvolvedor pode entender todos os recursos e sub-recursos participantes e a operação em cada recurso também é uniforme.

1

Existem boas arquiteturas e más arquiteturas, no entanto, não existem balas de prata. Uma arquitetura deve ser adequada aos requisitos atuais atuais e altamente possíveis.

Uma boa diretriz seria: certifique-se de que cada parte do aplicativo possa ser alterada com um efeito mínimo nas outras partes e que cada parte tenha testes de integração e unidade de cobertura automatizados.


1

Arquitetura é garantir que você possa continuar desenvolvendo a longo prazo. Para aplicativos maiores, isso inclui fazer trocas entre tornar as coisas independentes, para que várias pessoas possam trabalhar simultaneamente e evitar a duplicação (DRY), para que o projeto possa permanecer ágil. Os projetos PHP tendem a se concentrar em tornar as coisas independentes e têm uma grande quantidade de duplicação.

Para ter uma boa idéia da outra posição extrema, dê uma olhada no Seaside


1

Se você não sabe como estruturar um projeto grande, deve emprestar o design / arquitetura de outras pessoas usando um dos vários Frameworks PHP bons. Eu recomendaria CakePHP, CodeIgniter ou Symfony. Tudo isso implementa um padrão Model, View, Controller, MVC que funciona bem no desenvolvimento da Web, todos eles são bastante leves e fáceis de aprender.

Depois de conhecer um desses frameworks, você poderá arquitetar sua própria estrutura para seu projeto em particular, mas, se você está começando, eu continuaria com o trabalho de outros e reinventaria a roda.


0

MVC é a arquitetura mais comumente usada, que comprovadamente resolve a maioria dos problemas. Uma boa arquitetura terá os seguintes recursos (e mais, orcourse)

  1. Pode ser testado em unidade
  2. Separação de preocupações
  3. Vários povos serão capazes de trabalhar nele sem nenhuma colisão.
  4. Pode ser estendido sem muito problema
  5. Pode ser escalável. Quando se trata de grandes projetos, a escalabilidade será uma grande preocupação. Estrutura de check- out Kohana , que é bem escrita e pode ser dimensionada muito bem

0

Antes de escrever qualquer código de produção, tire 2 semanas (noites :) e leia este livro. Por um longo tempo, você mudará de idéia sobre arquitetura de programação, práticas e empacotamento.

Princípios, padrões e práticas ágeis C # por Prentice Hall

Os exemplos estão em C #, mas são fáceis de ler, não se trata de como escrever a sintaxe de código correta, mas de como pensar como programador.

Eu prometo que você o salvará no seu lugar mais acessível no seu PC e ficará surpreso ao ver que está programando sem ter que saber. Isso mudará seu pensamento.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.