Como visualizar o design de um mecanismo de física?


17

Estou criando um mecanismo de física e está ficando muito difícil acompanhar tudo isso. Freqüentemente, quando volto ao meu código após um intervalo, não me lembro por que isso não está funcionando. A maioria dos problemas não são simples erros de programação, mas falhas de design no meu mecanismo de física. É por isso que devo terminar de projetá-lo antes de programá-lo.

No entanto, preciso de uma maneira de escrever no papel todo o design do meu mecanismo de física. Senão, vou esquecê-lo amanhã e me perder novamente. Um diagrama de classes UML não é apropriado para o design de um mecanismo de física. Eu realmente não me importo com as aulas, mas com o processo. Não vejo o diagrama do processo de negócios muito útil porque a modelagem de uma única etapa (quadro) do meu processo não me ajudará a entender o comportamento final do meu mecanismo em várias etapas.

Então, que tipo de diagrama devo usar para me ajudar a acompanhar o processo? Que tipo de diagrama os profissionais usam para criar um mecanismo de física?


4
Primeiro, sugiro um fluxograma de alto nível, para mostrar como o mecanismo é usado e como ele avalia as coisas. Ou talvez algo semelhante ao diagrama de pipeline do OpenGL ( openglinsights.com/pipeline.html ). Em seguida, eu fazia uma pesquisa no Google Images por "Diagrama do mecanismo de física" para ver como as outras pessoas fazem isso! ;)
FrustratedWithFormsDesigner

4
Por "um diagrama UML", você provavelmente quer dizer um diagrama de classes? O diagrama de classes é um dos 7 diagramas estruturais na UML. Existem também 7 tipos de diagramas de comportamento.
Vem de

Primeiro de tudo, você precisa entender muito bem o mecanismo de física; cada pequeno detalhe e como as coisas funcionam juntas. Nada a ver com programação. Em seguida, você tenta modelá-lo em entidades de programação (classes) e interações. Você pode usar as ferramentas que desejar (até esboços e anotações escritas à mão). Então, você cria suas aulas uma de cada vez. Comece escrevendo um aplicativo de console. Você pode usar testes de unidade / classe para se certificar de que suas classes pequenas trabalhar e fazer o que você espera
John Kouraklis

6
Na minha experiência, programadores profissionais não usam documentos ou diagramas de design para projetar coisas. Talvez em um quadro branco. Com linguagens de programação contemporâneas, os designs estão na cabeça e no código. Os documentos ou diagramas de design são mais frequentemente usados ​​para comunicação. Com base na sua descrição, meu palpite é que seu design precisa ser decomposto.
JimmyJames

1
"Um diagrama de classes UML não é apropriado para o design de um mecanismo de física." Por que não? As aulas são sobre separação de preocupações. Qualquer sistema pode ser dividido em componentes com funções distintas, e esses componentes geralmente podem ser transformados em classes.
precisa

Respostas:


29

As listas de tarefas são coisas maravilhosas.

Eu não estou falando sobre // #TODO: blá blá comentários. Quero dizer, receba um caderno honesto com Deus.

Você nunca sabe quando se lembrará de algo importante a fazer. Um notebook fica quieto e permite que você pense sem reclamar sobre como sua letra não será compilada. Algumas das minhas melhores ideias acontecem no banheiro (sim, eu possuo um caderno à prova de água, mas você não precisa ir tão longe).

Você pode obter tamanhos de bolso que são costurados (não colados) para que não se desmoronem no seu bolso. Não conseguiu uma fantasia com uma marca de livro embutida? Fita, tesoura, fita e ninguém jamais saberá.

Quando uma ideia surge, anote-a. Desenhe caixinhas ao lado de cada ideia e você poderá marcá-la facilmente como concluída. Coloque uma caixa na parte superior da página e você saberá quando a página está pronta.

Que acesso seqüencial não é bom o suficiente para você? Sim, eles fazem pastas de bolso também. Tudo isso pode parecer um pouco demais, mas é melhor do que se afogar nas notas postadas ou tentar capturar tudo em Jira.

Não deixe as coisas meio implementadas

Mantenha suas melhorias pequenas e viáveis. Não comece nada que não possa ser terminado de uma só vez. Se for grande demais para isso, divida-o em etapas menores. Sempre deixe o código que compila e passa nos testes. Ah, e não deixe de passar nos testes que você nunca viu falhar. Fazer um teste passar e falhar é como você o testará.

Pare de pensar que você precisa de todo o design no papel

O que você precisa fazer é capturar seu plano em evolução. Você não sabe como as coisas vão ficar quando terminar, então pare de fingir que sim. Capture o que você descobriu da melhor maneira possível. Use um guardanapo e giz de cera, se necessário. Poucas pessoas entendem 90% da UML de qualquer maneira. Use da maneira que puder para mostrar o que você precisa mostrar. Eu me concentro em mostrar minhas interfaces e o que sabe sobre o que.

