Ist goto ausnahmslos immer schlecht?
-
volkard schrieb:
wie soll man das sonst machen? künstliche variable, goto, codeduplikation, noch ne funktion?
while (leseversuch() != keine_daten_mehr) { verarbeitung(); }
-
Oder, falls leseversuch() nichts passendes zurückgibt:
open(); while (leseversuch(), !keineDatenMehrDa) { verarbeitung(); } close();
Das wird natürlich wiederum die Feinde des Komma-Operators erzürnen.
-
volkard schrieb:
wie soll man das sonst machen? künstliche variable, goto, codeduplikation, noch ne funktion?
Das geht viel klarer:
bool fRunLoop; fRunLoop = Open (); while (fRunLoop == true) { if (LeseVersuch () == true) TueEbbes (); else fRunLoop = false; }
Das Kind ist ist nach seiner Funktion benannt - fRunLoop ist ein Flag und steuert den Loop.
-
leseversuch() war natürlich nur ein platzhalter für ein paar zeilen code, die nicht sinnvoll in eine funktion ausgelagert werden können.
-
hartmut1164 schrieb:
Das Kind ist ist nach seiner Funktion benannt - fRunLoop ist ein Flag und steuert den Loop.
furchtbar.
Damit hast du es geschafft das Programm schwerer wartbar zu machen da Flags die du lokal setzt, plötzlich globale Auswirkungen haben.
*brrr*
-
hartmut1164 schrieb:
volkard schrieb:
wie soll man das sonst machen? künstliche variable, goto, codeduplikation, noch ne funktion?
Das geht viel klarer:
bool fRunLoop; ...
Das Kind ist ist nach seiner Funktion benannt - fRunLoop ist ein Flag und steuert den Loop.
das kind ist die künstliche variable, die zu meiden war.
das erinnert mich an#define RETURN(x) result=x; goto aufraum;
-
hartmut1164 schrieb:
volkard schrieb:
wie soll man das sonst machen? künstliche variable, goto, codeduplikation, noch ne funktion?
Das geht viel klarer:
bool fRunLoop; fRunLoop = Open (); while (fRunLoop == true) { if (LeseVersuch () == true) TueEbbes (); else fRunLoop = false; }
Das Kind ist ist nach seiner Funktion benannt - fRunLoop ist ein Flag und steuert den Loop.
ich bin nochmal der Meinung, dass dieser Code schwer zu lesen ist und auf Dauer nervig zu warten. Ein gut eingesetzer Sprung kann die Lesbarkeit und Wartbarkeit deutlich erhöhen.
-
+fricky schrieb:
hartmut1164 schrieb:
In der "freien Wildbahn" wuerde ich das noch etwas bauen, aber es duerfte klar sein, wie das prinzip aussieht.
ja, finde ich total fürchterlich, jedesmal dieses flag abzufragen. allein schon, dass es 'fFound' und nicht einfach 'Found' heisst, würde mich aufregen.
In der freien Wildbahn haette irgentetwas in der Richtung gemacht und ganz auf Schleifen verzichtet und statt dessen mit einer einfachen Recursion gearbeitet:
typedef struct ElementCube { int iElement; ElementCube *pNext_x = NULL, *pNext_y = NULL, *pNext_z = NULL; } ElementCube *CheckRow (ElementCube *pToCheck, int iToCheck) { if (pToCheck == NULL) return NULL; else if (pToCheck->iElement == iToCheck) return pToCheck; else return (CheckRow (pToCheck->pNext_x)); } ElementCube *CheckLevel (ElementCube *pToCheck, int iToCheck) { ElementCube *pReturn; pReturn = CheckRow (pToCheck, iToCheck); if (pReturn == NULL) return CheckLevel (pToCheck->pNext_y, iToCheck) else return pReturn; } ElementCube *CheckCube (ElementCube *pToCheck, int iToCheck) { ElementCube *pReturn; pReturn = CheckLevel (pToCheck, iToCheck); if (pReturn == NULL) return CheckCube (pToCheck->pNext_z, iToCheck); else return pReturn; }
-
hartmut1164 schrieb:
In der freien Wildbahn haette irgentetwas in der Richtung gemacht und ganz auf Schleifen verzichtet und statt dessen mit einer einfachen Recursion gearbeitet:
du hast zu lange am pascaltopf geschnüffelt.
-
volkard schrieb:
hartmut1164 schrieb:
In der freien Wildbahn haette irgentetwas in der Richtung gemacht und ganz auf Schleifen verzichtet und statt dessen mit einer einfachen Recursion gearbeitet:
du hast zu lange am pascaltopf geschnüffelt.
Pascal ist meine "Muttersprache" - und eine alte Liebe vergisst man nicht.
-
bei hartmut1164 sieht alles kompliziert und schwer wartbar aus, auch die komische ungarische notation macht es nicht gerade besser, eher im gegenteil.
das kommt wohl am ende raus, wenn man sich zu sehr seine dogmatischen grundsätze klammert.
-
dog-mom schrieb:
bei hartmut1164 sieht alles kompliziert und schwer wartbar aus, auch die komische ungarische notation macht es nicht gerade besser, eher im gegenteil.
das kommt wohl am ende raus, wenn man sich zu sehr seine dogmatischen grundsätze klammert.also zur unterscheidung von pointern und daten sollte man mindestens auf ungarische notation zurueckgreifen, was immer man bezüglich der namensgebung auch sonst noch treiben mag. es ist meistens vorteilhaft, wenn man variablennamen halbwegs ansieht, was sie speichern
goto ist ein grundbefehl wie alle anderen auch und hat genauso seine berechtigung bzw. sinnvollen einsatzgebiete wie if oder while
-
dog-mom schrieb:
bei hartmut1164 sieht alles kompliziert und schwer wartbar aus, auch die komische ungarische notation macht es nicht gerade besser, eher im gegenteil.
das kommt wohl am ende raus, wenn man sich zu sehr seine dogmatischen grundsätze klammert.Nicht unbedingt - Ich folge der logischen Abfolge der Moeglichkeiten, ich benutze keine globalen Vriablen und das Verhalten ist genau definiert. Ausserdem mein Code ist ziemlich flexible. Wenn Du bei meinem Beispiel in Zeile 3 das iElement durch soetwas ersetzt:
void *pData
und eine Function definierst wie
IsEqual (const void *pCheck0, const void *pCheck1, int (*Compare)(const void*, const void *) );
und diese in Zeile 15 statt des "pToCheck->iElement == iToCheck "einfuegst, kannst Du den Einzeiler "CheckCube" ergaenzen und erhalest einen neuen Cubus mit allen Bedingungen, die flexible in "Compare" definiert wurden. Ich brauche mich nicht mehr um Array-Groessen, abbruchbedingungen etc. zu kuemmern. Das ist unterm Strich einfach zu verstehen und warten.
---
Wenn man natuerlich nicht in Recursionen denkt, hat man ein Problem.
-
hartmut1164 schrieb:
Das ist unterm Strich einfach zu verstehen und warten.
...und schwer zu reversen.
...und schwer zu debuggen.
-
hartmut1164 schrieb:
Wenn man natuerlich nicht in Recursionen denkt, hat man ein Problem.
ne ne ne. alles falsch.
rekursion ist ein tool das man benutzen kann und nicht etwas dass man auf alle probleme draufknallen muss.
-
Ich denk eigentlich zuerst immer rekursiv, aber mit solchem furchtbaren Code (
if (foo == true)
*schüttel*) möcht ich dann doch nichts zu tun haben
-
rekursion funktionierte in pascal, aber nicht in basic. also hat man geknallt, was das zeug hielt, um cool und wissenschaftlich zu sein.
uups, in c++ sehe ich einen ähnlichen effekt, was die verwendung von metaprogrammierung angeht. *angst*
-
ungarischer schrieb:
also zur unterscheidung von pointern und daten sollte man mindestens auf ungarische notation zurueckgreifen, was immer man bezüglich der namensgebung auch sonst noch treiben mag.
warum ausgerechnet bei pointern?
es ist meistens vorteilhaft, wenn man variablennamen halbwegs ansieht, was sie speichern
das zeigt mir jedes halbwegs moderne ide in aller ausführlichkeit an. und wenn du typen trotzdem falsch verwurstelst, sagt dir das der compiler.
ungarische notation erhöht den aufwand ohne echten nutzen.
-
Und Rekursion ist in C ja auch nicht ganz ungefährlich: http://damienkatz.net/2008/02/recursion_unsaf.html
-
volkard schrieb:
rekursion funktionierte in pascal, aber nicht in basic.
in basic geht's so in etwa: http://www.olympus.net/personal/7seas/recurse.html