Organisera kod/program -python

Permalänk
Medlem

Organisera kod/program -python

Hej Swec,
Det är så att jag skriver ett program som jag tycker är stort iaf(för mig som hobby-kodare är det stort^^).
Det innehåller ett grafiskt ui(PyQT) med en massa knappar, labels etc.. När man trycker på en knapp så kallas funktioner som gör en massa beräkningar, ändrar texten på labels i ui't, skickar info via seriellt gränssnitt till en Arduino m.m.
Som det ser ut i skrivande stund är att jag har en huvud-fil samt en ui-fil. Thats it. Vad jag börjar märka är att detta håller på att barka lite.
Är för tillfället upp i en 1000 rader kod i huvudfilen fördelat på en ~40 funktioner eller så vilket gör att jag tycker det börjar bli lite småjobbigt att "jobba" i filen.
Vad jag skulle vilja ha är att lägga funktioner som hör samman i separata filer och importera dessa i huvudfilen. Detta är väl inga problem egentligen men i min huvudfil så har jag kanske ~30 globala variablar(importeras från en "option"-fil) som jag använder mig utav i diverse funktioner. Lägger man funktionerna i separata filer så får de ju inte tillgång till dessa globala variablar. Givetvis kan man slänga med de intressanta variablerna när man anropar funktionen men då känns det lite rörigt då jag kanske skulle slänga med en 15 variabler vid ett anrop.

Oavsett så vill jag lösa detta då jag i slutändan när programmet är färdigt kanske kommer hamna på en 3000 rader kod och 100 funktioner eller så vilket givetvis kommer innebära en riktigt rörig huvudfil.

Så hur ska jag tänka, vart kan jag läsa om "kod-organisering"
/bardbard

Visa signatur

Bara gammalt skräp...

Permalänk
Medlem

Jag kan i princip inget om Python, men det bör väl finnas någon typ av "Collections" som du kan använda för att organisera alla dessa variabler och sedan bara skicka denna "Collection" till funktionerna.

Jag gjorde en snabb sökning på Google och det finns ju t.ex namedtuple som du kanske kan använda.
(I t.ex C/C++ hade jag kanske använt en struct i ditt fall).

Jag skulle råda till att tänka mer objektorienterat och designa om programmet för att minska antalet globala variabler.

Permalänk
Medlem

Ja nu när du säger det så skulle jag säkert kunna minska de globala variablarna drastiskt.
Här är min settings-fil:

---General options--- serial activated = False detailed info = True serial adress = /dev/ttyACM0 Force calibration = False Calibration offset = 2.0 ---Pin layout--- X step pin = 1 X dir pin = 2 X enable pin = 3 Y step pin = 4 Y dir pin = 5 Y enable pin = 6 Z step pin = 7 Z dir pin = 8 Z enable pin = 9 X sensor pin = 10 Y sensor pin = 11 Z sensor pin = 12 ---Axis options--- X pitch = 5 X micro step = 4 X steps per revolution = 200 X direction = 1 Y pitch = 5 Y micro step = 4 Y steps per revolution = 200 Y direction = -1 Z pitch = 5 Z micro step = 4 Z steps per revolution = 200 Z direction = -1 X length = 200 Y length = 300 Z length = 100 ---Speed options--- Max speed = 1000 Acceleration = 200 Deacceleration = 200

Dold text

Alla dessa värden lägger jag i globala variabler i dagsläget i min huvudfil. Vissa av värdena använder jag endast en gång så det är väl lite onödigt när man tänker efter. Sen så skulle jag ju faktiskt kunna hämta värdena igen inne i funktioner(de jag behöver) för att slippa skicka med dessa vid funktions-anrop. De ligger ju som "globala" variablar i filen egentligen om man tänker efter...

Men om jag har låt oss säga n filer, main.py, serial_handling.py, n+1.py, n+2.py, n..py
Om jag då i main.py anropar en funktion i serial_handling.py som skapar ett objekt(i detta fall en seriell connection till min Arduino).
Kan jag då senare i main.py anropa en funktion i serial_handling som skickar data över seriellt gränssnitt. Ligger objektet kvar i "minnet" då.
och vidare anropa samma funktion i filen n.py
Exempel med lite pseudokod hur jag skulle vilja ha det:
main.py:

import serial_handling as sh import n sh.setupConnection() sh.writeMessage("Hej") n.sendMessage("Hej från n.py")

serial_handling.py:

def setupConnection(): #Detta vill jag endast göra en gång under hela tiden som programmet körs. #Gör vi detta mer än en gång så startar Arduinon om vilket är dåligt... import serial ser = serial.Serial('/dev/ttyACM0', 9600) def writeMessage(sendThis): ser.write(sendThis)

n.py:

import serial_handling as sh def sendMessage(message): sh.writeMessage(message)

Det har säkert blivit något fel här men vad jag skulle vilja lösa är ovanstående case. Om jag får en lösning på detta skulle jag bli glad då jag misstänker att detta inte skulle fungera i dagsläget då den skulle klaga på att "ser" inte existerar eller något sådant...

Visa signatur

Bara gammalt skräp...

Permalänk

Det kanske är dags att gå över till objektorienterat för att lätta upp trycket lite vid underhåll/påbyggnad.

Visa signatur

Mh-hm!