Podejrzewam, że popełniłem tutaj błąd ucznia i szukam wyjaśnienia. Wiele klas w moim rozwiązaniu (C #) - śmiem twierdzić, że większość - skończyłem pisać odpowiedni interfejs. Np. Interfejs „ICalculator” i klasa „Calculator”, która go implementuje, nawet jeśli nigdy nie zastąpię tego kalkulatora inną implementacją. Ponadto większość z tych klas znajduje się w tym samym projekcie co ich zależności - tak naprawdę muszą być internal
, ale ostatecznie okazały się public
efektem ubocznym implementacji ich interfejsów.
Myślę, że ta praktyka tworzenia interfejsów do wszystkiego wynikała z kilku kłamstw:
1) Początkowo myślałem, że interfejs jest niezbędny do tworzenia próbnych testów jednostkowych (używam Moq), ale od tego czasu odkryłem, że klasa może być wyśmiewana, jeśli jej członkowie są virtual
, i ma konstruktor bez parametrów (popraw mnie, jeśli Nie mam racji).
2) Początkowo myślałem, że interfejs jest niezbędny do zarejestrowania klasy w frameworku IoC (Castle Windsor), np
Container.Register(Component.For<ICalculator>().ImplementedBy<Calculator>()...
kiedy w rzeczywistości mógłbym po prostu zarejestrować konkretny typ dla siebie:
Container.Register(Component.For<Calculator>().ImplementedBy<Calculator>()...
3) Zastosowanie interfejsów, np. Parametrów konstruktora do wstrzykiwania zależności, powoduje „luźne sprzężenie”.
Więc oszalałem na punkcie interfejsów ?! Zdaję sobie sprawę ze scenariuszy, w których „normalnie” używałbyś interfejsu, np. Ujawniając publiczny interfejs API lub do takich rzeczy, jak „podłączalna” funkcjonalność. Moje rozwiązanie ma niewielką liczbę klas, które pasują do takich przypadków użycia, ale zastanawiam się, czy wszystkie inne interfejsy są niepotrzebne i czy powinny zostać usunięte? Czy w związku z pkt 3) nie naruszyłbym „luźnego sprzężenia”, gdybym to zrobił?
Edycja : - Właśnie gram z Moq i wydaje się, że wymaga to metod publicznych i wirtualnych oraz publicznego konstruktora bez parametrów, aby móc się z nich kpić. Więc wygląda na to, że nie mogę mieć klas wewnętrznych?