Jak wizualizować projekt silnika fizyki?


17

Tworzę silnik fizyki, a śledzenie tego wszystkiego staje się coraz trudniejsze. Często po powrocie do kodu po przerwie po prostu nie pamiętam, dlaczego to nie działa. Większość problemów nie jest prostymi błędami programistycznymi, ale wadami projektowymi mojego silnika fizyki. Dlatego właśnie powinienem skończyć projektowanie przed programowaniem.

Potrzebuję jednak sposobu na napisanie na papierze całego projektu mojego silnika fizyki. W przeciwnym razie jutro po prostu zapomnę i znów się zgubię. Diagram klas UML w ogóle nie jest odpowiedni do projektowania silnika fizyki. Naprawdę nie dbam o zajęcia, ale sam proces. Nie uważam diagramu procesu biznesowego za bardzo przydatny, ponieważ modelowanie jednego kroku (ramki) mojego procesu nie pomoże mi zrozumieć końcowego zachowania mojego silnika na wielu etapach.

Jakiego schematu powinienem użyć, aby pomóc mi śledzić proces? Jakiego rodzaju profesjonaliści używają diagramów do stworzenia silnika fizyki?


4
Po pierwsze, zasugerowałbym schemat przepływu wysokiego poziomu, aby pokazać, jak używany jest silnik i jak ocenia rzeczy. A może coś podobnego do schematu potoku OpenGL ( openglinsights.com/pipeline.html ). Następnie przeprowadzę wyszukiwanie w Grafice Google „Diagram silnika fizyki”, aby zobaczyć, jak robią to inni! ;)
FrustratedWithFormsDesigner

4
Przez „diagram UML” prawdopodobnie masz na myśli diagram klasowy? Diagram klas jest jednym z 7 schematów strukturalnych w języku UML. Istnieje również 7 rodzajów diagramów zachowań.
PRZYJDŹ OD

Przede wszystkim musisz bardzo dobrze rozumieć silnik fizyki; każdy najmniejszy szczegół i jak wszystko działa razem. Nie ma nic wspólnego z programowaniem. Następnie próbujesz modelować go w jednostkach programujących (klasach) i interakcjach. Możesz używać dowolnych narzędzi (nawet szkiców i odręcznych notatek). Następnie tworzysz swoje zajęcia pojedynczo. Zacznij od napisania aplikacji konsoli. Możesz użyć testów jednostkowych / klasowych, aby upewnić się, że Twoje małe klasy działają i robią to, czego oczekujesz
John Kouraklis,

6
Z mojego doświadczenia wynika, że ​​profesjonalni programiści nie używają dokumentów projektowych ani diagramów do projektowania rzeczy. Może na tablicy. We współczesnych językach programowania projekty są w głowie i kodzie. Dokumenty projektowe lub diagramy są najczęściej używane do komunikacji. Na podstawie twojego opisu zgaduję, że twój projekt musi zostać rozłożony.
JimmyJames

1
„Diagram klas UML w ogóle nie jest odpowiedni do projektowania silnika fizyki”. Dlaczego nie? Zajęcia dotyczą oddzielenia problemów. Każdy system można podzielić na komponenty z odrębnymi rolami, a komponenty te można zwykle podzielić na klasy.
Tanner Swett,

Odpowiedzi:


29

Listy DO ZROBIENIA to cudowne rzeczy.

Nie mówię o // #TODO: komentarze bla bla. Mam na myśli zdobądź szczery notatnik do Boga.

Nigdy nie wiadomo, kiedy zapamiętasz coś ważnego do zrobienia. Zeszyt będzie cicho tam siedział i pozwoli ci myśleć bez narzekania na to, jak twoje pismo ręczne się nie skompiluje. Niektóre z moich najlepszych pomysłów dzieją się w łazience (tak, mam wodoodporny notatnik, ale nie musisz iść tak daleko).

Możesz dostać kieszonkowe, które są szyte (nie klejone), aby nie rozpadły się w kieszeni. Nie udało ci się zdobyć fantazyjnego z wbudowanym znacznikiem książki? Taśma, nożyczki, wstążka i nikt nigdy się nie dowie.

