Schreibweise/Geschwindigkeit AutoIt3-SourceCode

  • Hi,

    da ich meinen Coding-Stil momentan umstelle, um schnelleren und übersichtlichern Code zu schreiben, fragte ich mich, ob es nicht irgendwo so etwas wie eine Art "Norm" für AutoIt3-SourceCode gibt. Ich bin auch schnell fündig geworden und zwar hier: User Defined Functions Standard

    Das mit der Bezeichnung von Funktionsnamen war mir vorher schon klar, nicht jedoch folgendes:
    Originalzitat:

    Spoiler anzeigen


    Deutsche Übersetzung: thx GtaSpider

    Spoiler anzeigen


    Bei dieser Gelegenheit will ich einmal den Unterschied zwischen Dim / Global / Local erklären:
    Dim / Global / Local:

    Spoiler anzeigen


    Die Dim/Local/Global Schlüsselwörter führen ähnliche Funktionen aus:
    1. Sie deklarieren eine Variable bevor man sie nutzt (ähnlich zu VBSkript)
    2. Sie erschaffen ein Array

    Dabei sollte beachtet werden, dass Dim nicht mehr benutzt werden sollte, Local nur in Funktionen Sinn macht und Global immer ausserhalb von Funktionen eingesetztv wird. Zudem sollte ganz oben im Skript (unter den includes folgendes eingefügt werden:

    [autoit]

    Opt("MustDeclareVars", 1)

    [/autoit]

    Damit wird gewährleistet, dass Variablen vor ihrer Nutzung explizit deklariert werden müssen.
    Variablen sollten auch immer nach ihrem Zweck benannt werden (am Besten auf Englisch). Beispiel: $iC ist nicht aussagekräftig, $iCounter hindessen schon:

    [autoit]

    Opt("MustDeclareVars", 1)
    Global $as_fnames[2] = ["Klaus", "Hans"]
    Global $f_error = False
    MyFunc(182.57)

    [/autoit] [autoit][/autoit] [autoit]

    Func MyFunc(Const $N_TIME = 0.0)
    Local $i_multiplier = 60

    [/autoit] [autoit][/autoit] [autoit]

    Return ($i_multiplier * $N_TIME)
    EndFunc

    [/autoit]


    Die Frage, die sich mir nun stellt ist, wie benennt man Konstanten (also Variablen, die mit Local Const deklariert wurden...)? Nach der obigen Definition sieht ja jede Variable/Konstante, hier z.B. eine Integerkonstante, so aus:

    [autoit]

    Local Const $iStartIndex = 1

    [/autoit]


    Bisher hatte ich mir angewöhnt, Konstanten immer groß und Variablen immer klein zu schreiben, zudem mit dem jeweiligen Bezeichner und einem "_" davor, z.B.:

    [autoit]

    Local Const $I_STARTINDEX = 1

    [/autoit]

    Dies wäre aber laut dem Standard falsch. Ich möchte ab jetzt meinen Code nach den Standards gestalten, womit aber das Problem bleibt, dass sich Variablen und Konstanten im SourceCode nicht mehr auf Anhieb unterscheiden lassen (Eigentlich nicht so schlimm, würde mich aber interessieren ob es da auch eine bestimmte "Benamsung" gibt).

    Da ich zu Anfang bereits Geschwindigkeit ansprach möchte ich hier noch einmal die wichtigsten Erkenntnisse diesbezüglich wiederholen (hier Verweise ich auf den AutoIT SpeedTester:(

    Spoiler anzeigen


    Wer jetzt von Euch denkt, "Und? Wenn interessiert das nun?", der möge diesen Thread ignorieren. Ich bin jedoch immer dafür SourceCode einheitlich (nicht nur meinen untereinander, sondern auch in Bezug zu Anderem) zu halten und schneller zu machen.

    EDIT:
    - Deutsche Übersetzung der Variablenbenennung hinzugefügt (thx GtaSpider ).
    - Erklärung zu Dim / Global / Local hinzugefügt.

    Einmal editiert, zuletzt von teh_hahn (10. September 2007 um 11:50)

    • Offizieller Beitrag

    Hi,

    ich glaube für Autoit gibt es keinen wirklichen Standard.

    Ein paar Dinge hätte ich aber schon:

    Reihenfolge

    Optionen
    includes
    Deklarationen
    Programm
    Funktionen

    ungefähr in der Reihenfolge.

    Wenn du die Variablen mit s_Test für String und i_Test für Integer usw. bennenst, dann bist du sicherlich schon ganz weit vorne. :)

    Außermde sollten udfs mit einem _ beginnen.

    Bis später, falls mir noch was einfällt.

    So long,

    Mega

    P.S.: Ich kenne es auch so, dass man Konstanten komplett groß schreibt.

  • Hi,

    Die Optionen vor den includes? Das würde doch bedeuten, dass wenn ich Opt("MustDeclareVars", 1) mache und in einer include-Datei nicht alle Variablen/Konstanten deklariert wurden, mir mein Skript abschmiert. Meine Reihenfolge ist:
    1. includes
    2. Options
    3. main-Func
    4. other Funcs

    Du sagtest, für AutoIt gibt es keinen wirklichen Standard. Die Seite, die ich oben verlinkt habe ist aber defakto Standard, da es die Anforderungen des Entwicklers sind um UDFs mit in den AutoIt-Release mit aufzunehmen, von daher würde ich das schon so bezeichnen, oder nicht?

    • Offizieller Beitrag

    HI,

    da gebe ich dir recht - auch wenn man solche Dinge natürlich merken sollte. :D

    Jein, es ist klar, dass JdeB eine Vereinheitlichung anstrebt, um es sich selbst und anderen einfacher zu machen.

    Als Gospel würde ich das aber nicht nehmen.

    Es ist für mich lediglich eine Orientierung / Vorlage.

    So long,

    Mega

    P.S.: Ich benutze z.B. gern return anstatt setError() usw ......

  • Ne, da hast Du schon recht. Interessierte mich halt bloß. Werde auch wohl bei meiner bisherigen Schreibweise bleiben, nur das mit den Variablenpräfixen wie n für numeric werd ich wohl übernehmen.
    Zu Deinem letzten Satz: Stellt sich die Frage, was schneller ist, wenn eine Funktion einen Error zurückgeben soll: :D

    [autoit]

    SetError(1)
    Return (0)

    [/autoit]


    oder

    [autoit]

    Return (SetError(1, 0, 0))

    [/autoit]


    Ich persönlich präferiere das letztere, da platzsparend.

  • Ok, so meinst Du das. Ist natürlich auch eine Möglichkeit... Ich überprüf aber lieber auf

    [autoit]

    If @error Then

    [/autoit]

    bei Funktionen...

    Jedem halt das Seine... ^^

  • also als orientierung ist eine coding-norm schon relativ nützlich und macht es eben einfacher auch fremde quelltexte schneller und leichter zu verstehen.

    vorallem die normung von udf´s finde ich sinnvoll um implementierungen einheitlich zu gestalten und eine gewisse geschwindigkeit der funktionen zu gewährleisten.

    letztendlich denke ich jedoch auch, dass jeder coder eben einen eigenen schreibstil hat und unter verwendung von standardtisierter formatierung die arbeit auch erschwert werden kann....

    naja denkt jeder anders drüber...

    greetz oli

    • Offizieller Beitrag

    Wenn man sich so den Code von erfahrenen Usern anschaut, erkennt man schon eine ähnliche Struktur. Das ergibt sich auch einfach aus dem Handling und häufig hat man auch Erfahrung in anderen Sprachen, die eine straffe Struktur erfordern.
    Ob nun z.B. die Options vor oder nach den Includes kommen ist dabei sicher ziemlich belanglos.
    Ich würde einen Strukturrahmen daher noch weiter fassen:
    1. alle Festlegungen (das umfasst dann Includes, Opt., Deklarationen etc.)
    2. Hauptprogramm
    3. erforderliche Funktionen

    Es macht schon Sinn, den Variablennamen einen Verweis auf den Datentyp mitzugeben. I.A. praktiziere ich dies aber nur für Arrays. Bei den anderen Variablen bevorzuge ich einen markanten Namen, der mir Auskunft über den Einsatzzweck der Variablen gibt. Da läßt sich natürlich 'i', 's' ... mit einbringen.

    Meine Programmieranfänge waren ja zu Zeiten von TP4 (TurboPascal). Hab ich heute noch, passt auf 2 Disketten.
    Da mußte man alle Variablen explizit deklarieren. Das fand ich auch sehr hilfreich. Da gewöhnt man sich von Anfang an eine strukturierte Arbeitsweise an.
    Diese Option läßt sich ja auch in AutoIt setzen [Opt("MustDeclareVars")]. Vielleicht als Tipp für Einsteiger.

  • Hi,

    ja die Option

    [autoit]

    Opt("MustDeclareVars", 1)

    [/autoit]

    hab ich mir schon ganz zu Anfang zur Pflicht gemacht. Ist einfach sauberer. Hab eben gesehen, dass am 08.09.2007 AutoIt v3.2.8.0 (Release) raus gekommen ist. Im Changelog findet sich Folgendes:

    Zitat

    - Changed: General speed improvements (currently up to 24% in some cases compared to 3.2.6.0).

    Das halte ich ja für einen ziemlichen hohen Geschwindigkeitsgewinn. Kann schon jemand Aussagen darüber tätigen, welche Bereiche (oder auch Funktionen) von AutoIt das betrifft? Würde auch ziemlich interessant finden, wie er das hinbekommen hat.

    • Offizieller Beitrag

    Hallo

    Wen es nochmal interessiert:

    Spoiler anzeigen

    Mfg Spider

  • Ich denke, dass jeder sich da selber was aneignen sollte. Ich persönlich hab auch os nen paar Variablen die ich immer nutze.

  • Moin,

    ich hab auch nochmal zwei kleine Sachen :

    True/False anstatt von 1/0
    Es gibt die Werte True und False und man sollte sie nutzen (ist einfach viel leichter zu lesen und der Compiler wandelt sie auch um, so daß sie nicht die Performance beeinträchtigen)

    Keine 'While 1' Schleife
    Ist vielleicht nur 'design' Frage, aber lieber eine logische Variable vorbelegen und in der Schleife verändern, als eine 'While 1' und 'Exitloop' zu benutzen.