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



  • naaaja, ich bin nicht einer von diesen goto hassern der gleich eine shotgun rausholt und dem programmiere ins gesicht schießt wenn ich ein goto im code sehe

    es gibt sehr sehr seltene anwendungsfälle bei gewisser if else logik wo ein goto die bessere lösung ist im vergleich zu einer unnötig komplizierten und unverständlichen ohne-goto variante

    aber sowas gehört imo nicht zu den fällen wo goto angebracht ist denke ich

    vielleicht solltest du deinen entwurf erstmal überdenken ob es so wirklich gut gelöst ist wenn du über eine größere tiefe als 1 breaken willst
    ich vermute mal du musst nur 2 schleifen in die tiefe breaken, da würde eigentlich auch ein bool flag reichen und vermutlich auch die leserlichkeit und verständlichkeit fördern

    aber wenn du meinst es geht wirklich nicht anders nimmt halt ein lokales goto welches innerhalb eines kleinen codestücks die sprungmarke hat so dass es überschaubar bleibt, allerdings musst du dir halt überlegen ob es das ist was du wirklich brauchst



  • Ich bin noch ein Urgestein.
    Ich bin damals auf dem Brotkasten (C64) nur so mit goto und gosub umhergehüpft.
    Mir ist es zum Anfang als ich Bekanntschaft mit C++ machte auch schwer gefallen, auf sowas zu verzichten.
    Heute bin ich der festen Überzeugung, das es für "goto" unter C++ immer eine bessere Lösung gibt. Wenn einem auf Anhieb keine andere Lösung ins Gesicht springt, dann sollte man diese Punkte, die zu dieser falschen Annahme führen versuchen auszumerzen.
    Heisst also, ein goto ist immer ersetzbar.



  • 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.


Anmelden zum Antworten