Abstrakcje (typy abstrakcyjne i interfejsy)

Uwaga

Ta zawartość jest drukowana przez uprawnienie Pearson Education, Inc. z Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition. Wydanie to zostało opublikowane w 2008 roku, a książka została w pełni zmieniona w trzecim wydaniu. Niektóre informacje na tej stronie mogą być nieaktualne.

Abstrakcja to typ opisujący kontrakt, ale nie zapewnia pełnej implementacji kontraktu. Abstrakcje są zwykle implementowane jako klasy abstrakcyjne lub interfejsy i są dostarczane z dobrze zdefiniowanym zestawem dokumentacji referencyjnej opisującym wymaganą semantyka typów implementujących kontrakt. Niektóre z najważniejszych abstrakcji w programie .NET Framework obejmują Stream, IEnumerable<T>i Object.

Można rozszerzyć struktury, implementując konkretny typ, który obsługuje kontrakt abstrakcji i używając tego konkretnego typu z interfejsami API platformy korzystającymi (działającymi na) abstrakcji.

Znacząca i przydatna abstrakcja, która jest w stanie wytrzymać test czasu, jest bardzo trudna do zaprojektowania. Główną trudnością jest uzyskanie odpowiedniego zestawu członków, nie więcej i nie mniej. Jeśli abstrakcja ma zbyt wielu członków, staje się trudne, a nawet niemożliwe do zaimplementowania. Jeśli ma zbyt mało elementów członkowskich dla obiecanej funkcjonalności, staje się bezużyteczne w wielu interesujących scenariuszach.

Zbyt wiele abstrakcji w ramach również negatywnie wpływa na użyteczność struktury. Często dość trudno jest zrozumieć abstrakcję bez zrozumienia, jak pasuje do szerszego obrazu konkretnych implementacji i interfejsów API działających na abstrakcji. Ponadto nazwy abstrakcji i ich członków są koniecznie abstrakcyjne, co często sprawia, że są one tajemnicze i niezastosowywalne bez uprzedniego zrozumienia szerszego kontekstu ich użycia.

Jednak abstrakcje zapewniają niezwykle zaawansowaną rozszerzalność, której inne mechanizmy rozszerzalności nie mogą być często zgodne. Są one podstawą wielu wzorców architektury, takich jak wtyczki, inwersja kontroli (IoC), potoki itd. Są one również niezwykle ważne dla testowania struktur. Dobre abstrakcje umożliwiają odcięcie dużych zależności w celu testowania jednostkowego. Podsumowując, abstrakcje są odpowiedzialne za poszukiwane bogactwo nowoczesnych struktur zorientowanych na obiekty.

❌ NIE udostępniaj abstrakcji, chyba że są testowane przez opracowanie kilku konkretnych implementacji i interfejsów API zużywających abstrakcję.

✔️ Podczas projektowania abstrakcji należy starannie wybrać klasę abstrakcyjną i interfejs.

✔️ ROZWAŻ dostarczenie testów referencyjnych dla konkretnych implementacji abstrakcji. Takie testy powinny umożliwić użytkownikom sprawdzenie, czy ich implementacje prawidłowo implementują kontrakt.

© Części 2005, 2009 Microsoft Corporation. Wszelkie prawa zastrzeżone.

Reprinted by permission of Pearson Education, Inc. from Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, published oct 22, 2008 by Addison-Wesley Professional w ramach Microsoft Windows Development Series.

Zobacz też