2009-08-24 13 views
5

Mam klasę fabryki, DocumentLoaderFactory, która po prostu zwraca instancję implementującą interfejs, IDocumentLoader.Do której przestrzeni nazw należy klasa fabryczna?

Wszystko realizacja polega na poniższej nazw

Skim.Ssms.AddIn.ActiveFileExplorer.Loader

Ale co ja zastanawiałem się, co nazw nie DocumentLoaderFactory należeć? Na razie umieściłem klasę fabryczną w obszarze nazw *.Loader, ale jest ona używana z poziomu kontroli użytkownika (ActiveFileWindow) nadrzędnej przestrzeni nazw, Skim.Ssms.AddIn.ActiveFileExplorer, jak pokazano poniżej.

Co by było zaletami & przeciwstawienia metody fabrycznej w obrębie *.Loader lub jej nadrzędnej przestrzeni nazw? Chciałbym podjąć decyzję w zależności od plusów/minusów.



Oto układ mojego projektu alt text

Odpowiedz

8

Powiedziałbym, że najlepiej będzie kolokować swoje fabryki z typem, który tworzą. Fabryka jest dostawcą czegoś i powinna być związana z rzeczami, które zapewnia. Jeśli będziesz przestrzegać zasad spójności, dojdziesz do tego samego wniosku. Powiązane rzeczy powinny być blisko siebie, aby utrzymać spójny interfejs API.

+0

@jrista: Postanowiłem opuścić klasę fabryczną w przestrzeni * Loader. Posiadanie metody fabryki w nadrzędnej przestrzeni nazw zdaje się zanieczyszczać strukturę projektu. – Sung

+0

Myślę, że to właściwe miejsce.:) Jeśli kiedykolwiek zdecydujesz się wyrzucić przestrzeń nazw Loader do swojego własnego zespołu, nie natrafisz na problemy z brakującymi referencjami fabrycznymi lub cokolwiek w tym stylu. – jrista

2

powiedziałbym pozostawić go w **. * Ładowarka nazw jak to będzie łatwiej znaleźć podczas pracy z IDocumentLoader implementacje .

+0

O ile mi wiadomo, zwykle obiekt nie powinien wywoływać/tworzyć instancji obiektu/metody podrzędnej przestrzeni nazw. Ale jeśli miałbym przenieść fabrykę do nadrzędnej przestrzeni nazw, czy metoda fabryczna nie byłaby jedyną dostępną do klas wewnątrz podrzędnej przestrzeni nazw? – Sung

+0

Dlaczego tak mówisz? Nie widzę powodu, dla którego obiekt nie może wywoływać/tworzyć instancji i metody/obiektu dziecięcej przestrzeni nazw. To naprawdę zależy od tego, jak chcesz, aby Twój interfejs API wyglądał z zewnątrz. –

4

Ponieważ kod, który używa twoich fabrycznych potrzeb, nie ma absolutnie żadnej wiedzy na temat implementacji w abstrakcyjnym wzorze fabrycznym, zazwyczaj umieszczam interfejs i fabrykę (plus wszelkie informacje o typie) w katalogu głównym, następnie implementacje w ich własnych folderach (lub folder, jeśli jest ich mało).

Więc w twoim przypadku mam coś takiego:

Loader 
- DocumentLoaderFactory 
- DocumentLoadType 
- IDocumentLoader 


Loader\Implementation 
- NameDocumentLoader 
- TypeDocumentLoader 
- ConnectionDocumentLoader 
- DocumentLoader 

mam przyjąć, że DocumentLoader jest abstrakcyjną klasą bazową, która dziedziczy interfejs ze względu na jego nazwisko, ale masz pomysł. Nie wiem, do czego służy inna klasa "TreeViewImageIndex", ale można ją umieścić w dowolnym miejscu lub zupełnie innym, jeśli jest to właściwe.

Dzięki temu Twój kod jest przyjemny i spójny, nie wymaga, aby Twoja klasa implementacji znała przestrzeń nazw Loader \ Implementation i pozwalała na łatwiejsze odczytanie drzewa dokumentu.

+0

@Odd: Dzięki, Dziwne. Tak, DocumentLoader jest * abstrakcyjną * klasą. I tworzenie innej przestrzeni nazw dla implementacji jest podejściem, którego nie myślałem o – Sung

+0

@Odd: Abstrahowanie przez wprowadzenie innej przestrzeni nazw brzmi solidnie, ale zbyt głęboka przestrzeń nazw w moim przypadku nie wydaje się być warta kłopotów. mój konkretny przypadek. – Sung

+0

To dobrze, nie pasuje do wszystkich. Osobiście nie lubię utrzymywać zbyt wielu klas w jednym katalogu nazw/katalogów, ponieważ powoduje to zaśmiecanie mojego kodu i tam, gdzie mogę logicznie oddzielić, tak robię. – Odd