Ich habe vor kurzem eine Klassenbibliothek geschrieben, die einige Objekte enthält, die bestimmte Dateitypen modellieren. Zum Beispiel gibt es eine abstrakte Document
Klasse, mit abgeleiteten Klassen PdfDocument
(Beton) und OfficeDocument
(abstrakt, mit konkreten abgeleiteten Klassen wie WordDocument
und ExcelDocument
) usw.Wer sollte für die Auswahl der geeigneten abgeleiteten Klasse verantwortlich sein?
Derzeit wird die Art und Weise Kunden ein neues Objekt zu erstellen ist durch die Auswahl die entsprechende abgeleitete Klasse und übergibt ihr das Byte-Array. So zum Beispiel, wenn ich einen Byte-Array eines PDFDocument und ein worddocument habe, würde ich so etwas wie:
var wordDocument = new WordDocument(wordDocumentByteArray);
var pdfDocument = new PdfDocument(pdfDocumentByteArray);
Ist das akzeptabel Design, dass der Kunde muss wissen, was Klasse abgeleitet zu benutzen? Oder wäre ich besser dran, alle außer der abstrakten Klasse Document
zu verstecken und etwas wie ein abstraktes Fabrikmuster zu verwenden, um den korrekten abgeleiteten Typ zurückzugeben? z.B .:
var wordDocument = DocumentFactory.GetDocument(wordDocumentByteArray, "docx");
// pass file extension so we know what the file is
Beachten Sie, dass die abgeleiteten Typen hinzufügen keine zusätzliche Eigenschaften/Methoden die abstrakten Klasse, implementieren sie nur die abstrakten Methoden auf unterschiedliche Weise.
Definitiv die 2. Option. Ermöglicht eine wesentlich einfachere zukünftige Erweiterbarkeit und bedeutet, dass Benutzer weniger Zeit mit dem Aktualisieren von Klassendeklarationen verbringen, wenn neue, passendere Typen hinzugefügt werden. –
Hat die 'Document'-Klasse alles, was der Endbenutzer jemals mit einem bestimmten 'Dokument' tun muss, oder wird gelegentlich (oder häufig) Zugriff auf Funktionalität benötigt, die für einen abgeleiteten Typ spezifisch ist? – Servy
@Servy Ja, die Klasse 'Document' hat eine öffentliche abstrakte Methode. Alle abgeleiteten Klassen bestehen nur aus geschützten und privaten Hilfsmethoden (plus der überschriebenen öffentlichen Methode) mit dem einzigen Zweck, die eine öffentliche Methode zu implementieren. – Andrew