Announcement

Collapse
No announcement yet.

OOP Design Frage

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

  • OOP Design Frage

    Hallo, ich habe eine Aufgabenstellung und weis nicht so recht wie ich diese OO gerecht umsetzen soll. Vielleicht könnt ihr mir ein paar Anregungen geben. Also:

    Eine Datei enthält einzelne Datensätze mit. Jeder Datensatz enthält die Artikelnummer und eine Artikelgruppe.

    Eine Windows-Form soll diese Daten anzeigen, es sollen neue Artikel hinzugefügt und gelöscht werden können. Die Form enthält zwei Listboxen: In der Linken werden die Artikelgruppen und in der rechten die korrespondierenden Artikelnummern angezeigt. Wenn also in der linken Listbox (Artikelgruppen) z.B. Gruppe 26 angewählt wird, sollen in der rechten Listbox alle Artikel die zur Artikelgruppe 26 gehören angezeigt werden.
    Eine Besonderheit ist die Artikelgruppe 0. Wenn diese angewählt wird, werden ALLE Artikelnummern in der rechten Listbox angezeigt.
    Außerdem gibt es noch die Schaltflächen NEU zum hinzufügen eines Artikels und die Schaltfläche LÖSCHEN, zum löschen eines Artikels.

    Bis hierher ist soweit alles klar. Obige Beschreibung soll nur zum besseren Verständnis beitragen.

    Wie verwalte ich aber nun die Daten am besten. Ich dachte an folgende Lösung:

    Eine Basisklasse C_Group0 enthält eine statische Arraylist, in der ALLE Artikelnummern gespeichert werden. Außerdem sollten noch die Methoden Add und Delete enthalten sein.

    Von dieser Basisklasse wird eine Klasse C_GroupX abgeleitet, die ebenfalls eine Arraylist enthält, die aber nicht statisch ist. In der abgeleiteten Klasse werden nur die Artikelnummern einer entsprechenden Gruppe.

    Ich erstelle also ein Objekt „group0“ der Klasse C_Group0 sowie weitere 99 Objekte der Klasse C_GroupX. Diese Objekte speichere ich in einem Array.

    Angenommen ich will nun einen Artikel aus der Gruppe 26 löschen, sollte es dann so gehen: Array[3].Delete(). Die Delete-Methode löscht den Artikel aus seiner Arraylist. Gleichzeitig löscht sie den Artikel auch aus der statischen Arraylist des Basisobjekts.

    Wenn ich aber aus der Gruppe 0 einen Artikel löschen möchte, müsste es umgekehrt sein. Zuerst wird der Artikel aus dem statischen Array des Basisobjekts gelöscht. Anschließend muss der Artikel auch aus dem entsprechenden Gruppenobjekt gelöscht werden. Das bekomme ich aber nicht hin.

    Ich hoffe ich konnte mein Anliegen einigermaßen Verständlich erklären. Mich würde interessieren, wie Ihr das anstellen würdet. Besonders sollte das OOP Konzept nicht zu kurz kommen.

    Danke schon mal

  • #2
    Schau mal hier:

    http://entwickler-forum.de/showthread.php?t=63663

    Dort hab ich schon mal die Architektur aufgezeigt die eigentlich jede Applikation haben sollte. Data Access Layer, Service Layer und GUI Layer.

    Prinzipiell definierst Du erstmal Objekte:

    [highlight=c#]
    public class Artikelgruppe
    {
    public int Id { get; set; }
    public IList<Artikel> { get; set;}
    }

    public class Artikel
    {
    public int Id { get; set; }
    public String Beschreibung { get; set; }
    }
    [/highlight]

    So nun definierst Du einfache Interfaces zum Laden und Speichern der Artikelgruppen. Da Du immer nur mit Artikelgruppen arbeitest würde ich das als Aggregat (kleinste Menge) ansehen:

    [highlight=c#]
    public interface IArtikelgruppenRespository
    {
    IList<Artikelgruppe> GetAll();
    void Save(IList<Artikelgruppe> artikelgruppen);
    }
    [/highlight]

    Bin jetzt davon ausgegangen, dass Du immer alle lädst und alle wieder speicherst beim Beenden des Programms. Hast Du anderen Bedarf musst Du die Schnittstelle anpassen.

    Diese beiden Sachen landen in der Common Assembly.

    Danach implementierst Du den Datenzugriff auf das File indem Du z.B.
    [highlight=c#]
    public class FileArtikelgruppenRespository: IArtikelgruppenRepository
    {
    IList<Artikelgruppe> GetAll()
    {
    //Alle Artikelgruppen und Artikel aus File lesen
    }

    void Save(IList<Artikelgruppe> artikelgruppen)
    {
    //Alle Artikelgruppen abspeichern = File neu schreiben
    }

    }
    [/highlight]

    Diese Schnittstelle verwendest Du im Programm.

    Nun bindest Du z.B. die Artikelgruppen an eine ListBox. Wird eines ausgewählt kannst Du über listbox.SelectedItem die gewählte Artikelgruppe herausfinden und dann die Artikel per DataBinding an eine 2. ListBox für die Artikel binden.

    Artikelgruppe0 als Sonderfall würde einfach alle Artikel nehmen (eine Referenz auf die List von Artikelgruppen solltest Du ja irgendwo haben) und daraus die Artikel entnehmen und auch an die 2. ListBox binden.

    [highlight=c#]
    //Hiermit bekommst Du alle vorhandenen Artikel
    //In meinArtikelgruppen stehen alle Artikelgruppen
    var alleArtikel = new List<Artikel>();
    meineArtikelgruppen.ForEach(x => alleArtikel.AddRange(x.Artikel));
    [/highlight]

    Wenn nicht wirklich viel mehr Logik dahinter steht kann man sich meiner Meinung erstmal den ServiceLayer sparen. Will mans richtig sauber machen gehört er dazu ist aber eigentlich nur ein weiterleiten Das würde ich davon abhängig machen wieviel Logik später noch dazu kommen könnte.

    Und ich bitte darum mich nicht per PM anzuschreiben (passiert öfters ), sondern das hier weiter zu diskutieren, damit alle was davon haben bzw. sich beteiligen können.

    Comment


    • #3
      Hallo und danke für deine Antwort, durch die mir mal wieder klar geworden ist, was für ein Laie in Sachen OOP ich doch noch bin. Ein winziger Teil der UML Diagramme in deinem und den weiterführenden Links verstehe ich ja noch, aber sonst

      Muss mich da wohl noch weiterbilden ....

      Comment


      • #4
        Naja OOP ist einfach nur ein Werkzeug. Aber das ganze Thema softwarequalität und moderne praktiken ist riesig. Als Einstieg könnte ich das Buch Clean Code developer von robert c. Martin empfehlen. Aber wenn du dich erstmal an das von oben und den anderen Thread hältst hast du eine gute Basis. Ein programm ist sowieso nie perfekt. Beim nächsten Projekt hat man wieder zig Sachen die man anders machen würde. Du kannst ja auch mal nach Domain driven Design googlen. Dort findest du bestimmt auch sehr interessante Links.

        Achja und bitte möglichst keine Arrays verwenden. Lieber generische Listen. Diese sind einfach besser handzuhAben.

        Comment

        Working...
        X