2008-09-21 9 views
10

Czy to możliwe, aby przez interfejs? projektując teraz system, zacznę od interfejsów i stopniowo piszę testy jednostkowe wraz z interfejsami, aż otrzymam wzór, który działa dobrze. Przejdę do pisania konkretnych klas i ustawię testy jednostkowe przeciwko tym ...NET - Czy możesz przez interfejs, a kiedy nie należy interfejs

Teraz jestem kimś, kto kocha interfejsy, generalnie kończę tylko przekazując/powracając prymitywy lub interfejsy dookoła, kiedy kontroluję kod. Do tej pory uznałem, że jest to idealne, można łatwo dostosować i ulepszyć system ogólnie bez wpływu na systemy zależne.

Oczywiście nie muszę sprzedawać powodów używania interfejsów, ale zastanawiam się, czy to za burtę, żeby wszystko interfejsować, ps. Ja nie mówić o pustych interfejsów jak w coś szalonego jak:

interface IStringCollection : ICollection<string> 
{ 
} 

mówię więcej coś takiego:

interface ISomethingProvider 
{ 
    ISomething Provide(ISomethingOptions options); 
} 

Czy to naprawdę na wierzchu? moje rozumowanie jest takie, że każdy typ może zyskać w pewnym momencie na sprzężeniu ... a jedynym prawdziwym problemem, jaki miałem, było to, że musiałem się nauczyć, co według mnie jest lepszym sposobem projektowania klas, ponieważ nie ma interakcje i "hacki".

Chciałbym swoją opinię o tym, czy jest to timebomb i kiedy zdecydujesz się współpracować vs nie ..

PS to naprawdę nie jest tak dużo o tym, jak napisać interfejsów.

Odpowiedz

1

To może być prawdziwy ból wypracować ostateczną rozmowę stos przed kroku z debugera, jeśli masz interfejsy wszędzie. I wolą interfejsy tylko wtedy, gdy:

  1. trzeba członków zespołu uzgodnić, kto powinien robić to, co przed rozpoczęciem kodowania - interfejs następnie dokumentuje granicę dokładnie
  2. gdy rzeczywiście potrzebny jest interfejs, aby rozwiązać problem , więc co najmniej dwie implementacje, które nie rozciągają się wzajemnie
  3. można oczekiwać przypadek 2
1

Uważam, że interfejsy komplikuje konstrukcję, zwłaszcza dla innych ludzi do cowork na rzeczy. Nie zrozum mnie źle, interfejsy są świetne dla wielu rzeczy, ale głównie jeśli chcesz, aby dwie lub więcej klas dzieliło się wspólnym interfejsem.

Jeśli znajdziesz się w sytuacji, gdy nagle potrzebujemy interfejs, refaktoryzacji z narzędzi takich jak Resharper jest bardzo proste :)

4

Jak z niczego innego - z umiarem i wykorzystać w razie potrzeby. Zadaj sobie pytanie: "Czy będziesz go potrzebować?".

5

Interfejsy opisują umowę dotyczącą zachowania. Jeśli chcesz zaadresować jakiś zestaw obiektów zgodnie ze wzorcem behawioralnym, interfejsy są użyteczne, nie tyle jeśli po prostu opisujesz strukturę obiektów.Myślę, że musisz mieć dobry powód, aby z nich korzystać, na przykład za pomocą fabryki, która tworzy behawioralnie powiązane obiekty lub ustanawia kontrakt behawioralny dla części biblioteki. Używanie interfejsów bez celu może sprawić, że biblioteka będzie trudna do odczytania/zrozumienia/utrzymania.

1

To nie jest wyłącznie sprawa .NET, ten sam problem występuje dość często w Javie.

Jeśli nie jest to całkowicie oczywistym wymogiem, głosuję za tym, aby nie używać interfejsów i po prostu refaktoryzować, gdy potrzeba stanie się jasna.

Pragmatyczne podejście mówi po prostu o najprostszej rzeczy, która może pracować, i nie daj się złapać w architekturę astronautyki.

5

