Ich habe kürzlich eine Klassenbibliothek geschrieben, die einige Objekte enthält, die bestimmte Dateitypen modellieren. Zum Beispiel gibt es eine abstrakte Klasse Document
mit den abgeleiteten Klassen PdfDocument
(konkret) und OfficeDocument
(abstrakt, mit konkret abgeleiteten Klassen wie WordDocument
und ExcelDocument
), etc.
Gegenwärtig besteht die Art, wie Clients ein neues Objekt erstellen, darin, die entsprechende abgeleitete Klasse auszuwählen und sie an das Byte-Array zu übergeben. Wenn ich zum Beispiel ein Byte-Array eines PdfDocuments und eines WordDocuments habe, würde ich etwas tun wie:
%Vor% Ist das akzeptable Design, dass der Client wissen muss, welche abgeleitete Klasse zu verwenden ist? Oder wäre es besser, 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.:
Beachten Sie, dass die abgeleiteten Typen der abstrakten Klasse keine zusätzlichen Eigenschaften / Methoden hinzufügen. Sie implementieren die abstrakten Methoden einfach auf verschiedene Arten.
Der zweite Ansatz ist viel besser als der erste, weil er die Existenz von Word- und PDF-Dokumenten von den Benutzern Ihrer Bibliothek verdeckt. Dies wird besonders wichtig, wenn Sie sich entscheiden, weitere Dokumenttypen hinzuzufügen - z. Rtf, Html und so weiter: Die Benutzer würden die Vorteile der neu hinzugefügten Typen erhalten, ohne ihren Code neu kompilieren zu müssen. Tatsächlich würden sie gar nicht bemerken, dass du etwas verändert hast: Wenn du es richtig gemacht hast, wird ihr Code "einfach funktionieren" mit den Dokumenten, von denen sie nie wussten, dass sie existieren.
P.S. Wenn Sie das Bytearray scannen und den richtigen Typ daraus ermitteln können, kann Ihre API durch Eliminieren des zweiten Parameters einige Punkte für den Stil erzielen.
Wenn die abgeleiteten Typen keine Eigenschaften / Methoden hinzufügen und Sie die technische Möglichkeit haben zu bestimmen, welcher Typ für ein gegebenes Byte [] verwendet wird, würde ich die abgeleiteten Klassen nicht einmal öffentlich machen ... sie erhöhen nur die Oberfläche der Sachen, die der Verbraucher beim Lernen Ihrer Bibliothek analysieren muss. Verwenden Sie einfach eine statische Factory-Methode wie " public static Document OpenDocument(byte[] data)
" in der Document-Klasse.
Tags und Links c# oop class-design