Bitte kommentieren Sie keine schlechten Praktiken, die hier verwendet werden. Ich versuche einfach, die Abstraktion dieses Szenarios mit leicht zu beschreibenden Beispielen anzugehen.Abstraktionsherausforderung. Wie man sich der Verkapselung für diesen Zweck nähert
Ich versuche, ein System zu modellieren, das es einem Benutzer ermöglicht, eine Entität namens TASK mit bestimmten Konfigurationsparametern einzugeben, und später muss der TASK bestimmte Aktionen für diese Aufgabe ausführen.
Einige Beispiele für Taskdefinitionen könnten sein:
* Erstellen Sie eine Datei {Dateiname} im Verzeichnis {Pfad}.
* Kopieren Sie die Datei {Dateiname} von {Quellverzeichnis} nach {Zielverzeichnis}.
* Öffnen Sie {notepad application}, geben Sie den Text {sample text} ein und speichern Sie die Datei als {filename}.
* Öffnen Sie {sample.docx}, geben Sie den Text {sample text} am Ende des zweiten Absatzes ein.
Jede Aufgabe hat einen beschreibenden Namen und bis zu 5 Parameter. In den obigen Beispielen sind Parameter in geschweiften Klammern {} eingeschlossen. Die Benutzer werden angewiesen, die oben genannten Aufgaben auszuführen, und unser Antrag wird prüfen, ob sie abgeschlossen wurden. Jede Aufgabe muss die folgende Funktion hat:
In einer statischen Welt, würde ich die folgenden Klassen erstellen:
public abstract class TaskBase { public abstract void Perform(param1, ... param5); }
public class TaskFileCopy: TaskBase { public override void Perform(param1, ... param5) {} }
Das Problem ist, Aufgaben können praktisch alles sein und nach dem Programm zusammengestellt und eingesetzt , müssen weitere Aufgaben hinzugefügt werden. Die erste und schlimmste Sache, die mir in den Sinn kommt, ist, von TaskBase weiterzuleiten, Perform zu implementieren, neu zu kompilieren und erneut zu implementieren, während die vorherigen Task-Ergebnisse in Takt gehalten werden.
Zwei Probleme hier: Wenn wir 2.000 Aufgaben erreichen, werden wir höchstens 2.000 abgeleitete Klassen haben und zweitens wird der zugrundeliegende OODB festgefahren sein.
Ich habe einmal an System.AddIn gedacht, bin aber überzeugt, dass dieses Szenario eine bessere Lösung für das OOP-Design bietet.
Hmmm ... Für jetzt habe ich mit der Vererbung fest, bis die Anzahl der Aufgaben erhöht. Zusätzlich zu Ihren Vorschlägen erwäge ich auch, Code oder kompilierte Module zu speichern und sie zur Laufzeit mit Reflektion zu verwenden. Ich muss MEF besser verstehen. Das Composite-Muster könnte ein Kandidat sein, aber das erschreckt mich etwas, da ich weiß, wie vielfältig die Aufgaben sein können. –