Von Datenmodellen, Kapselung, Invarianten und dem Benutzer



  • Guten Tag!

    Ich habe mich inzwischen daran gewöhnt, meine Daten gekapselt in Objekten vorliegen zu haben, welche für die Einhaltung von benötigten Invarianten sorgen und ansonsten eine feste Schnitstelle wahren. Allerdings hat die Sache neben den angehmen auch Schattenseiten:

    1. Manuelle Erzeugung / Import von "Außen" werden kompliziert.

    Es ist zumeist ineffizient, das Datenmodell aufzubauen und währenddessen alle Invarianten einzuhalten. Das ist kein Problem für Operationen, die innerhalb des Modells "atomar" stattfinden. Aber man lernt ja auch schnell, dass man nicht alles in ein Objekt reinpacken kann, was man mal schnell gerne möchte (Schnitstellen verändern sich, Abhängigkeiten etc.). Beispielsweise könnte man einen Importer vor einem anderen Datenformat schreiben wollen. Wenn man diese Funktionalität nicht fest mit in das Datenmodell mit einbauen kann oder mag, dann ist man also auf die externe Schnittstelle angewiesen, welche bei jeder Operation alle Invarianten einhält. Das ist zuweilen nicht nur ineffizient, sondern wird im allgemeinen auch die entsprechenden Teile der Schnittstelle in einer solchen Form verlangen, dass es keine Freude mehr ist, diese zu diesem Import-Zweck zu verwenden.

    1. Interaktive Operationen werden zur Qual

    Wenn der Benutzer irgendwelche Schiebe-Operationen ("Drag&Drop" oder ähnliche Operationen die aus vielen Fitzel-Operationen bestehen) mit der Maus durchführen möchte, der behandelnde Code das Modell aber nur von außen sieht, dann weiß er ja vom Prinzip her schon gar nicht, was mit dem Modell eigentlich genau passiert ist, während der Benutzer freudig rumgefuchtelt hat. Zudem wird das Modell mit Operationen zugemüllt, wenn man Undo-Fähigkeiten verwendet, bläht sich das entsprechend stark auf. Möchte man das vermeiden, dann bleibt einem eigentlich nur, erstmal keine Operation auf dem Modell durchzuführen. Das führt nun aber dazu, dass man die Modell-Logik im höhergelagerten Code replizieren muss (Ansonsten wäre das WYSIWYG-Prinzip ja verletzt), das heißt, man führt zusätzliche Teile ein, die synchron gehalten werden müssen. Eine einfache Abhilfe wäre, das Daten(sub-)modell in ein lokales zu kopieren, lokal alle Veränderungen durchzuführen und am Ende eine Swap-Operation zu machen. Wenn man das letzte bisschen rauskitzeln will, könnte man noch versuchen eine Art Diff zu verwenden, ansonsten ist der Undo-Speicher schnell voll. Und egal was man hier macht, es wird "komplizierter".

    Jetzt nun ist meine Frage folgende: Stelle ich mich einfach nur an und es gibt solche Probleme gar nicht? Ich lese immer die tollen Seiten von Datenkapselung, aber im Prinzip besteht mein Alltag gefühlt eigentlich zu 95% nur daraus Kapselung herzustellen und anschließend "um die Kapselung" herum zu programmieren oder an 50 Stellen zu verbessern weil ich irgendwann einmal unglücklich gekapselt habe. Dabei würde ich meine Zeit viel lieber damit verbringen, die Probleme zu lösen, die ich vor der Kapselung mit dem was ich dann gekapselt haben würde lösen wollte.

    Irgendwas läuft doch hier mit mir falsch! Ich lese von den ganzen Probelem auch nie irgendwas, überall wird drüber gejubelt aber von Schattenseiten ist eigentlich nie die Rede.

    Mich würden zweckdienliche Belehrungen, Meinungen, Erzählungen oder Ratschläge zu diesem Thema sehr freuen!

    Viele Grüße,
    Deci



  • Hast du ein konkretes Beispiel?

    Weil Prinzipiell ist Kapselung sehr selten im Weg. Ab und zu ist sie das natürlich, keine Frage - aber warum es bei dir so oft auftritt kann an vielem liegen.

    uU kapselst du viel zu eng.



  • Hallo Shade,

    ja mit der Vermutung, dass ich zu eng kapsele, könntest Du zeitweise Recht haben. Ich bin von echter Kapselung inzwischen an vielen Stellen zur Wrapper-Kapselung übergegangen, wo der Zusammenhalt der Daten praktisch ist, ich aber trotzdem die entsprechende Übersicht der gefakten Kapselung als angenehm empfand. Das ist irgendwie ein bisschen Gratwanderung, oder nicht? Ich sehe halt nur gerne "a.b.c" im Code, wo auch mein mentales Modell die Objekte hierarchisch in a, b und c anordnet.

    Ich werde mich morgen mal mit konkreten Beispielen melden. Jetzt erstmal Feierabend, bin derzeit dabei ein 22kloc-Projekt, das ich vor 10 Jahren mal verbrochen habe, mit meinen aktuellen Bibliotheken und dem gereiften Programmierstil zu konsolidieren. Das ist ganz schön anstrengend...

    Viele Grüße,
    Deci



  • Kannst du vielleicht mal ein Beispiel bringen wie so eine "Wrapper"-Kapselung aussieht? Ich weis, dass man hier und da Wrapperklassen verwenden kann. Aber meinst du damit das gleiche?



  • Ich schaue morgen mal nach solchen Beispielen, darf ja auch nicht das erstbeste schlimme sein... kam wieder zu keiner freien Minute und habe heute absolut keinen Nerv mehr auf Kodierung -.-


Anmelden zum Antworten