Escreva notas quando parar de codificar

No momento em que você tira os dedos das teclas, é a última vez que entende o que fez (e o que planejou), bem como faz agora. Capte esse entendimento da melhor maneira possível em algumas anotações. Se tudo o que você tem são comentários, você ainda estará ligado ao computador e provavelmente deixará uma poça na cadeira. Novamente, ter um notebook é uma coisa incrível.

Dessa forma, você pode pousar seu cérebro graciosamente, salvar sua bexiga e decolar novamente mais tarde, sem recorrer à cafeína e aos dentes rangendo.


(Como um notebook honesto que também é inteligente, o modo Emacs Org funciona bem. Uma ferramenta semelhante, até mesmo um rastreador de problemas, pode funcionar bem, dependendo dos processos. Um notebook em papel é ótimo para transportar, e permite gráficos rápidos e fotos, o que é ótimo enquanto pensamos.)
9000

6
+1 para Don't start anything that can't be finished in one sitting. If it's to big for that then break it down into smaller steps.. É uma das coisas mais importantes que aprendi na indústria.
Akshat Mahajan

8

"Tudo deve ser construído de cima para baixo, exceto pela primeira vez", dizem eles.

Eu começaria do nível mais baixo (por exemplo, matemática básica de vetores) e me certificara de entender bem e de ter uma boa cobertura de teste. Depois, construía mais uma camada, permitindo operações mais abstratas (por exemplo, grupos / entidades, detecção de colisões, mecânica de colisões). Mais uma vez, eu o cobriria com testes; isso me ajudaria a pensar nos casos de uso reais dessas abstrações no mecanismo.

A menos que você tenha um entendimento muito bom de todo o mecanismo (por exemplo, ao reimplementar um mecanismo existente bem conhecido), geralmente é bom ter essas camadas; permite que você pense em uma camada específica em termos da camada anterior, e geralmente não muito mais profunda. Você pode experimentar e criar uma camada com novas abstrações úteis; o que prova ser prático na realidade muitas vezes se desvia das idéias iniciais.

Esperamos que cada camada seja pequena o suficiente para que você não precise de um diagrama complicado ou que seja fácil criar um diagrama útil.

Nunca encontrei um diagrama de código complexo que fosse útil. Porém, os diagramas de interação e ciclo de vida são úteis. Muitas vezes, um diagrama como esse é restrito a 1-2 camadas e, portanto, é simples.

O que eu geralmente acho mais valioso são as descrições e garantias de interface fornecidas por cada nível. Por exemplo, o formato da matemática vetorial e o que acontece nos erros numéricos; o formato das descrições de objetos maiores (sempre convexo? sempre no sentido horário ?, como se cruzam? etc), os parâmetros mecânicos da interação (como o tempo avança? como a massa é manipulada? o momento é sempre preservado? como são calculadas as forças)? interações apropriadas (como lidar com o atrito? deformação? fragmentação? transformar a energia mecânica em perdas de calor é algo?).

Cada camada deve ser pequena o suficiente para ter uma quantidade observável de coisas que introduz e garante que fornece. Essa descrição pode até ser redigida sem que nenhum código de implementação seja gravado (ainda). Isso diminui a chance de determinar que você fez algo terrivelmente errado com três camadas de profundidade; se o fizesse, já seria visível no máximo duas camadas de profundidade.


Gosto de construir o código de baixo para cima, criando camadas que se tornam cada vez mais expressivas do seu conjunto de problemas. Mas não pense que você as acertará na primeira vez. Depois de começar a usar uma camada para implementar itens mais avançados, você encontrará problemas com sua API e precisará voltar e alterá-la. Está bem.
precisa saber é o seguinte

4

Faça diagramas da arquitetura! Os diagramas de pipeline do OpenGL FrustratedWithFormsDesigner postados nos comentários são um ótimo exemplo para o fluxo do programa , mas esse é apenas um tipo de diagrama que pode ser útil.

Ao criar diagramas, você deseja tornar o entendimento do código simples e intuitivo; isso pode abranger conceitos de alto nível (como a linha superior de nós no diagrama de pipeline do OpenGL, dizendo algo) ou detalhes técnicos muito granulares (como um gráfico de chamada de função completa).

