C++ ist eigentlich eine schöne Sprache, nur...



  • Dann sag mir mal, was der Unterschied zwischen dem verlangten

    while(true) 
       while(true) 
          break 2; // springt aus beiden schleifen
    

    und

    while(true)
       while(true)
          goto endOfLoops;
    endOfLoops:
    

    ist.
    Ein Flag hingegen finde ich unlesbarer.
    Imho ist goto gerade für das springen aus mehreren Schleifen geeignet.



  • Imho ist goto gerade für das springen aus mehreren Schleifen geeignet.

    Da bist du nicht alleine da mit dieser Meinung.



  • 1. Man verwendet so eingentlich nie ein

    while(true)
    

    Weil irgendwann hat alles ein Ende.

    2.Warum ist ein Flag schwerer zu lesen ? Das ist Aufgabe des Programmierers für vernünftige Dokumentation des Codes zu sorgen.



  • Die beste Dokumentation eines Codes ist ein selbstdokumentierender Code.
    Code den ich erklären muss is nicht wirklich gut und ein goto endOfLoops Ist leicht zu lesen und zu verstehen, das setzen des Flags alleine auch, nur dass sofort abgebrochen wird und nicht erst am Ende des Schleifendurchlaufes kann und wird einiges an unnötig verkomplizierenden Code verursachen.
    Das while(true) war nur aus dem Beispiel oben entnommen, generell braucht man selten einen Abbruch in der Schleife, meistens tuts die Bedingung. Noch seltener muss man gleich 2 Schleifen abbrechen und man sollte sich überlegen ob man das wirklich tun muss.
    Aber wenn man es tut, nicht tricksen, goto hat hier keinen der üblichen goto Nachteile, den jede andere Art des Abbruchs nicht auch hätte.



  • Ein goto hat immer den Nachteil, das du dir damit Spaghetti erzeugst.
    Egal wie du ihn anwendest.
    Ein Flag erzeugt das nicht, du kannst den Ablauf auch bei selbstdokumentierenden Code leichter nachverfolgen.



  • Der Nachteil von Spaghetticode, ist dass er schwer nachzuvollziehen ist und das ist in diesem Fall nicht gegeben.



  • Benutzername: schrieb:

    Der Nachteil von Spaghetticode, ist dass er schwer nachzuvollziehen ist und das ist in diesem Fall nicht gegeben.

    In welchem Fall ? Bei den genannten Beispielen ?
    😕 🙄



  • Beim ausstieg aus einer geschachtelten Schleife.



  • Wie wäre es mal mit einem anständigen Programmierstil? PHP ist eine Frickelsprache und kann als Vorbild nicht herhalten. Die ganze Diskussion break, break mit Zahl, goto usw. ist überflüssig, wenn man gescheite, vernünftige, kleine Funktionen schreibt.

    Mir ist schon oft aufgefallen, dass die ganzen Diskussionen über Kontrolstrukturen nur von Leuten geführt werden, die riesige Funktionen schreiben. Wer ordentlich programmiert, braucht solche "Features" nicht.



  • Ein goto erzeugt wie schon gesagt immer Spaghetticode.
    Du springst aus deinem nachvollziehbaren Ablauf an eine andere komplett andere Stelle des Programms.
    Und je umfangreicher und verschachteleter der Schleifenrumpf oder Rümpfe umso schlimmer wird das.
    Ein goto ist nicht nur manchmal böse.



  • @Optimizer
    Dem kann ich nur zustimmen. 👍



  • Nur die Äußerung, das PHP eine Frickelsprache ist, stößt mir etwas auf.
    PHP hat mit Sicherheit einige Defiziete, ob es nun die Sicherheit oder aber die Umsetzung der OO geht.
    Aber zum Frickeln gehören immer zwei. Da kann in C++ genauso viel gefrickelt werden.
    Nur bei PHP wirst du durch die Möglichkeiten halt öfter zum frickeln inspiriert.



  • @Optimizer: sag ich ja auch gar nicht, ein derartiges Konstrukt hab ich persönlich nie gebraucht. Ich finde nur die Aussage Goto sei grundsätzlich böse ein wenig zu radikal. Es ist bewiesen, dass goto kein gutes Sprachmittel ist, aber man sollte sich immer die Nachteile vor Augen führen und selbst darüber nachdenken, ob diese hier wirklich greifen. Und irgendwas mit irgendwelchen Flags rumzuhantieren ist weniger gut nachzuvollziehen als ein brich die Schleife jetzt ab.
    Fhul, du sagst man würde in einen komplett anderen Programmteil geworfen, aber das ist nicht wirklich so, man bricht lediglich die Schleife ab.



  • Benutzername: schrieb:

    Und irgendwas mit irgendwelchen Flags rumzuhantieren ist weniger gut nachzuvollziehen als ein brich die Schleife jetzt ab.

    Dem stimme ich zu. Aber dann würde ich die Schleife mit einem return abbrechen. Ich sag jetzt schon nicht, dass jedes break böse ist, aber return ziehe ich klar vor. Auf jeden Fall behaupte ich, dass ein break 2 böse ist. Ich weiß, es gibt keine absolute Wahrheit bei sowas, aber man braucht sich das Leben schon nicht irre kompliziert machen, damit man ja nicht die eine Gelegenheit verpasst, wo ein break 2 die beste Lösung scheint. Da ist es leichter, break 2 und goto zu verteufeln, da verpasst man jetzt schon nichts. 🙂

    btw. Eine Schleife hat ja normal irgendeinen bestimmten Zweck, diesen Zweck kann man benennen und schon hat man eine Funktion. Man kann auch aus einer geschachtelten Schleife returnen. Es ist viel leserlicher.



  • Fhul, du sagst man würde in einen komplett anderen Programmteil geworfen, aber das ist nicht wirklich so, man bricht lediglich die Schleife ab

    Du springst an die Stelle, die du definierst. Ob das nun direkt nach den Schleifenrumpf ist kann sein, muss aber nicht.



  • ich hatte noch nie das Vergnügen PHP lesen zu müssen aber bei break n dreht sich mir echt der Magen um. Jedes goto mit benannter Sprungmarke ist ein Segen dagegen.



  • und dann noch endOfLoops2 und endOfLoops3 ...

    Einfach den Code besser in Funktionen verteilen und schon ist das ganz hinfällig.



  • [snip... wiedermal nicht bis zum Ende einen Thread gelesen... aber egal, trifft immer noch den Kontext]

    Benutzername: schrieb:

    Der Nachteil von Spaghetticode, ist dass er schwer nachzuvollziehen ist und das ist in diesem Fall nicht gegeben.

    Spätestens wenn etwas mehr Inhalt in der Scheife dazukommt ist es wieder gegeben. Und Programmierer sind (zumeist) faul [Nicht unbedingt weil sie es wirklich sind, sondern weil es etwas gibt das sich Zeitdruck nennt] und ändern dann nicht zwangsweise den Code wieder ab.

    Es gibt immer bessere Alternativen als goto. Ich komme seit 19 Jahren ohne goto aus (um genau zu sein, seit ich programmiere; Mag vielleicht auch daran liegen das ich die Programmierung unter gewisser Aufsicht erlernt habe, mein Vater ist auch in der Programmierung und QS Tätig ;p), da solle es auch anderen möglich sein es zu umgehen.

    cu André
    P.S: Und davon abgesehen sind tiefe Schleifenverschachtelungen auch meist nur ein Zeichen unschönen Codes. Meist läuft das mit langen Funktionen einher, und die sollte man eh lieber in ihre Einzelteile untergliedern. Alleine schon der Lesbarkeit wegen.



  • wer meint es gibt fett-gedruckt-immer bessere lösungen als gotos kann sich ja diesen artikel durchlesen

    http://stevemcconnell.com/ccgoto.htm



  • Optimizer schrieb:

    Wie wäre es mal mit einem anständigen Programmierstil? PHP ist eine Frickelsprache und kann als Vorbild nicht herhalten. Die ganze Diskussion break, break mit Zahl, goto usw. ist überflüssig, wenn man gescheite, vernünftige, kleine Funktionen schreibt.

    Mir ist schon oft aufgefallen, dass die ganzen Diskussionen über Kontrolstrukturen nur von Leuten geführt werden, die riesige Funktionen schreiben. Wer ordentlich programmiert, braucht solche "Features" nicht.

    Java hat weder break X noch goto. OMG wie kann man da nur Programme schreiben?

    asc hat mich dadrauf aufmerksam gemacht das ich auch noch nie goto eingesetzt habe und ich programmiere jetzt seit 13 Jahren.


Anmelden zum Antworten