Kiedy pojawi się pomysł, zanotuj go. Narysuj małe pola obok każdego pomysłu, aby łatwo oznaczyć go jako gotowy. Umieść pole u góry strony, a wiesz, kiedy strona jest skończona.

Jaki dostęp sekwencyjny nie jest dla Ciebie wystarczająco dobry? Tak, robią też kieszenie. To wszystko może wydawać się trochę dużo, ale jest lepsze niż utopienie w notatce pocztowej lub próba uchwycenia wszystkiego w Jira.

Nie zostawiaj rzeczy w połowie zaimplementowanych

Dbaj o to, by Twoje ulepszenia były małe i osiągalne. Nie zaczynaj niczego, czego nie da się ukończyć za jednym razem. Jeśli jest na to za duży, podziel go na mniejsze kroki. Zawsze zostawiaj kod, który się kompiluje i przechodzi testy. Aha i nie zostawiaj pozytywnych testów, których nigdy nie widziałeś. Wykonanie testu zarówno pozytywnego, jak i negatywnego jest sposobem na przetestowanie testu.

Przestań myśleć, że potrzebujesz całego projektu na papierze

Musisz uchwycić swój ewoluujący plan. Nie wiesz, jak wszystko będzie wyglądać, kiedy skończysz, więc przestań udawać, że tak. Uchwyć to, co odkryłeś, jak potrafisz. W razie potrzeby użyj serwetki i kredki. Zresztą niewiele osób rozumie 90% UML. Użyj wszelkich możliwych sposobów, aby pokazać to, co musisz pokazać. Koncentruję się na pokazaniu moich interfejsów i tego, co wie o czym.

Pisz notatki, gdy przestaniesz kodować

Moment, w którym zdejmujesz palce z klawiszy, po raz ostatni zrozumiesz, co zrobiłeś (i co zaplanowałeś) tak jak teraz. Uchwyć to zrozumienie najlepiej, jak potrafisz, w niektórych notatkach. Jeśli masz tylko komentarze, nadal jesteś przywiązany do komputera i prawdopodobnie zostawisz kałużę na krześle. Ponownie, posiadanie notebooka jest niesamowitą rzeczą.

W ten sposób możesz z wdziękiem wylądować w mózgu, uratować pęcherz i ponownie wystartować później, bez uciekania się do kofeiny i zgrzytania zębami.


(Jako uczciwy notebook, który jest również inteligentny, tryb Emacs Org działa dobrze. Podobne narzędzie, nawet narzędzie do śledzenia problemów, może działać dobrze, w zależności od procesów. Papierowy notatnik jest świetny do noszenia i pozwala na szybkie tworzenie wykresów i zdjęcia, co jest świetne podczas myślenia.)
9000

6
+1 dla 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.. To jedna z najważniejszych rzeczy, których nauczyłem się w branży.
Akshat Mahajan

8

„Wszystko powinno być budowane odgórnie, z wyjątkiem pierwszego razu”, mówią.

Zaczynam od najniższego poziomu (np. Podstawowej matematyki wektorowej) i upewniłem się, że dobrze ją rozumiem i ma dobry zasięg testowy. Następnie zbudowałbym jeszcze jedną warstwę, pozwalając na więcej operacji abstrakcyjnych (np. Grupy / byty, wykrywanie kolizji, mechanika kolizji). Znowu objąłbym to testami; pomogłoby mi to pomyśleć o rzeczywistych przypadkach użycia tych abstrakcji w silniku.

O ile nie bardzo dobrze rozumiesz cały silnik (np. Kiedy ponownie wdrażasz dobrze znany istniejący silnik), zwykle dobrze jest mieć te warstwy; pozwala myśleć na konkretnej warstwie w kategoriach poprzedniej warstwy i zwykle niewiele głębiej. Możesz eksperymentować i budować warstwę z nowymi przydatnymi abstrakcjami; to, co okazuje się praktyczne w rzeczywistości, często odbiega od początkowych pomysłów.