Idealmente, sua documentação também deve facilitar o código para outras pessoas entenderem; isso pode facilitar coisas como revisões de código ou colaboração de código aberto. Procure por grandes projetos para ver como eles conseguem isso - ao trabalhar com centenas de milhares ou milhões de linhas de código, entender como o programa funciona sem ter que lê-lo é extremamente importante para acompanhar a base de código ou apresentá-la a outras pessoas. . O repositório Vim, com 1,3 milhão de LOC, possui uma ótima documentação de alto nível (IMO) para isso em /src/README.txt . Introduz:

  • Qual código em cada arquivo faz
  • Variáveis ​​globais importantes e seus valores
  • O que acontece no loop principal e quais são as funções que ele chama
  • O que acontece em cada um dos modos e as principais funções que os tratam
  • O que são recursos de depuração nativos

Se eu quiser contribuir com um patch, geralmente sei qual arquivo eu preciso modificar para alcançar meus objetivos sem muito esforço.

Um dos melhores recursos do Vim /src/README.txté como é fácil encontrar e quão abrangente é; não é granular em nenhum sentido, mas se você clicar na srcpasta no Github, ela será carregada automaticamente e dará instruções para encontrar outro código ou documentação. Compare isso com o repositório Powershell, que procurei por exemplo, mas não consegui encontrar nenhum arquivo ou arquivos equivalentes aos do Vim /src/README.txt. (Um mau sinal para um projeto com 988 mil LOC!)

Algumas coisas que você pode querer diagramar ou documentar incluem:

  • Fluxo conceitual do programa (O que o programa realiza e em que ordem?)
  • Gráfico de chamada de função / fluxo de programa implementado (como o programa alcança seus objetivos? Que funções são chamadas ou que classes são criadas?)
  • Qual código está em quais arquivos? Qual é o esquema organizacional e quais regras você possui para determinar para onde vai uma nova função? Se você possui um forte esquema organizacional, saberá qual arquivo procurar uma determinada função ou classe será fácil, mesmo sem um recurso de "localização em todo o projeto" do tipo IDE ou do tipo IDE.
  • De maneira semelhante, quais arquivos incluem quais outros arquivos (relacionados a um gráfico de chamada de função)?
  • Quais classes herdam de quais outras classes? Qual é o objetivo de cada aula?

Como você pode fazer esses diagramas? No seu nível, e nos primeiros rascunhos, lápis e papel são provavelmente o melhor / mais rápido método. Quando diagramas e documentação se tornam mais refinados, você pode procurar:

  • Dot / Graphviz, um conjunto de programas para gerar gráficos a partir de .dotarquivos.
  • LaTeX / TikZ, uma ferramenta muito complexa e detalhada para gerar gráficos ou imagens de qualquer tipo - pode ser muito pesada para as suas necessidades, especialmente porque todo o posicionamento dos nós é manual, mas deve ser lembrado, especialmente se você planeja escrever um papel ou qualquer coisa desse tipo mais tarde.
  • Para C, o gson egyptconecta gcce gera um .dotgráfico de chamada. Pode ser automatizado ou incorporado em um makecomando, o que é legal!
  • De maneira semelhante, o GNU cflowpode gerar gráficos de chamada somente de texto para C. Ferramentas equivalentes podem existir para outros idiomas, embora você possa se afastar das ferramentas automatizadas em geral - não criar o gráfico manualmente pode dificultar sua compreensão do código ou fornecer uma informação inadequada. nível complexo de detalhes (saber quais funções chamam printf()geralmente não ajuda).

Estou realmente preocupado em ter uma boa documentação, mas, por enquanto, parei de fazer a documentação porque meu código está constantemente mudando para criar novos algoritmos e tentativas de fazer alguma coisa. Por exemplo, no código que detecta a detecção contínua de colisões, mudei várias vezes de armazenamento de posições anteriores nas classes Body para calcular a posição anterior a partir do movimento do Body. Essa falta de profissionalismo se deve ao fato de eu ter projetado a coisa durante a programação, porque quando eu projeto algo no meu mecanismo de física, quero verificar se é realmente possível.
Inverno

Acho que devo considerar este projeto experimental e reescrevê-lo do zero com o protótipo que fiz, mas fiz um grande esforço para torná-lo limpo o suficiente para mantê-lo sem ter que reescrever tudo.
Winter

0

Tente usar um diagrama baseado em redes de Petri. É possível converter o diagrama em programas de computador de maneira sistemática e é possível integrar diagramas de alto nível com diagramas de baixo nível.

Referências

Elementos de rede e anotações: uma linguagem de programação visual de uso geral (2016). Disponível em https://www.academia.edu/31341292/Net_Elements_and_Annotations_A_General-Purpose_Visual_Programming_Language .

Elementos de rede e anotações para programação de computadores: cálculos e interações em PDF (2014). Disponível em https://www.academia.edu/26906314/Net_Elements_and_Annotations_for_Computer_Programming_Computations_and_Interactions_in_PDF .

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.