Wer sollte für die Auswahl der geeigneten abgeleiteten Klasse verantwortlich sein?

8

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.:

%Vor%

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.

    
Andrew 02.07.2012, 16:05
quelle

2 Antworten

9

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.

    
dasblinkenlight 02.07.2012, 16:09
quelle
3

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.

    
Robert Levy 02.07.2012 16:10
quelle

Tags und Links