Niedawno napisałem bibliotekę klas, która zawiera obiekty, które modelują określone typy plików. Na przykład, nie jest abstrakcyjnym Document
klasy, z klas pochodnych PdfDocument
(beton) oraz OfficeDocument
(streszczenie, pochodzące z konkretnych klas, takich jak WordDocument
i ExcelDocument
) itpKto powinien być odpowiedzialny za wybór odpowiedniej klasy pochodnej?
Obecnie klienci sposób utworzyć nowy obiekt jest poprzez wybranie Odpowiednia klasa pochodna i przekazanie jej tablicy bajtów. Tak na przykład, jeśli mam tablicę bajtów o PdfDocument i Worddocument, chciałbym zrobić coś takiego:
var wordDocument = new WordDocument(wordDocumentByteArray);
var pdfDocument = new PdfDocument(pdfDocumentByteArray);
Czy to dopuszczalne projektu, że klient musi wiedzieć, co pochodzi klasę w użyciu? Czy też lepiej byłoby ukryć wszystkie oprócz abstrakcyjnej klasy Document
i używając czegoś takiego jak abstrakcyjny wzorzec fabryczny, aby zwrócić poprawny typ pochodny? np .:
var wordDocument = DocumentFactory.GetDocument(wordDocumentByteArray, "docx");
// pass file extension so we know what the file is
Należy zauważyć, że typy pochodzące nie dodać dodatkowe właściwości/metod do klasy abstrakcyjnej, po prostu wdrożyć metody abstrakcyjne na różne sposoby.
Zdecydowanie druga opcja. Pozwala na znacznie łatwiejszą rozbudowę w przyszłości i oznacza, że ludzie spędzają mniej czasu na aktualizowaniu deklaracji klasy, gdy dodawane są nowe, bardziej odpowiednie typy. –
Czy klasa "Dokument" ma wszystko, co użytkownik końcowy kiedykolwiek będzie musiał zrobić z danym "Dokumentem", czy od czasu do czasu (lub często) będzie potrzebować dostępu do funkcji specyficznej dla bardziej pochodnego typu? – Servy
@Servy Tak, klasa 'Dokument' ma jedną publiczną metodę abstrakcyjną. Wszystkie klasy pochodne składają się wyłącznie z chronionych i prywatnych metod pomocniczych (wraz z nadpisaną metodą publiczną) wyłącznie w celu implementacji jednej publicznej metody. – Andrew