Projektując system, często napotykam problem polegający na tym, że wiele modułów (logowanie, dostęp do bazy danych itp.) Jest używanych przez inne moduły. Pytanie brzmi: jak przejść do dostarczania tych komponentów innym komponentom. Dwie odpowiedzi wydają się możliwe wstrzyknięcie zależności lub użycie wzorca fabrycznego. Jednak oba wydają się błędne:
- Fabryki sprawiają, że testowanie jest uciążliwe i nie pozwala na łatwą wymianę implementacji. Nie ujawniają również zależności (np. Badasz metodę, nieświadomy faktu, że wywołuje metodę, która wywołuje metodę, która wywołuje metodę korzystającą z bazy danych).
- Wstrzyknięcie Dependecy ogromnie pęcznieje na listach argumentów konstruktora i rozmywa niektóre aspekty w całym kodzie. Typowa sytuacja ma miejsce, gdy wyglądają tak konstruktory o ponad połowie klas
(....., LoggingProvider l, DbSessionProvider db, ExceptionFactory d, UserSession sess, Descriptions d)
Oto typowa sytuacja, z którą mam problem: Mam klasy wyjątków, które używają opisów błędów ładowanych z bazy danych, używając zapytania, które ma parametr ustawienia języka użytkownika, który jest w obiekcie sesji użytkownika. Aby utworzyć nowy wyjątek, potrzebuję opisu, który wymaga sesji bazy danych i sesji użytkownika. Więc jestem skazany na przeciąganie tych wszystkich obiektów wszystkimi moimi metodami, na wypadek, gdybym musiał rzucić wyjątek.
Jak poradzić sobie z takim problemem?