Absztrakció megfordítása

A Wikipédiából, a szabad enciklopédiából

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]

  1. 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.
  2. Programming in Lua : 2.3 - Numbers Accessed 2009-10-12.
  3. lua-users c2: Floating Point Accessed 2009-10-12.
  4. lua-users c2: Bitwise Operators Accessed 2013-01-15.
  5. 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"