Mamy nadzieję, że każda warstwa jest na tyle mała, że ​​nie potrzebujesz do niej skomplikowanego schematu lub łatwo jest znaleźć przydatny.

Nigdy nie spotkałem złożonego diagramu kodu, który byłby przydatny. Jednak przydatne są diagramy interakcji i cyklu życia . Dość często taki schemat jest ograniczony do 1-2 warstw, a zatem jest prosty.

To, co zwykle najbardziej cenię, to opisy interfejsów i gwarancje zapewniane przez każdy poziom. Np. Format matematyki wektorowej i co dzieje się w przypadku błędów numerycznych; format opisów większych obiektów (zawsze wypukły? zawsze zgodny z ruchem wskazówek zegara ?, jak przecinać się itp.), parametry mechaniczne interakcji (jak postępuje czas? w jaki sposób przetwarzana jest masa? czy pęd jest zawsze zachowywany? jak obliczane są siły?) właściwe interakcje (jak poradzić sobie z tarciem? deformacją? fragmentacją? czy przekształcanie energii mechanicznej w straty ciepła jest czymś?).

Każda warstwa powinna być na tyle mała, aby mieć zauważalną ilość rzeczy, które wprowadza i gwarantuje. Opis ten można nawet napisać bez pisania kodu implementacyjnego (jeszcze). Zmniejsza to szansę ustalenia, że ​​zrobiłeś coś okropnie złego na trzech warstwach; gdyby tak było, byłoby to widoczne już co najwyżej na dwóch warstwach.


Lubię budować kod oddolnie, dzięki czemu warstwy, które stają się coraz bardziej wyraziste dla twojego zestawu problemów. Ale nie sądzę, że za pierwszym razem wszystko będzie dobrze. Kiedy zaczniesz używać warstwy do implementacji rzeczy wyżej, znajdziesz problemy z interfejsem API i będziesz musiał wrócić i go zmienić. W porządku.
Justsalt,

4

Twórz diagramy architektury! OpenGL rurociąg Schematy FrustratedWithFormsDesigner pisał w komentarze są doskonałym przykładem dla programu przepływu , ale to tylko jeden rodzaj wykresu, które mogą być użyteczne.

Projektując diagramy, chcesz uczynić zrozumienie kodu prostym i intuicyjnym; może to obejmować zarówno koncepcje wysokiego poziomu (jak górna linia węzłów na schemacie potoku OpenGL, mówiąc coś), jak i bardzo szczegółowe szczegóły techniczne (takie jak wykres wywołania pełnej funkcji).

Idealnie, twoja dokumentacja powinna również ułatwić zrozumienie kodu innym osobom; może to ułatwić przeglądanie kodu lub współpracę typu open source. Spójrz na duże projekty, aby zobaczyć, jak to osiągają - podczas pracy z setkami tysięcy lub milionami wierszy kodu zrozumienie, jak działa program bez konieczności czytania, jest niezwykle ważne dla śledzenia bazy kodu lub przedstawiania go innym osobom . Repozytorium Vima z 1,3 milionami LOC ma całkiem dobrą dokumentację wysokiego poziomu (IMO) na ten temat w /src/README.txt . Wprowadza:

  • Co robi kod w każdym pliku
  • Ważne zmienne globalne i ich wartości
  • Co dzieje się w głównej pętli i jakie funkcje nazywa
  • Co dzieje się w każdym z trybów i główne funkcje, które je obsługują
  • Jakie są natywne funkcje debugowania

Jeśli chcę dodać łatkę, ogólnie wiem, który plik muszę zmodyfikować, aby osiągnąć swoje cele bez większego kopania.

Jedną z najlepszych cech Vima /src/README.txtjest łatwość jego znalezienia i wszechstronność; w żadnym sensie nie jest szczegółowy, ale jeśli klikniesz srcfolder w Github, zostanie on automatycznie załadowany i poda kierunek wyszukiwania innego kodu lub dokumentacji. Porównaj to z repozytorium Powershell, którego szukałem na przykład, ale nie byłem w stanie znaleźć żadnego równoważnego pliku lub plików do Vima /src/README.txt. (Zły znak dla projektu z 988 tysiącami LOC!)

