2009-12-04 18 views
16

Często słyszę/czytam o programowaniu opartym na interfejsach, ale nie wiem dokładnie, co tak naprawdę oznacza. Czy programowanie oparte na interfejsach to rzeczywisty samodzielny temat, który rzeczywiście zawiera książki na ten temat? Jeśli tak, czy ktoś może polecić jakieś dobre?Czym dokładnie jest "programowanie oparte na interfejsie"?

Natknąłem się na programowanie oparte na interfejsie, ponieważ czytałem o tym, jak dobre interfejsy API są projektowane i chciałbym dowiedzieć się więcej na ten temat. W tej chwili nie wiem, jak właściwie projektować interfejs API wokół interfejsów.

Wszelkie informacje są bardzo mile widziane.

+0

To jest duplikat. Zobacz na przykład pytanie 1413543 (http://stackoverflow.com/questions/1413543). – jason

+0

Możesz zajrzeć do książki Head First Design Patterns. Chociaż przykłady są napisane w Javie, to dobry początek. – kragan

+1

@Jason: Programowanie do interfejsu nie musi być równoznaczne z programowaniem opartym na interfejsie. Programowanie oparte na interfejsie jest czymś więcej niż tylko używaniem interfejsów, zwykle jest to raczej decyzja architektoniczna. –

Odpowiedz

24

Jest to zasadniczo kwestia wyrażenia swoich zależności pod względem interfejsów zamiast konkretnych klas (lub, co gorsza, metod statycznych). Jeśli więc jedna z twoich klas musi wykonać uwierzytelnianie, powinna być podana IAuthenticator (lub inna).

Oznacza to, że:

  • Można napisać swój kod przed wykonaniem prawdziwe uzależnienie
  • można przetestować poprzez wyśmianie naprawdę łatwo (bez konieczności mock klas, pobierającą brzydki)
  • To jasne na czym polegasz w zakresie API zamiast implementacji (np. masz luźniejsze sprzężenie)
+0

Czy istnieje dobra książka, która wyjaśnia ten "styl" programowania w C#? – koumides

+1

@koumides: Nie konkretnie, ale szukaj "inwersji kontroli" i "zastrzyku zależności", aby znaleźć wiele artykułów. –

9

Rozdział 6 z "Practical API Design" by Jaroslav Tulach jest zatytułowany "Code Against Interfaces, Not Wdrożenia ". Wyjaśnia, że ​​poprzez kodowanie na interfejsie, a nie na konkretną implementację, można odłączyć moduły (lub komponenty) w systemie, a tym samym podnieść jakość systemu.

Bertrand Meyer w OOSC2 wyjaśnia wyraźnie, dlaczego "zamknięcie" systemu i uczynienie go bardziej modułowym podnosi jego jakość.

3

Jeśli używasz google do interfejsów, znajdziesz wiele informacji o tym, jak przydatne mogą być interfejsy.

Celem jest zdefiniowanie przejrzystych interfejsów, które będą używane przez różne komponenty/części/klasy/moduły do ​​komunikacji i interakcji. Po zdefiniowaniu, co powinno być wejściem/wyjściem tych interfejsów, możesz pozwolić różnym zespołom rozwijać wszystko, co jest potrzebne, aby spełnić wymagania interfejsu, w tym testowanie wejścia/wyjścia, ... itd.

Jeśli obserwujesz w ten sposób różne zespoły mogą zacząć opracowywać swoją część, nie czekając, aż pozostałe części będą gotowe. Oprócz tego możesz użyć testów jednostkowych (używając fałszywych obiektów do symulacji innych części, których nie rozwijasz i przetestować swoją część).

Ta metoda jest standardem dla każdego nowego projektu programistycznego i każdy uzna to za pewnik.

2

Jest to coś, co nie zaleca się używać intensywnie w rozwoju C#.

Interface-based programming zasadniczo programuje do interfejsów. Tworzysz interfejsy, z których będziesz korzystać z Kontraktów, a rzeczywista implementacja interfejsów jest ukryta za tymi umowami.

To było bardzo powszechne przed .NET, ponieważ najlepszym sposobem, aby uzyskać składniki wielokrotnego użytku w systemie Windows było za pośrednictwem COM, który pracował za pośrednictwem interfejsów wszędzie. Jednak dane.Możliwość obsługi wielu języków w jednym środowisku wykonawczym (CLR), a także lepsza obsługa wersji w porównaniu z natywnym kodem, użyteczność programowania opartego na interfejsie zmniejsza się dramatycznie, gdy programujesz w języku C# (chyba, że ​​jesteś próbując tworzyć komponenty COM, w takim przypadku nadal będziesz tworzył interfejsy COM pośrednio z twoich klas C#).

+0

Do downvoters: Nie sugeruję, że interfejsy, same w sobie, są złe - raczej, że użyteczność projektowania całego API wokół interfejsów, do czego często odnosi się "programowanie bazujące na interfejsie", niekoniecznie jest tak samo dla deweloperów C#, jak to było w dniach COM. –

+0

Kpiny są o wiele łatwiejsze w stosunku do interfejsów niż konkretne klasy (szczególnie te zamknięte bez metod wirtualnych). Nadal uważam, że wyjaśnia, na czym naprawdę polega ... –

+0

@Jon SKeet: True. Kpiny mogą być łatwiejsze w starciu z interfejsami niż z klasami zamkniętymi lub nie-wirtualnymi, ale klasy abstrakcyjne mogą być wyśmiewane równie łatwo i mają pewne zalety podczas wersjonowania, jeśli używasz C# (który został oznaczony w pytaniu). –

3

To, co określa się jako "programowanie oparte na interfejsie", jest częściej określane jako programowanie do interfejsu. Oto przykład poniżej. Korzyścią jest ukrywanie faktycznej implementacji interfejsu i umożliwienie większej elastyczności i łatwości obsługi kodu w przyszłości.

YourInterface foo = CreateYourInterface(); 
foo.DoWork(); 
foo.DoMoreWork(); 

CreateYourInterface() zwróci konkretną implementację YourInterface. To pozwala zmienić funkcjonalność aplikacji, zmieniając jedną linię:

YourInterface foo = CreateYourInterface(); 
+0

Zmieniłeś tam linię kodu? Który? Być może mógłbyś wyjaśnić? – DOK

+0

YourInterface foo = CreateYourInterface() jest linią, do której się odwoływałem. Właśnie zwracałem uwagę, że jeśli przydzieliłeś inny obiekt do foo, który również zaimplementował interfejs, uzyskałbyś inną funkcjonalność z tym samym kodem. –

0

Interfejs programowania oparty może być traktowany jako oddzielenie wdrażanie funkcjonalności i jak uzyskać dostęp do funkcjonalności.

zdefiniować interfejs
interface ICallSomeone { public bool DialNumber(string number); }

i napisać implementację

public class callsomeone: ICallSomeone {
public bool DialNumber(string number) {
//dial number, return results }}

użyć interfejsu nie dbając o jego realizacji. Jeśli zmienisz implementację, nic nie obchodzi, ponieważ po prostu używa interfejsu.

0

Z bardzo abstrakcyjnego punktu widzenia programowanie oparte na interfejsach jest zbliżone do komponentów używanych przez hydraulika (złącza i rury).

Dopóki rury i złącza są wytwarzane zgodnie z określonym interfejsem (liczba gwintów i odstępy, itp.), Różne producenci mogą dostarczać połączenia do rur, które zostały potencjalnie wyprodukowane przez innego dostawcę (ale przy zachowaniu wspomniany interfejs złącza/rury).

W ten sposób można uzyskać większą interoperacyjność komponentów i swobodę dla hydraulików, którzy mogą wybierać spośród różnych dostawców, przedziałów cenowych itp. W celu stworzenia funkcjonalnego systemu hydraulicznego.

Wymień rury i złącza na komponenty oprogramowania, a podobieństwa są zadziwiająco proste.