I ylläpitää vanhaa pythoniin kirjoitettua koodipohjaa. Erityisesti on monimutkainen koodikappale, joka moduulista kutsuu muita toimintoja muista moduuleista, jotka kutsuvat muita toimintoja ja niin edelleen. Se ei ole OOP, vain toiminnot ja moduulit.
Olen yrittänyt seurata, missä virtaus alkaa ja päättyy milloin tahansa, kun kutsun päätoimintoa, mutta minusta on mielestäni tehtävä piirtää Tämä johtuu siitä, että eksyn alipuheluihin.
Minua huolestuttaa se, että kukin toiminto kutsuu useita ulkoisia toimintoja kehossaan tehtävänsä suorittamiseksi ja arvon palauttamiseksi soittajalle.
Kuinka voin piirtää tämän? Tarkoittaisin, millainen kaavio / kuva sopisi dokumentoimaan tällainen käyttäytyminen / koodi?
Joten en usko, että olisi hyödyllistä piirtää UML-kaavio , ei vuokaavio. Ehkä puhelukaavio?
Kommentit
- doxygen – luo puhelu- / soittajakaaviot, I ' En ole varma kuinka paljon tukea sillä on pythonilla. Tiedän, että voit dokumentoida sille python-koodin.
- Olen ' kokeillut pycallgraphia, mutta se ' s aivan liian monimutkainen / liian syvä käyttää sitä. Tämä johtuu koodini monimutkaisuudesta, koska se sekoittaa tavallisen pythonin djangoon ja ulkoisen kutsun API-URL-osoitteeseen. Siksi halusin piirtää sen käsin vain ottaen huomioon tarvitsemani osan. Ongelmana on, että en tiedä ' en tiedä millaista kuvaajaa tulisi käyttää järjestelmän täydelliseen ymmärtämiseen
- jos tämä vain auttaa sinua ymmärtämään sitä , piirrä vain mikä tulee luonnostaan. Voit aina siivota sen myöhemmin, jos se ' siirtyy viralliseen dokumentaatioon.
Vastaa
Luulen, että etsit täällä järjestyskaaviota . Näiden avulla voit visualisoida järjestyksen, jossa eri moduulit soittavat toisistaan nuolien avulla.
Yhden rakentaminen on yksinkertaista:
- Piirrä lähtöluokka katkoviivalla sen alle.
- Piirrä seuraava luokka / menetelmä puhelun jäljityksessä, jonka alapuolella on katkoviiva.
- Yhdistä linjat nuolella, joka on pystysuunnassa viimeisen piirtämäsi nuolen alapuolella.
- Toista vaiheet 2-3 kaikille puheluille jäljessäsi
Esimerkki
Oletetaan, että meillä on seuraava koodi, jolle haluamme luoda sekvenssikaavion:
def long_division(quotient, divisor): solution = "" remainder = quotient working = "" while len(remainder) > 0: working += remainder[0] remainder = remainder[1:] multiplier = find_largest_fit(working, divisor) solution += multiplier working = calculate_remainder(working, multiplier, divisor) print solution def calculate_remainder(working, multiplier, divisor): cur_len = len(working) int_rem = int(working) - (int(multiplier) * int (divisor)) return "%*d" % (cur_len, int_rem) def find_largest_fit(quotient, divisor): if int(divisor) == 0: return "0" i = 0 while i <= 10: if (int(divisor) * i) > int(quotient): return str(i - 1) else: i += 1 if __name__ == "__main__": long_division("645", "5")
Ensimmäinen asia, jonka piirrämme, on lähtökohta (main
), joka yhdistetään menetelmään long_division
Huomaa, että tämä luo ruudun long_ jako, mikä tarkoittaa menetelmäkutsun laajuutta. Tässä yksinkertaisessa esimerkissä ruutu on koko kaavion korkeus johtuen siitä, että tämä on ainoa suoritettava asia.
Nyt soitamme numeroon find_largest_fit
löytääksesi suurimman moninkertaisen, joka sopii työlukumme. ja palauttaa sen meille. Piirretään viiva long_division
: stä find_largest_fit
toiseen kenttään merkitsemään funktiokutsun laajuutta. Huomaa, kuinka laatikko päättyy, kun kerroin palautetaan; tämä on funktioiden laajuuden loppu!
Toista muutama kerta suuremmalle numerolle, ja kaavion pitäisi näyttää tältä:
Huomautuksia
Voit valita, haluatko merkitä puhelut siirretyillä muuttujien nimillä vai niiden arvoilla, jos haluat vain dokumentoi yksi tietty tapaus. Voit myös näyttää rekursiota itse kutsuvan toiminnon avulla.
Lisäksi voit näyttää käyttäjiä täällä ja pyytää heitä ja näyttää heidän panoksensa järjestelmään riittävän helposti. Se on melko joustava järjestelmä, jonka mielestäni pidät melko hyödyllisenä!
Kommentit
- Kiitos, tiedän sekvenssikaavion, mutta se mielestäni se sopii paremmin oop. Minun tapauksessani asiat ovat hieman sotkuisempia, mikä tarkoittaa, että esimerkiksi minulla on noin 20 toimintoa / auttajaa hajallaan useiden moduulien ympäri. Voisinko määritellä moduulin, johon funktio kuuluu? Ottaen huomioon, että jotkut toiminnot nimetään uudelleen myös tuonnin aikana.
- Sanoisin, että sillä ei ole väliä kuinka monta moduulia sinulla on – edes esimerkki ei ole lainkaan oop. Nimeä ne vain, jotta löydät ne myöhemmin, ModuleA / function1, ModuleB / Function2 jne. 20 toiminnolle se tulee olemaan suurempi, mutta ei varmasti mahdotonta ymmärtää. Voit ajatella myös, että lopetat funktion rivin viimeisen käyttökerran jälkeen ja laitat toisen funktion rivin sen alle säästääksesi kaaviossa vaakasuoraa tilaa.
Vastaa
Mielestäni puhelukaavio olisi sopivin visualisointi.Jos päätät olla tekemättä sitä käsin, siellä on mukava pieni työkalu nimeltä pyan
, joka tekee staattisen analyysin python-tiedostosta ja voi luoda visualisoidun kutsukaavion graphviz-pisteen avulla. tiedosto (joka voidaan tehdä kuvaksi). On ollut pari haarukkaa, mutta täysin varustellun näyttää olevan https://github.com/davidfraser/pyan .
Sinun tarvitsee vain määrittää kaikki käsiteltävät tiedostot, kun suoritat komennon:
python ~/bin/pyan.py --dot a.py b.py c.py -n > pyan.dot; dot -Tpng -opyan.png pyan.dot
tai
python ~/bin/pyan.py --dot $(find . -name "*.py") -n > pyan.dot; dot -Tpng -opyan.png pyan.dot
Voit tehdä kaaviosta puhtaamman ”-n”: llä, joka poistaa rivit, joissa funktio määritettiin.