Boolean State Driven Procedure?

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Antworten
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hallo zusammen,

kennt jemand einen Namen für folgendes Vorgehen (Imho ein Anti-Pattern)?

Code: Alles auswählen

def foo():
    # artificial flag
    continue_ = True

    if continue_:
        # some calls
        continue_ = result_of_some_call()
    if continue_:
        continue_ = some_other_action()
    if continue_:
    # ... and so on
    
    # perhaps at the end
    if !continue_:
        # react on "error"

    # or
    return continue_
Sprich anstatt die Aufrufe entsprechend zu schachteln, verschleiert man die kaskadierende Struktur, indem man ein künstliches Flag erschafft und damit sequenzielle Blöcke bildet. Damit wird imho eigentlich nur die Illusion geschaffen, dass man sauber strukturiert, weil man nicht dutzende ineinander verschachtelte Blöcke hat.

Irgend wie war mir so, dass ich dafür schon mal einen konzeptionellen Begriff gelesen habe... ich kann mich aber nicht erinnern und vielleicht irre ich mich auch (und ich könnte somit als erster einen Namen für diesen Murks prägen :mrgreen: )
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Es ist einfach Spaghetti Code. Im konkreten Fall werden unweigerlich weitere Probleme auftreten die sich dann besser bezeichnen und kritisieren lassen, wie z.B. zu lange/komplexe Funktionen und schlechte Aufteilung, was Konsequenzen auf Testbarkeit und Wiederverwendbarkeit hat.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Hyperion: Was spricht hier gegen Exceptions?

Code: Alles auswählen

for func in functions:
    try:
        function()
    except SomeError as e
        handle_error(e)
Zuletzt geändert von snafu am Mittwoch 23. September 2015, 16:31, insgesamt 1-mal geändert.
BlackJack

@Hyperion: Das sieht ein bisschen so aus wie das was man bei C und ähnlichen Sprachen macht weil's keine Ausnahmen in der Sprache gibt. Würde deutlicher wenn Du `continue_` in `error` umbenennst und die Bedingung umdrehst in ``if not error:``. Wobei ich in der Regel kein Flag benutze sondern ein ``goto`` zur Fehlerbehandlung. Also in C meine ich jetzt. :-)

Ich mache das um die IMHO künstliche Verschachtelung in solchen Fällen zu vermeiden und Code zu schreiben der mehr wie Python aussieht, oder andere Sprachen mit Ausnahmen.

Edit: Ah, snafu war ein bisschen schneller. :-)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@DasIch: Hm... ja natürlich sieht der Code in den ``if`` schlimm aus und man könnte da schon einiges zu sagen (SRP in vorderster Front uvm.), aber ich meinte mich einfach zu erinnern für genau diesen Stil schon einmal eine Bezeichnung gelesen zu haben... und dafür etwas passendes zu haben wäre toll in meiner Situation.

@snafu: Nichts! Aber es ging in meiner Frage ja auch nicht um das Refactoring ;-)

@BlackJack: Tatsächlich handelt es sich um C++... zumindest etwas, das sich mit einem C++ Compiler übersetzen lässt :twisted: Aber Exceptions sind ja mystische und rätselhafte Dinge, von denen man besser die Finger lässt...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Hyperion: Also ich finde ja C++ ist ein mystisches und rätselhaftes Ding von dem man besser die Finger lässt. ;-)

Benutzt denn irgendwer Ausnahmen in C++? Ich hatte so den Eindruck das „exception safety“ noch mal eine Komplexitätsstufe oben drauf ist, und dass sich damit niemand wirklich herumschlagen möchte. Einige grosse Projekte haben auch eine „no-exception policy“ (Mozilla, Google, wxWidgets, und Qt benutzt AFAIK auch keine).
Antworten