interfejs oprogramowania może odnosić się do szerokiej gamy różnych typów interfejsów na różnych „poziomach”: system Operacyjny może łączyć się z częściami sprzętu. Aplikacje lub programy uruchomione w systemie operacyjnym mogą wymagać interakcji za pomocą strumieni danych, filtrów i potoków; a w programach obiektowych obiekty w aplikacji mogą wymagać interakcji za pomocą metod.
w praktyceedit
kluczową zasadą projektowania jest domyślnie zabranianie dostępu do wszystkich zasobów, umożliwiając dostęp tylko przez dobrze zdefiniowane punkty wejścia, czyli interfejsy. Interfejsy programowe zapewniają dostęp do zasobów komputera (takich jak pamięć, procesor, pamięć masowa itp.) bazowego systemu komputerowego; bezpośredni dostęp (tj. nie przez dobrze zaprojektowane interfejsy) do takich zasobów przez oprogramowanie może mieć poważne konsekwencje-czasami katastrofalne—dla funkcjonalności i stabilności.
Interfejsy pomiędzy komponentami oprogramowania mogą dostarczać Stałe, typy danych, typy procedur, specyfikacje wyjątków i sygnatury metod. Czasami zmienne publiczne są również definiowane jako część interfejsu.
interfejs modułu programowego a jest celowo definiowany oddzielnie od implementacji tego modułu. Ten ostatni zawiera rzeczywisty kod procedur i metod opisanych w interfejsie, a także inne „prywatne” zmienne, procedury itp. Inny moduł oprogramowania B, na przykład klient do a, który wchodzi w interakcję z A, jest zmuszony zrobić to tylko za pośrednictwem opublikowanego interfejsu. Praktyczną zaletą takiego rozwiązania jest to, że zastąpienie implementacji a inną implementacją tego samego interfejsu nie powinno powodować niepowodzenia B—to, w jaki sposób a wewnętrznie spełnia wymagania interfejsu, nie ma znaczenia dla B, który dotyczy tylko specyfikacji interfejsu. (Patrz też zasada podstawienia Liskowa.)
w językach obiektowychedytuj
w niektórych językach obiektowych, zwłaszcza tych bez pełnego dziedziczenia wielokrotnego, termin interfejs jest używany do definiowania abstrakcyjnego typu, który nie zawiera danych, ale definiuje zachowania jako sygnatury metod. Mówi się, że Klasa posiadająca kod i dane dla wszystkich metod odpowiadających temu interfejsowi i deklarująca to, implementuje ten interfejs. Co więcej, nawet w językach o pojedynczym dziedziczeniu można zaimplementować wiele interfejsów, a zatem mogą być różnych typów jednocześnie.
interfejs jest więc definicją typu; gdziekolwiek obiekt może być wymieniany (na przykład w wywołaniu funkcji lub metody) typ obiektu, który ma być wymieniany, może być zdefiniowany w kategoriach jednego z jego zaimplementowanych interfejsów lub klas bazowych, zamiast określać konkretną klasę. Takie podejście oznacza, że można użyć dowolnej klasy, która implementuje ten interfejs. Na przykład, można zastosować implementację pozorowaną, aby umożliwić postęp prac rozwojowych, zanim ostateczna implementacja będzie dostępna. W innym przypadku podczas testowania można zastąpić fałszywą lub pozorowaną implementację. Takie implementacje stub są zastępowane przez prawdziwy kod później w procesie rozwoju.
Zwykle metoda zdefiniowana w interfejsie nie zawiera kodu, a zatem nie może być wywołana; musi być zaimplementowana przez kod nieabstraktowy, aby zostać uruchomiona podczas wywoływania. Interfejs o nazwie ” Stack
„może zdefiniować dwie metody: push()
I pop()
. Można go zaimplementować na różne sposoby, na przykład FastStack
I GenericStack
—pierwszy jest szybki, pracuje ze strukturą danych o stałym rozmiarze, a drugi wykorzystuje strukturę danych, która może być zmieniana, ale kosztem nieco niższej prędkości.
chociaż interfejsy mogą zawierać wiele metod, mogą one zawierać tylko jedną lub nawet wcale nie. Na przykład język Java definiuje interfejs Readable
, który ma pojedynczą metodęread()
; różne implementacje są wykorzystywane do różnych celów, w tym BufferedReader
FileReader
InputStreamReader
PipedReader
I StringReader
div>. Interfejsy znaczników, takie jak Serializable
nie zawierają żadnych metod i służą do dostarczania informacji w czasie pracy do ogólnego przetwarzania za pomocą Reflection.
Programowanie do interfejsuedytuj
zastosowanie interfejsów pozwala na styl programowania zwany programowaniem do interfejsu. Ideą tego podejścia jest oparcie logiki programowania na interfejsach używanych obiektów, a nie na wewnętrznych szczegółach implementacji. Programowanie w interfejsie zmniejsza zależność od specyfiki implementacji i sprawia, że kod jest łatwiejszy do ponownego użycia.
spychając ten pomysł do skrajności, inwersja sterowania pozostawia kontekst do wstrzykiwania kodu z konkretnymi implementacjami interfejsu, które będą używane do wykonywania pracy.