Dziurawa abstrakcja
W tworzeniu oprogramowania nieszczelna abstrakcja to abstrakcja , która ujawnia szczegóły, które ma usunąć.
Ukute przez Joela Spolsky'ego , prawo nieszczelnych abstrakcji stwierdza:
Wszystkie nietrywialne abstrakcje są do pewnego stopnia nieszczelne.
To stwierdzenie podkreśla szczególnie problematyczną przyczynę defektów oprogramowania: poleganie twórcy oprogramowania na nieomylności abstrakcji.
Artykuł Spolsky'ego podaje przykłady abstrakcji, która działa przez większość czasu, ale w której nie można zignorować szczegółów podstawowej złożoności, w ten sposób wyciekając złożoność z abstrakcji z powrotem do oprogramowania, które ją wykorzystuje.
Historia
Termin „nieszczelna abstrakcja” spopularyzował w 2002 roku Joel Spolsky . Wcześniejszy artykuł Kiczalesa opisuje niektóre problemy z niedoskonałymi abstrakcjami i przedstawia potencjalne rozwiązanie problemu poprzez umożliwienie dostosowania samej abstrakcji.
Wpływ na rozwój oprogramowania
Ponieważ systemy stają się coraz bardziej złożone, twórcy oprogramowania muszą polegać na coraz większej liczbie abstrakcji. Każda abstrakcja próbuje ukryć złożoność, pozwalając programistom napisać oprogramowanie, które „obsługuje” wiele odmian nowoczesnych komputerów.
Jednak to prawo stanowi, że twórcy niezawodnego oprogramowania i tak muszą poznać szczegóły leżące u podstaw abstrakcji.
Przykłady
Artykuł Spolsky'ego przytacza wiele przykładów nieszczelnych abstrakcji, które stwarzają problemy przy tworzeniu oprogramowania:
- Stos protokołów TCP/IP jest połączeniem protokołu TCP , który stara się zapewnić niezawodne dostarczanie informacji, działającego na szczycie protokołu IP , który zapewnia jedynie usługę „najlepszych starań”. Kiedy IP gubi pakiet, TCP musi go ponownie przesłać, co zajmuje dodatkowy czas. W ten sposób TCP zapewnia abstrakcję niezawodnego połączenia, ale szczegóły implementacji przeciekają w postaci potencjalnie zmiennej wydajności (przepustowość i opóźnienie zarówno cierpią, gdy dane muszą być retransmitowane), a połączenie może nadal zostać całkowicie przerwane.
- Iteracja po dużej dwuwymiarowej tablicy może mieć radykalnie różną wydajność, jeśli jest wykonywana poziomo, a nie pionowo, w zależności od kolejności, w jakiej elementy są przechowywane w pamięci. Jeden kierunek może znacznie zwiększyć w pamięci podręcznej i błędy strony , które znacznie opóźniają dostęp do pamięci.
- Język SQL abstrahuje kroki proceduralne odpytywania bazy danych , pozwalając po prostu zdefiniować, czego się chce. Ale niektóre zapytania SQL są tysiące razy wolniejsze niż inne logicznie równoważne zapytania. Na jeszcze wyższym poziomie abstrakcji ORM , które izolują kod zorientowany obiektowo od implementacji trwałości obiektów przy użyciu relacyjnej bazy danych, wciąż zmuszają programistę do myślenia w kategoriach baz danych, tabel i natywnych zapytań SQL, gdy tylko wykonanie Zapytania generowane przez ORM stają się problemem.
- Chociaż sieciowe systemy plików, takie jak NFS i SMB , umożliwiają traktowanie plików na komputerach zdalnych tak, jakby były lokalne, połączenie ze zdalnym komputerem może zostać spowolnione lub przerwane, a plik przestaje zachowywać się tak, jakby był lokalny.
- Platforma programowania formularzy internetowych ASP.NET , której nie należy mylić z ASP.NET MVC, streszcza różnicę między kodem HTML obsługującym kliknięcie hiperłącza (<a>) a kodem obsługującym kliknięcie przycisku. Jednak ASP.NET musi ukryć fakt, że w HTML nie ma możliwości przesłania formularza z hiperłącza. Robi to, generując kilka wierszy kodu JavaScript i dołączając onclick do hiperłącza. Jeśli jednak użytkownik końcowy ma wyłączoną obsługę języka JavaScript, aplikacja ASP.NET działa nieprawidłowo. Co więcej, nie można naiwnie myśleć o procedurach obsługi zdarzeń w ASP.NET w taki sam sposób, jak w ramach GUI dla komputerów stacjonarnych, takich jak formularze systemu Windows ; ze względu na asynchroniczny charakter sieci Web przetwarzanie programów obsługi zdarzeń w ASP.NET wymaga wymiany danych z serwerem i ponownego załadowania formularza.
Interfejs Gita to kolejny przykład nieszczelnej abstrakcji, jak wyjaśniono w tym artykule.
Zobacz też
- Inwersja abstrakcji
- Zasada odwrócenia zależności
- Istotna złożoność
- Programowanie modułowe
- Rozdzielenie obaw