Announcement

Collapse
No announcement yet.

Zeitliche Abhängigkeit elegant lösen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zeitliche Abhängigkeit elegant lösen

    Hallo,

    vielleicht kennt ihr folgendes Problem:

    Hauptsächlich in Bereichen von Gesetzen und Verordnungen gibt es Regeln und Verfahren, die bis zu einem bestimmten Datum gültig sind, danach gilt wieder eine andere Regel oder anderes Verfahren. Dann gibt es meistens auch einen begrenzten Zeitraum in dem beide Regeln vom Programm abgedeckt werden müssen. Als Lösung kommen meines Erachtens drei Möglichkeiten in Frage:
    (Annahme: Alles was mit diesem Vorgang zutun hat, wird momentan von einer Klasse erledigt.)

    - In der Klasse wird überall wo nötig die zeitliche Unterscheidung eingebaut so a la:

    if (datum <= ....) {}
    else {}

    Nicht besonders elegant, aber pragmatischer Ansatz.

    - Alle betroffenen Stellen werden an ein Delegate ausgelagert und das Datum bestimmt welches Delegate dazugebunden wird.
    (Schon viel besserer Ansatz)

    - Im Prinzip funktioniert das alte Verfahren schon und ist getestet. Durch die Implementierung des neuen Verfahrens wird bei den beiden oben genannten Möglichkeiten der alte funktionierende Code wieder angefaßt (mit allen Konsequenzen). Darum wäre es wesentlich eleganter die Klasse zu Versionieren. Also die Klasse Version 1.0 handelt nach der alten Regel. Die neue Klasse Version 2.0 kennt nur die neue Regel. Die beiden Klassen heißen gleich und die Applikation kennt momentan nur die neue Klasse mit der Version 2.0. Im Bedarfsfall, wenn also ausnahmsweise noch mal nach den alten Regeln gehandelt werden soll, würde ich gerne ein Objekt der Klasse Version 1.0 erzeugen. Mal angenommen ich hätte noch das Class-File der Version 1.0 im Dateisystem liegen.

    Wie erzeuge mit Hilfe dieses Class-Files (1.0) ein Objekt der Klasse Version 1.0. Meine Frage zielt darauf ab, wie lade ich zur Laufzeit den Code in die VM erzeuge daraus ein Objekt?

    Ich hoffe ihr versteht was ich meine und könnt mir helfen.

    Gruß

    Wolfgang

    PS: Mir fällt auch noch eine vierte Variante ein: Man könnte aus der Klasse ein Interface machen und die zeitlich unterschiedlichen Verfahren von zwei namentlich unterschiedlichen Klassen abhandeln lassen.
    Es geht mir hier nicht darum zusätzlich Lösungsansätze zu finden, sondern zu prüfen, ob die von mir gewünschte "Versionierung" von Klassen möglich ist.

  • #2
    Mal ein Anfang

    http://aktuell.de.selfhtml.org/artik...ader/index.htm

    Auch noch eine Alternative:

    Beide Versionen bereithalten & per Reflection die gewünschte anspringen
    Christian

    Comment


    • #3
      Hallo Christian,

      danke für Deinen Hinweis. Das ist genau die Richtung, in der ich suche. Ich habe mich bisher weniger mit dem Laufzeitsystem beschäftigt und wußte daher nicht, ob so was überhaupt machbar ist. Was der Daniel Thoma da beschreibt, ist ja genau das was ich machen will. Dass man dabei das was er ziemlich weit unten schreibt:

      Beachten Sie:

      Wenn Sie mehrere Versionen einer Klasse mit unterschiedlichen Schnittstellen verwenden, müssen Sie darauf achten, dass sie keine Methoden aufrufen, die in einer Version gar nicht existieren. Es kann in vielen Fällen sinnvoll sein, mit Hilfe der Reflection API sicher zu stellen, dass die Klasse über die benötigten Methoden verfügt, von der richtigen Klasse erbt oder die richtigen Interfaces implementiert.
      war mir schon vorher klar. Aber mal angenommen die Schnittstelle der Klasse ändert sich in der neuen Version nicht, dann ist das doch eine sehr elegante Methode die alte Version der Klasse unangetastet zu lassen und nur das neue Verhalten zu implementieren und die Erzeugung der Objekte in eine Factory auszulagern, bzw. schon immer eine Factory zur Erzeugung zu verwenden.

      Gruß

      Wolfgang

      Comment

      Working...
      X