Krótko mówiąc, możliwe jest przesłonięcie projektu. Weź pod uwagę, gdy sytuacja naprawdę wymaga abstrakcyjnej klasy bazowej i interfejsu, podczas gdy obie są podobne, istnieją wyraźne zalety korzystania z obu See Here. Zazwyczaj zauważyłem, że ludzie używają interfejsów, kiedy naprawdę powinni używać abstrakcyjnych klas bazowych. Z perspektywy OO należy używać interfejsów, aby wymienić typowe zachowanie, które może obejmować bardzo różne klasy. Na przykład możesz mieć interfejs IMove z metodą o nazwie Move(). Teraz wyobraź sobie, że masz klasę Samolot, Samochód, Osoba i Insekt. Samolot i samochód mogą odziedziczyć po abstrakcyjnej klasie Pojazdów, ale nadal muszą korzystać z IMove, podobnie jak Insect i Person, ale wszystkie one wykonają ruch w inny sposób. Zauważyłem, że ja sam w sobie, ludzie zwykle używają interfejsów do "grupowania" klas razem, gdy naprawdę to powinno być obsługiwane przez klasę podstawową.

+1

Tak, jeśli piszesz zasadniczo tę samą metodę implementacji interfejsu na dwóch klasach, potrzebujesz abstrakcyjnej klasy bazowej. –

1

Zwykle nie używam zbyt wielu interfejsów do testowania. Wolałbym uczynić prywatną wartość publiczną i/lub rozszczelnienie klas i/lub metod tymczasowych podczas budowania i testowania, dopóki nie znajdę się w punkcie, w którym zbudowałem inne przedmioty i testy, które w końcu wykonają to, czego potrzebowałem. Coś jest bolesne w odbijaniu zmian, ale twoje testy podpowiedzą ci, kiedy zapomnisz coś zmienić.

3

Możliwe jest przekroczenie interfejsu. Reguła, w której pracuję, polega na tym, że jeśli masz interfejs w swojej aplikacji, musisz mieć co najmniej dwie klasy, które ją implementują (lub masz uzasadnione oczekiwanie, że będziesz dodawał klasy implementacji w niedalekiej przyszłości).

Jeśli chcesz utworzyć fałszywe obiekty do testowania, to posiadanie klasy próbnej i rzeczywistej implementacji wspólnego interfejsu jest ważnym powodem korzystania z interfejsu.

Nie polecam automatycznie używania interfejsów do wszystkiego w aplikacji, zwłaszcza, że ​​pojedyncza klasa może być w razie potrzeby łatwo refaktoryzowana w interfejsie.

+1

Piękno nowoczesnych narzędzi do refaktoryzacji polega na tym, że nie trzeba zaczynać korzystania z interfejsu, aby móc korzystać z niego w przyszłości. –

2

Ilekroć widzę lub słyszę, jak ktoś mówi to

Interfejsy opisują umowę o zachowaniu

wiem Znalazłem kogoś, kto nie rozumie interfejsów.

Interfejsy nie może zrobić. To jest niemożliwe. Interfejsy nie przepisuj, nie wymuszaj ani nie ograniczaj w żaden sposób zachowania.

Interfejsy opisać kontrakt na interfejsu, stąd nazwa. Nie mają zachowania.

Możesz mieć nadzieję, że nazwy, którym podajesz metody interfejsu, będą wymagały zachowania od każdego, kto je wdroży, ale nie ma takiego wymogu. Nie ma kontraktu behawioralnego, ani takiego nie ma.

Jeśli potrzebujesz pewnego rodzaju zachowania, musisz użyć klas, aby go wymusić (np. Za pomocą wzorca Szablon) - to jest właśnie to zachowanie.

Interfejsy są regularnie wykorzystywane jako konstrukcja, a jedną z przyczyn jest powszechna wiara w ten błąd.

+0

Twierdzę, że interfejs _documented_ może opisywać umowę dotyczącą zachowania. Możesz opisać umowę bez konieczności egzekwowania umowy; deweloper nadal ponosi odpowiedzialność za przestrzeganie dokumentacji. –

Powiązane problemy