Struct via "Struct.Element" ansprechen - Beta 3.3.9.5

  • In vielen Sprachen ist auch der goto-Befehl implementiert und man braucht ihn eigentlich nie.


    Ich hab nicht viel gegen den Operator an sich, auch wenn ich ihn fast nie brauche. Mich stört aber die Art, wie er implementiert wird.
    Eine Programmiersprache sollte möglichst gut lesbar sein und dadurch, dass ein Fragezeichen und ein Doppelpunkt verwendet werden, gibt es gleich zwei Hindernisse dabei.
    In Python hingegen ist die Implementierung in Ordnung, da man mit den lesbaren Keywords if und else auskommt.

  • In Python hingegen ist die Implementierung in Ordnung, da man mit den lesbaren Keywords if und else auskommt.


    Die Python Implementierung ist zwar lesbar aber trotzdem verwirrend, da die Reihenfolge der Schlüsselwörter und Werte völlig anders als bei einem normalen if ist. Daher sollten dafür nicht die gleichen Schlüsselwörter benutzt werden.
    PS: Lasst es mal ruhig angehen, bis die nächste AutoIt-Version kommt dauert es noch eine Weile.

  • Hi,
    heikles Thema...

    MUSS man alles mitmachen? Mit Sicherheit nicht. Ich glaube auch nicht, dass die Lesbarkeit des Codes bei Verwendung von Operatoren steigt. Jedenfalls mal definitiv nicht bei 95% der AutoIt-Anwender!
    Der immense Vorteil von Basic-ähnlichen Sprachen ist doch der, "lesbar" zu sein. Natürlich könnte man jetzt sagen, auch ein RegEx ist "lesbar", wobei natürlich jedermann sofort erkennt, dass es sich hierbei

    Code
    [a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

    um tja, was denn nur handelt...
    Ich persönlich "lese" gerne Code, und selbst wenns mal syntaktisch ans Eingemachte geht, dann hilft der Kommentar weiter :rolleyes:

    Letztendlich ist jedem selbst überlassen, wie er scriptet, das ist ja das Schöne :thumbup:

  • @progandy 
    hehe, bin beim Suchen (nach irgendeinem "großen" RegEx) natürlich auch über dein "Kunstwerk" gestolpert, aber zwei Seiten war mir dann doch für ein Beispiel zu viel.

    Aber ich wurde auch bestätigt ;).
    Du und geschätzte 10-20 Forumianer hier, sagen wir mal grob 50 bis 100 insgesamt zusammen mit dem Ami-Forum, sind in der Lage, diesen "Code" zu lesen und auch z.B. Operatoren sinnvoll zu nutzen....wieviele sind das im Vergleich zu den zehntausenden, die AutoIt "native" nutzen?
    Mir ist schon klar, dass die Entwicklung an einem Punkt angelangt ist, bei dem man selbst mit viel Einsatz von Manpower und Knowhow nur noch relativ kleine Fortschritte machen kann. Das ist bei jeder Produkt(weiter)entwicklung so, also auch bei AutoIt.
    Für gefühlte 99% der Anwender ist in den letzten 2-3 Jahren nicht sonderlich viel verbessert worden! Von den integrierten UDF´s mal abgesehen. Also bleibt OO (mit allen Vorteilen) und nun halt u.a. ternäre Operatoren ;(

    Wenn mich mal ab und zu jemand anruft bei dem ein Script "plötzlich" nicht mehr funktioniert, dann frag ich schon garnicht mehr nach dem BS (meist wurde auf 64Bit umgestiegen) sondern kompiliere mit dem expliziten 32-Bit-Schalter und damit hat es sich....der "Vorteil" 64 Bit ist auch so eine Luftnummer...(für den Großteil der Anwender und deren Software würde es 8 Bit tun 8o) aber schön, wenn man es hat :thumbup:

  • Will mal ne Frage einstreuen:

    Sind folgende 3 Ausdrücke gleichwertig ?

    [autoit]

    $f = ($f < 0) ? 0 : $f
    If $f < 0 Then $f = 0
    $f = $f * ($f > 0)

    [/autoit]


    (ich denke eigentlich schon)

  • Die Ausdrücke sind gleichwertig, aber der If-Ausdruck ist zu bevorzugen. Der ternäre Operator macht eine unnötige Zuweisung, falls $f >= 0 und der letzte Ausdruck enthält unnötige Konvertierungen und Rechenoperationen.

  • In vielen Sprachen ist auch der goto-Befehl implementiert und man braucht ihn eigentlich nie.

    Und doch ist Linus Torvalds ein großer Verfechter von goto :rolleyes:

    Eine Programmiersprache sollte möglichst gut lesbar sein und dadurch, dass ein Fragezeichen und ein Doppelpunkt verwendet werden, gibt es gleich zwei Hindernisse dabei.

    Du hast Recht. Trivial und autoplausibel ist die ?-: Kombination wirklich nicht.
    Man muss es wirklich gewöhnt sein und für die Allgemeinheit ist es wohl auch eher weniger gedacht.
    Für mich hat es allerdings einen gewissen Charme und ich finde es bisschen schade das Ihr mir meinen geliebten ternären Operator so schlecht redet... ;)
    Meine persönliche Programmierphilosophie ist dass simple Code-Teile welche nur einfache Zuweisungen oder Ähnliches enthalten nur wenig Platz verbrauchen dürfen um nicht zu sehr von den wirklich wichtigen Codebereichen abzulenken.

    Mein allerletzter Überzeugungsversuch ;) :

    Select-Code:

    Spoiler anzeigen
    [autoit]

    Global $s_Input = "Do"

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

    Select
    Case $s_Input = "Mo"
    $s_Tag = "Montag"
    Case $s_Input = "Di"
    $s_Tag = "Dienstag"
    Case $s_Input = "Mi"
    $s_Tag = "Mittwoch"
    Case $s_Input = "Do"
    $s_Tag = "Donnerstag"
    Case $s_Input = "Fr"
    $s_Tag = "Freitag"
    Case $s_Input = "Sa"
    $s_Tag = "Samstag"
    Case $s_Input = "So"
    $s_Tag = "Sonntag"
    Case Else
    $s_Tag = "Fehlerhaft"
    EndSelect

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

    MsgBox(0,"", $s_Tag)

    [/autoit]

    Code mit ternären Operator:

    Spoiler anzeigen
    [autoit]

    Global $s_Input = "Do"

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

    $s_Tag = ($s_Input = "Mo") ? "Montag" : _
    ($s_Input = "Di") ? "Dienstag" : _
    ($s_Input = "Mi") ? "Mittwoch" : _
    ($s_Input = "Do") ? "Donnerstag" : _
    ($s_Input = "Fr") ? "Freitag" : _
    ($s_Input = "Sa") ? "Samstag" : _
    ($s_Input = "So") ? "Sonntag" : _
    "Fehlerhaft"

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

    MsgBox(0, "", $s_Tag)

    [/autoit]
  • Nächstes Gegenbeispiel:

    Spoiler anzeigen
    [autoit]


    Switch $s_Input
    Case "Mo"
    $s_Tag = "Montag"
    Case "Di"
    $s_Tag = "Dienstag"
    Case "Mi"
    $s_Tag = "Mittwoch"
    Case "Do"
    $s_Tag = "Donnerstag"
    Case "Fr"
    $s_Tag = "Freitag"
    Case "Sa"
    $s_Tag = "Samstag"
    Case "So"
    $s_Tag = "Sonntag"
    Case Else
    $s_Tag = "Fehlerhaft"
    EndSwitch

    [/autoit]

    Wenn man assoziative Arrays hätte (wie z.B. bei Pyton oder lua), könnte man das damit noch schneller und einfacher lösen.

  • Wenn man assoziative Arrays hätte (wie z.B. bei Pyton oder lua), könnte man das damit noch schneller und einfacher lösen.

    ->

    "Umso mehr, desdo besser" gilt bei Programmiersprachen nicht.

    ;)

    Ich denke wir können hier aufhören.
    Wir werden beide nicht von unserem Standpunkt abrücken was auch nicht schlimm ist.
    Weitere Vertiefungen zum Thema werden kaum einen Mehrwert hervorbringen.

  • Also ich finde StringSplit("a,b", ",")[1] nur logisch. Erstens spart man damit ne Menge Platz und Nerven, und man sieht, dass StringSplit einen Array zurückgibt. So kann das ganze direkt in eine Funktion oder Variable.

    Besser als:

    $aString = Stringsplit("a,b",",")
    $sString = $aString[1]

    Das ist auf jeden Fall sinvoll, und sehr übersichtlich.

    • Offizieller Beitrag

    Also ich finde StringSplit("a,b", ",")[1] nur logisch.

    Das Bsp. im Zusammenhang mit StringSplit ist aus meiner Sicht eher unlogisch. :whistling:
    Wenn ich Split verwende, möchte ich gemeinhin mehrere Splitergebnisse verwerten, Anzahl oft vorher unbestimmt. Insofern ist der absolute Sonderfall, nur das erste (nte) Element des Splits zu verwerten sicher keine Referenz für diese Funktionalität. ;)

    Die erweiterte Zugriffsform als solche ist allerdings schon recht komfortabel, speziell (um auf den eigentlichen Threadkern zurückzukommen) der Zugriff bei Strukturen.

    Was ternäre Operatoren angeht, so sehe ich das auch so, dass wohl die meisten User dafür wenig Anwendung sehen werden, aber sinnvoll eingesetzt ist das schon ein angenehmes Feature.
    Vielleicht sollte man auch die allgemeine Form mal anführen, damit jenen, die davon noch nie etwas gehört haben klar ist, was ein ternärer Operator tut:
    ( Bedingung ) ? RückgabeWert_Wahr : RückgabeWert_Falsch

  • Also ich liebe die ternäre Operatoren,
    und vernünftig angewendet, helfen sie meiner Meinung nach auch den Code übersichtlicher zu machen.

    Beispiel ohne ternären Operator

    [autoit]

    $Var = 75
    If $Var > 0 Then
    $Msg = "Value is positive."
    Else
    $Msg = "Value is negative."
    EndIf

    [/autoit]

    Beispiel mit ternärem Operator

    [autoit]

    $Var = 75
    $Msg = ($Var > 0) ? "Value is positive." : "Value is negative."

    [/autoit]


    Ergebnis: 6 Zeilen vs 2 Zeilen Code

    Thema StringSplit:
    Ich würde es besser finden wenn der Array Index, in der funktion sein würde:

    [autoit]

    StringSplit ( "string", "delimiters" [, flag [, iArrayIndex ] ] )

    [/autoit]


    Ach wäre das schön wenn AutoIt Native assoziative Arrays hätte *Träum* :love:

  • Ok hast recht, ich hoffe das ist besser :whistling:

    [autoit]

    Local $Format = '', $Years = 2, $Days = 1, $Hours = 0, $Mins = 1, $Secs = 12
    If $Years > 0 Then $Format &= $Years & (($Years > 1) ? ' Jahre ' : ' Jahr ')
    If $Days > 0 Then $Format &= $Days & (($Days > 1) ? ' Tage ' : ' Tag ')
    If $Hours > 0 Then $Format &= $Hours & (($Hours > 1) ? ' Stunden ' : ' Stunde ')
    If $Mins > 0 Then $Format &= $Mins & (($Mins > 1) ? ' Minuten ' : ' Minute ')
    If $Secs > 0 Then $Format &= $Secs & (($Secs > 1) ? ' Sekunden ': ' Sekunde ')
    MsgBox(64, '', $Format)

    [/autoit]


    VS

    [autoit]

    Local $Format = '', $Years = 2, $Days = 1, $Hours = 0, $Mins = 1, $Secs = 12
    If $Years = 1 Then $Format &= $Years & ' Jahr '
    If $Years > 1 Then $Format &= $Years & ' Jahre '
    If $Days = 1 Then $Format &= $Days & ' Tag '
    If $Days > 1 Then $Format &= $Days & ' Tage '
    If $Hours = 1 Then $Format &= $Hours & ' Stunde '
    If $Hours > 1 Then $Format &= $Hours & ' Stunden '
    If $Mins = 1 Then $Format &= $Mins & ' Minute '
    If $Mins > 1 Then $Format &= $Mins & ' Minuten '
    If $Secs = 1 Then $Format &= $Secs & ' Sekunde '
    If $Secs > 1 Then $Format &= $Secs & ' Sekunden '
    MsgBox(64, '', $Format)

    [/autoit]
    • Offizieller Beitrag

    ich hoffe das ist besser


    Naaa...
    da bau ich mir den Operator doch einfach nach :D

    [autoit]

    $Years = 2
    ConsoleWrite(_IFOR('$Years > 1', 'Jahre', 'Jahr') & @CRLF)

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

    $Years = 1
    ConsoleWrite(_IFOR('$Years > 1', 'Jahre', 'Jahr') & @CRLF)

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

    Func _IFOR($Bedingung, $WahrWert, $FalschWert)
    If Execute($Bedingung) Then Return $WahrWert
    Return $FalschWert
    EndFunc

    [/autoit]

    Aber Sorry an eukalyptus, jetzt haben wir deinen Thread ge-highjackt. :whistling:
    Keine böse Absicht.