6 svar
205 visningar
Qetsiyah 6567 – Livehjälpare
Postad: 23 okt 2020 12:49

Är globala konstanter dåliga?

Hej, jag förstår varför globala variabler är dåliga, men är globala konstanter dåliga?

En gång skrev jag en översättningsmodul (där jag definierade några påhittade språk man kunde översätta till) där jag i globala scopet definierade vokaler och konsonanter (med listor). Är det dåligt? Hur annars kunde jag gjort det? 

https://www.pluggakuten.se/trad/stranghantering-oversattning-till-fiktiva-sprak/

Tigster 271
Postad: 23 okt 2020 13:26 Redigerad: 23 okt 2020 13:29

Det hade varit ett ypperligt tillfälle för dig att lära dig klasser. :)
class Translator:
     self.vowels = ['a', 'o', 'u', 'å', ...]
     def rovarSpraket(self, stringToTranslate):
            """
                 Din kod
            """
    def annatSprak(self, stringToTranslate):


osv. :)

 

Angående globala variabler så är de generellt sett skräp. Makron (#define VAR VALUE) är helt ok. (Och bidrar till att man enkelt kan modifiera kod)

Du hade också kunnat deklarerat dina vokaler i main och skickat med dem som en parameter i de funktioner de behövs:

def someLanguage(vowels, stringToTranslate)

def main():
       vowels = ['a', 'o', 'u', 'å', ...]
       ...
       someLanguage(vowels, "Hej hopp")

vilhelm 1 – Fd. Medlem
Postad: 3 nov 2020 16:07

Att definiera makron som man gör i C

#define VAR VALUE

går ju inte att göra riktigt på samma sätt i Python. Rätta mig om jag har fel, men globala konstanter brukar på Python-aktigt sätt definieras med stora bokstäver, t.ex:

SECRET_KEY = os.environ.get("SECRET_KEY, None)

Python är ju inte typat så SECRET_KEY i detta fallet kommer ju faktiskt inte vara "en konstant" på samma sätt som "const" i många språk gör att variabeln inte kan modifieras. I python finns det inget som stoppar dig.

 

Jag tycker inte man alltid ska vara rädd för globala variabler, även om det lätt kan bli lite rörigt. I ditt fall låter det som att det inte är särskilt big deal att använda globala variabler, så länge du skiljer de globala från lokala och konstanter från icke-konstanter 😃

Lindehaven 820 – Lärare
Postad: 3 nov 2020 16:52

Ja, vilhelm har rätt i de faktum att Python inte har riktiga konstanter. En av Pythons Akilles-hälar (om man nu kan ha fler än en). Man bör följa riktlinjerna för namngivning av variabler som är avsedda att vara konstanter.

Men jag avråder starkt från att använda globala variabler. De är, som Tigster skrev, generellt sett skräp.

Laguna 30218
Postad: 3 nov 2020 17:03 Redigerad: 3 nov 2020 17:07

Om man har globala variabler märker man att det är besvärligt att bryta ut och organisera om kod, och att börja använda flera instanser där man tidigare hade bara en (speciellt när det jag kallar instans inte var en klass utan bara de samlade data som hanteras av koden i en fil).

Edit: jag menar, man lär sig handgripligen varför det är en dålig idé med globala variabler när man gör så. Innan dess är det inte lika tydligt.

Lindehaven 820 – Lärare
Postad: 3 nov 2020 17:10

Om man vill bege sig in i gränslandet mellan Python och C/C++ så kan man använda Cython och där skapa konstanter mha compile-time definitions (som ser ut att vara ungefär detsamma som #define).

Lindehaven 820 – Lärare
Postad: 4 nov 2020 14:26 Redigerad: 4 nov 2020 14:29

Jython Compile-Time Definitions

A compile-time constant can be defined using the DEF statement:

DEF FavouriteFood = u"spam"
DEF ArraySize = 42
DEF OtherArraySize = 2 * ArraySize + 17
Svara
Close