Inwersja abstrakcji
W programowaniu komputerowym inwersja abstrakcji jest antywzorcem pojawiającym się, gdy użytkownicy konstruktu potrzebują funkcji zaimplementowanych w nim, ale nie ujawnionych przez jego interfejs . Powoduje to, że użytkownicy ponownie implementują wymagane funkcje w zakresie interfejsu, który z kolei wykorzystuje wewnętrzną implementację tych samych funkcji. Może to skutkować implementacją funkcji niższego poziomu w odniesieniu do funkcji wyższego poziomu, stąd termin „odwrócenie abstrakcji”.
Możliwe złe skutki to:
- Użytkownik takiej przebudowanej funkcji może poważnie zaniżyć jej koszty eksploatacji.
- Użytkownik konstruktu jest zmuszony zaciemniać ich realizację skomplikowanymi szczegółami mechanicznymi.
- Wielu użytkowników próbuje rozwiązać ten sam problem, zwiększając ryzyko błędu.
Przykłady
Domniemane przykłady z profesjonalnych kręgów programistycznych obejmują:
- W Adzie wybór konstrukcji rendezvous jako prymitywnej synchronizacji zmusił programistów do implementacji prostszych konstrukcji, takich jak semafory , na bardziej złożonej podstawie.
- W Applesoft BASIC arytmetyka liczb całkowitych została zaimplementowana na arytmetyce zmiennoprzecinkowej i nie było operatorów bitowych ani obsługi blittingu grafiki rastrowej (mimo że język obsługiwał grafikę wektorową na sprzęcie rastrowym Apple II). Spowodowało to, że gry i inne programy napisane w języku BASIC działały wolniej.
- Podobnie jak Applesoft BASIC, Lua ma typ zmiennoprzecinkowy jako jedyny typ numeryczny, gdy jest skonfigurowany dla komputerów stacjonarnych, i nie miał operatorów bitowych przed Lua 5.2.
- Tworzenie obiektu reprezentującego funkcję jest kłopotliwe w językach zorientowanych obiektowo , takich jak Java i C++ (zwłaszcza przed C++11 i Java 8), w których funkcje nie są obiektami pierwszej klasy . W C++ możliwe jest uczynienie obiektu „wywoływalnym” przez przeciążenie
()
, ale nadal często konieczne jest zaimplementowanie nowej klasy, takiej jak Functors w STL . ( C++11 znacznie ułatwia tworzenie obiektu reprezentującego funkcję.) - Tom Lord zasugerował, że system kontroli wersji Subversion płaci za odwrócenie abstrakcji implementacji bazy danych tylko do zapisu w bazie danych do odczytu/zapisu o niskiej wydajności.
- Używanie procedur składowanych do manipulowania danymi w relacyjnej bazie danych, bez przyznania programistom prawa do wdrażania takich procedur, prowadzi do reimplementacji zapytań poza bazą danych. Na przykład pobierane są duże zbiory danych (w skrajnych przypadkach całe tabele), a właściwe filtrowanie odbywa się w kodzie aplikacji. Alternatywnie tysiące wierszy są aktualizowane (wstawiane lub nawet pobierane) jeden po drugim, zamiast uruchamiania zapytania o wiele wierszy.
- WinUI 3 firmy Microsoft systematycznie zastępuje pasek tytułowy tworzonych przez siebie okien niestandardowym paskiem, który ignoruje ustawienia kolorów użytkownika końcowego, zamiast tego zawsze wygląda na szary. Zastosowanie koloru wybranego przez użytkownika końcowego do paska tytułu wymaga użycia dodatkowego kodu dostosowywania w systemie Windows 11 i całkowitego zastąpienia niestandardowego paska tytułu innym niestandardowym paskiem w systemie Windows 10.
Przykłady, które są powszechne poza profesjonalnymi kręgami programistycznymi, obejmują:
- Korzystanie z funkcji wyszukiwania w arkuszu kalkulacyjnym w celu odtworzenia funkcjonalności bazy danych
- Używanie wariantowych typów danych jako liczników pętli w Microsoft Visual Basic, gdzie dostępny jest również typ całkowity.
Zobacz też
Linki zewnętrzne
- Odwrócenie abstrakcji w Portland Pattern Repository - obszerna dyskusja, z której większość dotyczy „inwersji abstrakcji” w sensie „ukrytej złożoności”
Kategoria: