Wie dies in OO modellieren

stimmen
2

Ich habe ein UI-Dialog so etwas wie dies: Sie müssen ein Buch aus einer Liste auswählen. Optional können Sie entweder einen Verlag (eine andere Klasse) aus einer Liste auswählen oder den Herausgeber-Namen als Zeichenfolge eingeben.

Ich denke, das mir drei Arten als die Ausgabe aus dem Dialog gibt.

  1. Buch
  2. Buch mit publisher-Klasse
  3. Buch mit Verleger-string

Wie würden Sie diese in Objekte modellieren? Es scheint mir, dass das eine Buch Basisklasse hat, und dann zwei Unterklassen für Herausgeber und Verleger Namen ist die richtige Wahl. Gibt es Alternativen, vielleicht Zusammensetzung begünstigt, die ein besseres Modell geben würde?


Ich werde versuchen, ein bisschen mehr zu erklären. Ein Buch muss nicht einen Verlag haben. Der Verlag Objekt ist nicht das gleiche wie ein Verleger-Namen als Zeichenfolge eingegeben.

Sie müssen
ein Buch aus einer bestehenden Liste -Wählen

Sie können eine der folgenden Optionen
-Wählen einem Verlag aus einer bestehenden Liste oder
-Sie können einen Publisher - Namen eingeben oder
-Sie können nichts über den Verleger füllen

Veröffentlicht am 09/12/2008 um 20:58
quelle vom benutzer
In anderen Sprachen...                            


8 antworten

stimmen
5

Nummer zwei wäre mein Ansatz.

Ich würde mit einer Eigenschaft eine Klasse für Publisher namens Namen, zusammen mit allen anderen Eigenschaften erforderlich, einen Verleger zu beschreiben.

Dann würde ich mit den Eigenschaften eine Klasse für Buch, um es zu beschreiben, zusammen mit einer Eigenschaft vom Typ Verlag.

Wenn der Benutzer einen neuen Verlag als Zeichenfolge eingibt, ein neues Publisher-Objekt erstellen.

Wenn der Benutzer keinen Verleger gelangt, lassen Sie die Eigenschaft null. Das wird die Bedingung erfüllt, dass das Buch keine Verlage hat. Alternativ können Sie Verleger mit dem Namen „No publisher“ haben, aber ich denke, dass zu weit aus dem Weg geht nulls zu vermeiden.

Beantwortet am 09/12/2008 um 21:01
quelle vom benutzer

stimmen
2

Ich muß im letzten Absatz mit dieser Aussage nicht einverstanden:

Es scheint mir, dass das eine Buch Basisklasse hat, und dann zwei Unterklassen für Herausgeber und Verleger Namen ist die richtige Wahl.

Subklassen werden verwendet, um "is-a-kind-of" Beziehung. (Das alte müdee Klischee ist eine Obst-Klasse, mit Apfel und Orange als Unterklassen.) Ein realistischeres Beispiel ein Abrechnungssystem mit einer Employee-Klasse sein würde, spezialisiert durch HourlyEmployee und SalariedEmployee Klassen. In jedem Fall stellt die Unterklasse eine bestimmte Kategorie innerhalb der übergeordneten Klasse.

Im Gegensatz dazu ist ein Verlag nicht eine Art von Buch. Ein besseres Modell wäre, eine Klasse Buch zu haben und eine Publisher-Klasse, mit einer Viele-zu-eins-Beziehung zwischen ihnen (ein Buch einen einzigen Verlag, aber ein Verlag kann mehrere Bücher produzieren).

Ein Buch hat viele mögliche Attribute, wie Titel, ISBN, Verlag und Autor; eines potenziellen Verlags Attribute gehören Firmenname und Anschrift (ggf. mehrere Adressen) und eine Liste der Bücher veröffentlicht.

Je nachdem, was Sie zu modellieren versuchen, können Sie auch einen Autor Klasse brauchen, aber das ist nicht in den Anwendungsbereich von Ihrer ursprünglichen Frage.

Beantwortet am 09/12/2008 um 21:21
quelle vom benutzer

stimmen
2

Aus OO Sicht HAS-A Beziehungen lösen dieses Problem besser als IS-A-Beziehungen in diesem Fall. Ein Buch HAS-Verleger (1: 1) und ein Verlag HAS-Eine Liste der Bücher, die es veröffentlicht (1: viele). Erstellen Sie ein Buch-Klasse, die einen Verweis auf ein Publisher und Publisher-Klasse enthält, die eine Liste von Verweisen auf Bücher hat. hat der Herausgeber-A-Saite, die Sie verwenden können, einen bestimmten Verleger weiter zu lokalisieren,

Beantwortet am 09/12/2008 um 21:19
quelle vom benutzer

stimmen
1

Ich werde versuchen, ein bisschen mehr zu erklären. Ein Buch muss nicht einen Verlag haben. Der Verlag Objekt ist nicht das gleiche wie ein Verleger-Namen als Zeichenfolge eingegeben.

Sie müssen ein Buch aus einer bestehenden Liste -Wählen

Sie können eine der folgenden Optionen -Wählen einem Verlag aus einer bestehenden Liste oder -Sie können einen Publisher-Namen eingeben oder -Sie können nichts über den Verleger füllen

Noch fordert ein Objekt benutzerdefinierte Ergebnis. Jetzt haben Sie drei Felder ein Buchobjekt, ein Verlag Objekt, und ein Verlag String. Sie übergeben es dann an den Code, der auf intelligente Weise damit umgehen können. Sie könnten Methoden hinzufügen benutzerdefinierte Verarbeitung Bedarf zu decken. Aber am Ende ist es ein spezielles Ergebnis dieses Dialogs und sollten nicht einige Teilfeld Buch oder Herausgeber oder einem anderen Objekt sein.

Wenn das Buch nichts wissen Sie, Sie einen Fehler bekommen, weil Sie ein Buch benötigen. Sie haben vier Kombinationen von Publisher-Objekt und Publisher_String mit als auch zu behandeln. Davon zeigt mir, dass Sie eine Klasse müssen mit dem Ergebnis, speziell zu behandeln.

Beantwortet am 09/12/2008 um 21:50
quelle vom benutzer

stimmen
1

Ich würde keine Publisher - Klasse erstellen Buch zu erben, da Publisher kein Buch, es ist Metadaten - Informationen über ein Buch. Die Bibel aber wäre erben Buch.

Mein Rat wäre, eine Publisher-Eigenschaft auf dem Buch zu erstellen. Dieser Verlag könnte vom Typ IPublishInformation sein, und der String-Verlag eine NamedPublisher {string Namen} Klasse, Implementierung IPublishInformation nutzen könnte.

Das ist meine Gedanken sowieso!

Beantwortet am 09/12/2008 um 21:12
quelle vom benutzer

stimmen
0

Versuchen Sie, diese (C #):

Class Book
{
   public string Name;
   public List<Publisher> publishers = new List<Publishers>;

   Book()
   {
      // Load publishers array with relevant instances of Publisher class...
   }
}

Class Books
{
   private List<Book> books = new List<Book>;
   public Books()
   {
      // Load books array with all books...
   }

   public List<Book> GetBook (string publisher)
   {
      List<Book> retVal = new List<Book>;
      foreach (Book item in books)
      {
         if (item.Publisher.Name == publisher)
         {
            retVal.Add(item);
         }
      }
   }

   public List<Book> GetBook (Publisher publisher)
   {
      List<Book> retVal = new List<Book>;
      foreach (Book item in books)
      {
         if (item.Publisher.Name == publisher.Name)
         {
            retVal.Add(item);
         }
      }
   }
}

Class Publisher
{
   public string Name;
}
Beantwortet am 09/12/2008 um 22:00
quelle vom benutzer

stimmen
0

Wenn Sie, dass Bücher gehen davon können mehrere Verlage haben. Dann werde ich würde eine BookSelectonResult mit zwei Anstands zurückzukehren. Ein Satz mit einem Buch und ein weiterer Satz an den ausgewählten Publisher. Diese Antwort geht auch davon aus, dass Sie ein Buch Klasse haben, einen Verleger Klasse, und eine Sammlung Klasse für jeden.

Der Punkt des Dialogs ist zurückzukehren, was der Benutzer ausgewählt. Das ist ein einzigartiges „Ding“, so verdient seine eigene Klasse. Wenn alles, was Sie taten ein einzelnes Buch oder einen einzelnen Verleger ist dann wieder die ursprüngliche Klasse verwenden würde direkt in Ordnung sein. Aber hier haben Sie mehrere Möglichkeiten in den Ergebnissen, so dass für ein einzigartiges Ergebnis Klasse aufruft.

Die andere Überlegung ist, wie trivial ist dieser Dialog? Zum Beispiel Kommissionierung einen Dateinamen, ein Buch zu öffnen. Der Dateiname Existenz ist flüchtig, was Sie wollen das Buch ist in Ihrem System gespeichert werden. Das gleiche gilt für das Ergebnis ein Buch und einen Verleger auswählen. Wenn Sie ein anderes Objekt hatten bereits das Ergebnis zu halten (wie eine Checkliste aus), dann schlage ich nicht mit irgendwelchen speziellen Methoden oder Klassen stören. Bundle den Dialog in ein Command-Objekt und zurück nur das Ergebnis in den Mitgliedern der Dialogklasse. Dann verarbeiten, um das Ergebnis zu, wo sie schließlich gespeichert werden.

In meiner CAM-Software kann ich dies oft mit dem Dialog, die Konfigurationsoptionen statt mit meiner aufwendigen Model-View-Presenter Architektur manipulieren. Der Grund, warum ich damit durchkommen kann, ist, weil, wenn ein Benutzer auf ein Element klicken oder eine Aktion ausführen, die UI-Controller ein Command-Objekt ausführt, die dann das Modell manipuliert. Alles geht durch Befehlsobjekt in meinem Setup. Also für triviale Dialoge ich sie nur mit Befehl Objekte bündeln, die den Dialog verwendet, anstatt die gesamte MVP Schicht zu erstellen.

Letztlich ist es eine Ermessenssache.

Beantwortet am 09/12/2008 um 21:35
quelle vom benutzer

stimmen
0

Ich denke, dass es schwierig ist, eine Design-Entscheidung nur auf diesem Dialog basieren. Zum Beispiel werden Sie Kommissionierung aus einem Satz bestehende Bücher? In diesem Fall was, wenn der Benutzer gibt einen Verleger, der nicht existiert? In diesem Fall können Sie nicht eine Instanz jeder Klasse Buch überhaupt zurück, aber eine Art von Ausnahme ausgelöst.

Sie alle Bücher in Ihrem Fall haben Verlage? Wenn ja, dann bin ich mit @Bob, dass Sie eine Publisher-Klasse machen könnten, und haben eine Klasse Buch enthalten eine Instanz eines Publisher-Objekt. Wenn nur einige Bücher Verleger haben, dann könnte man mit dem Vererbungsmodell gehen Sie beschreiben, aber ich würde kollabieren Optionen 2 und 3 in eine einzige Wahl (wiederum durch ein Publisher-Objekt), weil sonst könnte man mit zwei Instanzen desselben am Ende Buch, die Objekte verschiedenen Typen sind (ein, wo der Benutzer den Verlag als Zeichenfolge eingegeben, und einmal aus der Liste Kommissionierung).

--Phil

Beantwortet am 09/12/2008 um 21:15
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more