Absztrakció megfordítása
Megjelenés
A számítógép-programozásban az absztrakció megfordítása egy antiminta, amit az jellemez, hogy a kliensnek szüksége lenne az objektum bizonyos függvényeire, de nem fér hozzájuk. Emiatt a kliensnek újra meg kell valósítania ezeket a függvényeket. Az antimintát azért is nevezik absztrakció megfordításának, mivel az újramegvalósított függvények magasabb függvények közé kerülnek.
Lehetséges következmények:
- Mivel többször kell megcsinálni ugyanazt, megnő a hiba esélye.
- Az újramegvalósított függvény felhasználója alulbecsülheti a futási időt.
- Az újabb megvalósítás elrejtése további technikai megoldásokat igényel.
Megelőzése
[szerkesztés]Alacsony szinten:
- Ha a rendszer formálisan ekvivalens funkciókat biztosít, akkor elővigyázatosan válassz közülük!
- Ne kényszeríts szükségtelenül gyenge szerkezeteket a felhasználókra!
Magas szinten:
- Legyél elővigyázatos, amikor infrastruktúrát kell választani!
Példák
[szerkesztés]- Táblázatkezelő függvények használatával egy adatbázis-kezelő funkcionalitásának megvalósítása
- Microsoft Visual Basicben változó típusú ciklusszámlálók használta, amikor egészeket is lehetne.
Professzionális környezetben:
- Az Adában szinkronizációs primitívként randevúkat vezetett be, így a programozók arra kényszerültek, hogy egyszerűbb primitíveket, mint például szemaforok bonyolultabb alapokon valósítsanak meg.[1]
- Az Applesoft BASICben az integer aritmetikát a lebegőpontos aritmetika alapján valósították meg, nem voltak bitenkénti operátorok és nem volt blittelés raszteres képek számára, annak ellenére, hogy a vektorgrafikát az Apple II raszteres hardverének felhasználásával támogatta. Emiatt a BASIC programok lassabbak voltak.
- Az Applesoft BASIChez hasonlóan a Lua teljes aritmetikája lebegőpontos, egész típus nincs,[2] ha asztali gépre van konfigurálva;[3] a Lua 5.2 előtt nem voltak bitenkénti műveletek.[4]
- Objektumorientált nyelvekben, mint Java vagy C++, a Java 8 és a C++11 előtt nehézkes volt a függvények objektumként való kezelése. Ekkor két megoldás volt: egy objektum hívhatóvá tevése a () operátor túlterhelésével, vagy egy új osztály megvalósítása, például az STL funktoraival. C++11-ben a lambda függvények megkönnyítik ezt.
- Tom Lord szerint a Subversion verziókezelő rendszer megfizeti az absztrakció megfordításának árát, mivel írható-olvasható adatbázissal valósít meg csak írható adatbázist.[5]
- Relációs adatbázisban tárolt eljárások használata adatmanipulációra anélkül, hogy garantálnák ezeknek a deployolását ahhoz vezet, hogy a lekérdezéseket adatbázison kívül valósítják meg. Például nagy adatbázisokat, akár egész táblákat kérdeznek le, majd az alkalmazói kód végzi el a szűrést. Egy másik példa, hogy ezernyi sort frissítenek egyesével, ahelyett, hogy egy kéréssel végeznék el.
Jegyzetek
[szerkesztés]- ↑ Critique of DIN Kernel Lisp Definition Version 1.2, footnote 2 Archiválva 2018. május 6-i dátummal a Wayback Machine-ben - says (without references) that the term derives from critiques of the Ada rendezvous, appears to be one of the earliest uses.
- ↑ Programming in Lua : 2.3 - Numbers Accessed 2009-10-12.
- ↑ lua-users c2: Floating Point Accessed 2009-10-12.
- ↑ lua-users c2: Bitwise Operators Accessed 2013-01-15.
- ↑ sourcefrog : Tom Lord on Subversion
Külső link
[szerkesztés]- Abstraction Inversion at Portland Pattern Repository - extensive discussion, much of it taking "abstraction inversion" in the sense of "concealed complexity"