Niektóre rzeczy, które możesz chcieć schemat lub dokumentować to:

  • Koncepcyjny przebieg programu (co program osiąga i w jakiej kolejności?)
  • Wdrożony wykres przepływu / wywołania funkcji programu (W jaki sposób program osiąga swoje cele? Jakie funkcje są wywoływane lub tworzone klasy?)
  • Jaki kod jest w jakich plikach? Jaki jest schemat organizacyjny i jakie masz zasady określania, gdzie idzie nowa funkcja? Jeśli masz silny schemat organizacyjny, łatwo będzie wiedzieć, w którym pliku szukać danej funkcji lub klasy, nawet bez IDE lub podobnej do IDE funkcji „znajdź cały projekt”.
  • Podobnie, które pliki obejmują które inne pliki (związane z wykresem wywołania funkcji)?
  • Które klasy dziedziczą po jakich innych klasach? Jaki jest cel każdej klasy?

Jak zrobić te diagramy? Na twoim poziomie i przy pierwszych szkicach ołówek i papier są prawdopodobnie najlepszą / najszybszą metodą. Kiedy diagramy i dokumentacja stają się bardziej dopracowane, możesz przyjrzeć się:

  • Dot / Graphviz, zestaw programów do generowania wykresów z .dotplików.
  • LaTeX / TikZ, bardzo złożone i pełne narzędzie do generowania wykresów lub zdjęć wszelkiego rodzaju - może być zbyt trudne dla twoich potrzeb, zwłaszcza, że ​​wszystkie pozycjonowanie węzłów jest ręczne, ale należy o tym pamiętać, szczególnie jeśli planujesz napisać papier lub cokolwiek innego tego rodzaju później.
  • W przypadku C gson egyptprzechwytuje gcci generuje .dotwykres połączeń. Może być zautomatyzowany lub osadzony w makepoleceniu, co jest miłe!
  • W związku z tym GNU cflowmoże generować wykresy wywołań tylko dla tekstu w języku C. W przypadku innych języków mogą istnieć równoważne narzędzia, chociaż ogólnie możesz zrezygnować z narzędzi automatycznych - nie tworzenie wykresu ręcznie może utrudniać zrozumienie kodu lub dostarczać niewłaściwe złożony poziom szczegółowości (wiedza o tym, które wywołanie funkcji printf()jest zwykle bardzo nieprzydatna).

Naprawdę martwię się o dobrą dokumentację, ale na razie przestałem robić dokumentację, ponieważ mój kod ciągle się zmienia, aby wprowadzić nowe algorytmy i próby zrobienia czegoś. Na przykład w kodzie wykrywającym ciągłe wykrywanie kolizji wielokrotnie przełączałem się z zapisywania poprzednich pozycji w klasach Body na obliczanie poprzedniej pozycji na podstawie ruchu Body. Ten brak profesjonalizmu wynika z tego, że projektuję to podczas programowania, ponieważ kiedy projektuję coś w silniku fizyki, chcę sprawdzić, czy to rzeczywiście możliwe.
Zima

Myślę, że powinienem rozważyć ten projekt jako eksperymentalny, a następnie przepisać go od zera za pomocą prototypu, który wykonałem, ale wkładam wiele wysiłku, aby był wystarczająco czysty, aby utrzymać go bez konieczności przepisywania wszystkiego.
Zima

0

Spróbuj użyć diagramu opartego na sieciach Petriego. Możliwe jest systematyczne tłumaczenie schematu na programy komputerowe, a także integracja diagramów wysokiego poziomu ze schematami niskiego poziomu.

Bibliografia

Elementy sieciowe i adnotacje: język programowania wizualnego ogólnego przeznaczenia (2016). Dostępne na https://www.academia.edu/31341292/Net_Elements_and_Annotations_A_General-Purpose_Visual_Programming_Language .

Elementy sieciowe i adnotacje do programowania komputerowego: obliczenia i interakcje w PDF (2014). Dostępne na https://www.academia.edu/26906314/Net_Elements_and_Annotations_for_Computer_Programming_Computations_and_Interactions_in_PDF .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.