Welche Design Patterns sollte man kennen?



  • Helium schrieb:

    ("Closures sind die Objekte des armen Mannes und Objekte sind die Closures des armen Mannes.")

    sieht so aus

    let createSimpleCommand args action undoAction actionName = 
       let doFun () = 
          let success = action(args) in (
             if success then log(actionName + " succeded")
             else log(actionName + " failed");
          success) in
       let undoFun () = 
          undoAction(args);
          log (actionName + " undone") in
       (doFun, undoFun);;
    
    let createDir name = createSimpleCommand name 
       CreateDir DeleteDir 
       ("create dir " + name);;
    
    let copyFile (source, target) = createSimpleCommand (source, target)
       CopyFile (snd >> DeleteFile)
       ("copy file from " + source + " to " + target);;
    

    Sowas kann man auch mit ner abstrakten Klasse machen.

    Beim Implementieren von createProject ist etwas aufgefallen: Es kann sein, das Aktionen mittendrin fehlschlagen. Dann braucht man eine passende Undo-Funktion, die nur den Teil rückgängig macht, der auch durchgeführt wurde. Man braucht also offensichtlich zu jeder Ausführung einer Aktion ein passendes Undo.
    Außerdem fällt generell auf, dass das System es zulassen würde Aktionen rückgängig zu machen, ohne sie jemals ausgeführt zu haben. Kann man das nicht so umgestallten, dass es bereits zur Compilezeit ausgeschlossen ist?

    Die Idee ein Undo Command erst beim Ausfürhen eines Exec Commands zurück zugeben, läst sich auch mit Klassen machen. Man könnte auch einfach ein Flag canUndo setzen und solange das auf false ist, macht undo nix.



  • antwort schrieb:

    Helium schrieb:

    ("Closures sind die Objekte des armen Mannes und Objekte sind die Closures des armen Mannes.")

    sieht so aus

    Natürlich. Beides kann das jeweils andere komplett nachahmen, aber jeweils schlecht. Wenn ich Objekte habe brauche ich keine Closures und wenn ich Closures habe brauche ich keine Objekte.

    Kennst du Paul Grahams Essey mit der Blub-Sprache? Verglichen mit der eigenen Sprache erkennt man die weiter unten im Mächtigkeitsspektrum stehenden Sprachen sofort, Sprachen, die weiter oben im Mächtigkeitsspektrum angesidelt sind, erkennt man aber fälschlicher weise als gleichmächtig zur eigenen Sprache.

    In jeder turing vollständigen Sprache kannst du alles machen. Du musst nur lange genug nachdenken, wie du etwas nachbauen kannst.

    --------

    Sowas kann man auch mit ner abstrakten Klasse machen.

    let (foo,bar) = getCreatDirSubCommands();;
    
    let createDir name = createSimpleCommand name 
       foo bar
       ("create dir " + name);;
    

    Könnte z.B. sein: getCreatDirSubCommands generiert in Unit-Tests Funktionen, die nicht wirklich was machen und im Produktionscode die normale Funktionalität.

    Ich kann createSimpleCommand rumreichen. So kann ich mal createSimpleCommand verwenden, mal ne andere Funktion, die vielleicht kein logging drin, mal eine, die nochwas mehr macht, was weiß ich. Und ich habe diese ganze Flexibilität schon und es war die erste offensichtliche intuitive Lösung.

    Und ja, kannst du alles nachbauen.


Anmelden zum Antworten