Eu sou um desenvolvedor individual trabalhando, em grande parte, em projetos web (W / LAMP) e, às vezes, em projetos C / C ++ (não GUI) de escala média.
Geralmente luto com a estruturação da minha árvore de código-fonte. De fato, normalmente, eu não concluo um projeto sem despejar a árvore inteira e reorganizar as peças três a quatro vezes, o que realmente exige muito esforço e, além disso, o resultado final parece um compromisso.
Às vezes, acabo com uma classificação excessiva da fonte - árvore muito longa de pastas e subpastas. Em outros momentos, simplesmente acabo concentrando todos os arquivos em uma pasta específica, com base no propósito maior que eles servem e, assim, levando a pastas 'caóticas' na fonte.
Eu gostaria de perguntar:
- Existem princípios / lógica / práticas recomendadas que podem me ajudar melhor na estruturação da minha árvore de fontes?
- Existem técnicas gráficas / diagramáticas (por exemplo: DFD em caso de fluxo de dados) que podem me ajudar a visualizar minha árvore de fontes com base na análise do projeto?
- Que estratégia adotar para estruturar a árvore de arquivos multimídia associada ao projeto?
Sobre a recompensa : Aprecio as respostas existentes com os membros que compartilham suas próprias práticas. No entanto, gostaria de incentivar respostas (ou recursos) mais gerais e instrutivas e mais respostas dos membros.
fonte
Respostas:
O layout da árvore de origem deve refletir a arquitetura; como corolário, uma arquitetura bem estruturada pode levar a um layout de árvore de origem bem estruturado. Sugiro a leitura do padrão Camadas POSA1 , tentando ajustar sua arquitetura em uma estrutura em camadas, nomeando cada uma das camadas resultantes e usando isso como base para sua hierarquia de origem. Tomando uma arquitetura comum de três camadas como linha de base:
Observe que as camadas não contêm código diretamente, mas são estritamente usadas para organizar os módulos.
Dentro de um módulo, eu uso o seguinte tipo de layout:
<module>
(caminho para o módulo diretamente; define a interface modular)<module>/impl/<implName>
(uma implementação específica da interface modular)<module>/doc
(Documentação para usar o módulo)<module>/tb
(código de teste de unidade para o módulo)onde
<module>
está localizado no repositório de acordo com a camada à qual ele pertence.fonte
Na verdade, não posso dar muitos conselhos relacionados a projetos da Web, mas veja como estruturo minha árvore em um projeto de programação (principalmente da perspectiva do C / C ++):
Algumas notas:
Se estou escrevendo uma biblioteca (e usando C / C ++), organizarei meus arquivos de origem primeiro em duas pastas denominadas "include" e "src" e, em seguida, por módulo. Se for um aplicativo, eu vou organizá-los apenas por módulo (cabeçalhos e fontes vão na mesma pasta).
Os arquivos e diretórios listados acima em itálico não adicionarei ao repositório de códigos.
fonte
ide
é exatamente onde eu armazeno os arquivos do projeto.build
contém os arquivos de objeto gerados pelo compilador. IDEs diferentes podem usar o mesmo compilador, por isso mantenho os arquivos de projeto do IDE separados dos arquivos de objeto criados pelo compilador.Embora o Maven Standard Directory Layout seja específico para Java, ele também pode servir como uma boa base para outros tipos de projetos.
Aqui está a estrutura básica (você pode substituir os diretórios 'java' por 'php', 'cpp', etc):
A estrutura é dividida basicamente em 'src / main' e 'src / test' e depois agrupadas por tipo.
fonte
Eu realmente não sei sobre convenções, mas todos os meus principais projetos são feitos usando o Symfony Framework e eu me acostumei a uma estrutura em árvore da seguinte maneira:
raiz/
Se você estiver interessado, leia a documentação do symfony sobre o assunto para obter mais informações ( MVC e Code Organization on Symfony ).
fonte
Idealmente, a organização possui um único repositório, cuja estrutura se destina a aumentar o envolvimento entre engenharia e negócios e promover a reutilização.
produtos
Uma pasta por produto; ajuda a comunicar como o software suporta os negócios.
Idealmente, cada "produto" é pouco mais que um arquivo de configuração indicando quais sistemas chamar e como devem ser configurados. A subpasta doc pode conter o resumo de nível superior \ spec e qualquer material promocional etc ...
Ao separar produtos e sistemas, comunicamos o potencial de reutilização ao lado do negócio voltado para o cliente e dividimos os silos por produto. (Isso contrasta com a abordagem "linha de produtos" para o mesmo problema)
sistemas
Uma pasta por sistema; ajuda a comunicar os principais recursos e oportunidades / valor do conteúdo do repositório.
biblioteca
Componentes reutilizáveis invocados por vários sistemas. A maioria das atividades de desenvolvimento é organizada em torno da produção de bibliotecas, e não de sistemas; portanto, a reutilização é incorporada ao processo de desenvolvimento.
devops
Construção, integração contínua e outras funcionalidades da automação de desenvolvimento.
Conclusão
A árvore de fontes é uma peça importante da documentação e molda a abordagem, a estrutura e a psicologia do relacionamento dos negócios com sua tecnologia proprietária.
Os drivers para essa abordagem são explicados um pouco mais profundamente na minha resposta a esta pergunta: https://softwareengineering.stackexchange.com/questions/43733/who-organizes-your-matlab-code/59637#59637
fonte
O que estou tentando fazer para cada projeto é semelhante a:
Todos os arquivos ou makefiles do IDE são salvos diretamente na raiz se você usar apenas um deles.
fonte
Eu faço algo assim. Funciona bem para um jogo de plataforma cruzada que estou fazendo no meu tempo livre. Infelizmente no trabalho, as coisas são muito menos organizadas ...
fonte
Para minhas equipes, tentamos impor uma estrutura padrão entre os projetos para facilitar a localização de coisas, pois a equipe alterna o contexto e evitar a necessidade de reaprender a cada vez. Como nem todos os projetos precisam de todos os sistemas, começamos com o conjunto mínimo.
Isso resulta em alguma duplicação, principalmente no código e nas bibliotecas de terceiros, mas pelo menos nunca esquecemos a resposta para algo como "O que usa o RogueWave Editor?"
fonte
Gosto das idéias apresentadas nesta página www.javapractices.com/topic/TopicAction.do?Id=205 . Basicamente, a recomendação é organizar seu projeto em recursos (ou módulos, componentes). Além dos motivos apresentados:
Observe que isso está focado nos pacotes Java (também conhecidos como namespaces). Para grandes projetos, recomendo, pelas mesmas razões, dividir o projeto em vários projetos (como em vários projetos independentes) que representam um recurso de negócios. Para projetos espertos, recomendo esta leitura .
Até agora, os projetos em que eu estava / estou envolvido não os seguem. Há muitas razões, mas aqui estão algumas:
Acho que há uma oportunidade perdida de impedir a complexidade se a organização da fonte do projeto não for levada a sério no início do projeto, como disse o arquiteto Alexander:
Dependendo do tamanho e da complexidade de um projeto, a oportunidade perdida de cortar custos ou ROI pode ser realmente grande. (Estou interessado em ver um estudo para ver os números exatos disso)
fonte
Minha recomendação é baixar uma variedade de estruturas ou mecanismos e ver como grandes equipes de desenvolvimento lidaram com o layout de suas pastas.
Existem tantas maneiras de organizar arquivos que é melhor escolher um e tentar cumpri-lo em qualquer projeto. Atenha-se a uma convenção específica até a conclusão ou a reformulação para evitar erros e perder tempo desnecessário.
É possível fazer o download das estruturas do Laravel, Symphony ou Codeigniter para projetos da Web para ter um layout de pasta instantâneo que funcione.
Então, tentarei transmitir um layout de pastas comum a qualquer desenvolvimento:
O MVC (Model View Controller) fornece um bom paradigma de organização.
O código-fonte raiz pode ser src (C ++) ou aplicativo (desenvolvimento da web)
Uma estrutura de arquivo que não tem um objetivo claro para as classes que agrupa definitivamente causará confusão. Não se trata apenas de organizar o código; ele pode suportar carregadores automáticos, class factory, agrupar armazenamento local, armazenamento remoto e namespacing.
Essa estrutura de pastas é derivada e simplificada do Laravel Framework . Minha preferência neste post é a nomeação plural, mas uso palavras singulares em meus projetos.
Implementações src / storage (modelos / implementações de armazenamento de arquivos / api / mysql / sql-lite / memcached / redis)
src / repositories (Um invólucro de 'implementações de armazenamento' com alguma lógica de armazenamento, uma interface comum e uma convenção de resultado de retorno.)
src / serviços | lógica | entidades (lógica de negócios do aplicativo)
src / controllers (Usado no desenvolvimento da web para rotear solicitações do servidor para seus serviços)
src / módulos | systems ( Sistemas modulares que ampliam a funcionalidade geral da estrutura. Os serviços podem usar módulos, mas não vice-versa)
src / helpers (classes Helper ou wrapper como, por exemplo, manipulação de strings. Muitas vezes isso pode estar no libs | vendor quando terceiros)
src / types (enumerações nomeadas)
público | construir | saída (web ou c ++)
config (arquivos de instalação. YAML está se tornando popular para arquivos de configuração de plataforma cruzada)
cache
logs
lang (pt-br / es / ru / ...)
bootstrap (inicia a estrutura e o aplicativo)
docs (documentação escrita em formato de remarcação .md)
testes (teste de unidade)
banco de dados / migrações (criar estrutura de banco de dados a partir do zero)
database / seeds (Preenche seu banco de dados com dados fictícios para teste)
libs | vendor (todos os softwares de terceiros. 'libs' em C ++ e 'vendor' geralmente em php)
ativos | recursos (imagens / sons / scripts / json / qualquer mídia)
fonte
Com linguagens orientadas a objetos, você tem a capacidade de criar espaços para nome. Essa divisão lógica usada para separar partes do aplicativo para evitar o acoplamento é a principal fonte de divisão da localização do arquivo lógico. Usar o acoplamento como motivo para separar os espaços para nome é um bom lugar para começar http://en.wikipedia.org/wiki/Software_package_metrics .
Outros já falaram sobre a configuração do projeto em relação à construção, mas uma vez que você entra na própria fonte, é sobre o que faz sentido - basta usar como você divide o código de qualquer maneira.
fonte