Pracuję nad projektem, ale wciąż uderzam w przeszkodę. Mam określoną klasę (ModelDef), która jest zasadniczo właścicielem złożonego drzewa węzłów zbudowanego przez analizowanie schematu XML (think DOM). Chcę przestrzegać dobrych zasad projektowania (SOLID) i upewnić się, że powstały system jest łatwo testowalny. Mam zamiar używać DI do przekazywania zależności do konstruktora ModelDef (aby w razie potrzeby można je było łatwo wymienić podczas testowania).
Mam jednak problem z tworzeniem drzewa węzłów. To drzewo będzie składało się wyłącznie z prostych obiektów „wartościowych”, które nie będą musiały być niezależnie testowane. (Jednak nadal mogę przekazać Fabrykę abstrakcyjną do ModelDef, aby pomóc w tworzeniu tych obiektów.)
Ale ciągle czytam, że konstruktor nie powinien wykonywać żadnej prawdziwej pracy (np. Flaw: Constructor robi prawdziwą pracę ). Ma to dla mnie idealny sens, jeśli „prawdziwa praca” oznacza konstruowanie obiektów zależnych od ciężkiej wagi, które później można chcieć usunąć do testów. (Należy je przekazać przez DI.)
Ale co z lekkimi obiektami wartościowymi, takimi jak to drzewo węzłów? Drzewo trzeba gdzieś stworzyć, prawda? Dlaczego nie przez konstruktora ModelDef (używając, powiedzmy, metody buildNodeTree ())?
Naprawdę nie chcę tworzyć drzewa węzłów poza ModelDef, a następnie przekazywać go (za pośrednictwem konstruktora DI), ponieważ tworzenie drzewa węzłów przez analizowanie schematu wymaga znacznej ilości złożonego kodu - kodu, który należy dokładnie przetestować . Nie chcę przenosić go do kodu „przyklejającego” (który powinien być względnie trywialny i prawdopodobnie nie będzie bezpośrednio testowany).
Myślałem o umieszczeniu kodu w celu utworzenia drzewa węzłów w oddzielnym obiekcie „konstruktora”, ale waham się nazwać go „konstruktorem”, ponieważ tak naprawdę nie pasuje on do wzorca konstruktora (który wydaje się być bardziej zainteresowany wyeliminowaniem teleskopu konstruktorów). Ale nawet jeśli nazwałbym to czymś innym (np. NodeTreeConstructor), nadal wydaje mi się, że to trochę hack, aby uniknąć konstruowania ModelDef przez drzewo węzłów. Musi być gdzieś zbudowany; dlaczego nie w obiekcie, który będzie jego właścicielem?