Guten Morgen,
es ist schwer für mich das ganze (vermutlich falsche) Geflecht an Klassen und Strukturen zu beschreiben, deswegen beschreibe ich hier
nochmal mein Vorhaben ohne konkrete Struktur.
Es dreht sich um einen Fehlerreport.
Ein Fehler besteht aus einer Identifikationsnummer, einer Beschreibung und einem Datum.
Dieses Fehlerobjekt (IncidentReport) wird erstellt und einer Klasse für die Verarbeitung/Speicherung (IncidentReportRepository) übergeben.
Dort wird das Fehlerobjekt für die Speicherung aufgearbeitet und in das entsprechende Format für die Speicherung überführt.
Wie das Objekt gespeichert wird, also ob in einer Datenbank, in einer Datei oder in der Cloud etc. übernimmt eine von der IncidentReportRepository
parametrierte Klasse, welche über ein Interface bekannt ist.
Die bekannten IncidentReports sollten auch über das IncidentReportRepository abrufbar sein.
Zusätzlich gibt es als erstes Objekt im "Construction-Graph" einen ApplicationManger, welche die Anwendung "zusammenhält" und die Form
erstellt und alle vermittelnden Tätigkeiten übernimmt.
Vorgehen aus Sicht des Anwenders:
Das Programm wird gestartet, es erscheint eine Form mit einer Liste aller bisherigen Fehler und es gibt z.B. einen Button um eine neuen Fehler
anzulegen. Wird der Button gedrückt, geht eine Eingabemaske auf, in welche ich die 3 Informationen zum Fehler eintragen und diesen per "OK"
Button speichern kann.
Der eben angelegte Fehler erscheint in der Liste.
Datenfluss beim Anlegen eines Fehlers:
Das IncidentReportElement wird über die Maske erzeugt und an das IncidentReportRepository übergeben. Dort wird es in ein definiertes Format übertragen
und anhand einer weiteren Klasse z.b. in der Datenbank gespeichert.
Vorgehen beim Start der Anwendung:
In der static void main wird über eine ApplicationFactory ein ApplicationManager erstellt und über eine RunApplication-Methode ausgeführt.
Der ApplicationManager erstellt dort eine Form (ist via Interface bekannt) und erstellt das IncidentReportRepository (ebenfalls über ein Interface bekannt).
Dann kann der ApplicationManager (gibt es auch als Interfacetyp) die bisherigen Fehler beim IncidentReportRepository abfragen und er Form mitteilen.
bisherige Gedanken dazu:
Der ApplicationManager bekommt über den Konstruktor Factories mitgeteilt, über welche er z.B. die MainForm und den IncidentReportManager
erstellen kann. In eine weitere Factory (weil die Lebensdauer der Elemente geringer ist), kann der ApplicationManager IncidentReports erstellen.
"Anforderungen":
- Die MainForm soll über ein Interface verfügen
- Die IncidentReport-Klasse soll über ein Interface verfügen
- Das IncidentReportRepository soll über ein Interface verfügen
- Es soll ein Interface für die Speicherung der vom IncidentReportRepository aufbereiteten Daten geben (um dann div. Implementierungen anlegen zu können)
- Ich möchte später einfach umschalten können, wie die Daten gespeichert werden (nach meinem aktuellen Verständnis ist dazu nur ein anpassen der Factories nötig)
offene Punkte:
- wie transportiere ich z.B. eine Fehler beim Erstellen oder beim Speichern eines IncidentReportRepository an die Form, damit sie dem Benutzer gezeigt werden kann?
- Ich wollte die Projektmappe so strukturieren, dass ich ein Projekt rein für die Interfaces habe, damit ich diese (ohne Code preisgeben zu müssen) an dritte Entwickler weitergeben kann (hier weiß ich jedoch nicht ob das überhaupt notwendig bzw. sinnvoll oder umsetzbar ist)
- Das Thema Interface + abstrakte Basisklasse:
- für den Fall, ein IncidentReportObjekt über den ApplicationManager abgefragt wird, wollte ich verhindern, dass man dies bearbeiten kann. Deswegen war meine Idee dahinter, in dem öffentlichen Interface nur die Getter zur Verfügung zu stellen und intern mit einer abstrakten Klasse zu arbeiten (welche das Interface implementiert) und zusätzlich die Setter implementiert. Auch hier weiß ich nicht, ob das sinnvoll und überhaupt notwenig ist. Hierzu habe ich keine "best practices" gefunden.
Es handelt sich hierbei nur um ein Demoprojekt, um mir über die Struktur Gedanken zu machen.
Ich hoffe, ich konnte mein Problem jetzt etwas genauer beschreiben.
Wie würde ich so ein Projekt jetzt strukturell am saubersten aufbauen?
Gruß Max