Tervezési minta

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2021. december 19-én felülvizsgált verziótól ; az ellenőrzések 6 szerkesztést igényelnek .

A tervezési minta vagy minta ( angol  tervezési minta ) a szoftverfejlesztésben  egy megismételhető építészeti terv , amely megoldást jelent egy tervezési problémára bizonyos gyakran előforduló kontextusban .

Általában egy sablon nem teljes példa, amely közvetlenül kóddá alakítható ; ez csak egy példa egy problémamegoldásra, amely különféle helyzetekben használható. Az objektumorientált minták az osztályok vagy objektumok közötti kapcsolatokat és interakciókat mutatják meg anélkül, hogy meghatároznák, mely végső osztályokat vagy alkalmazásobjektumokat használják fel.

Az "alacsony szintű" mintákat, amelyek figyelembe veszik egy adott programozási nyelv sajátosságait, idiómáknak nevezzük . Ezek jó tervezési döntések, amelyek egy adott nyelvre vagy szoftverplatformra jellemzőek, ezért nem univerzálisak.

A legmagasabb szinten olyan építészeti minták vannak , amelyek lefedik a teljes szoftverrendszer architektúráját .

Az algoritmusok eleve szintén minták, de nem tervezési minták, hanem számítások , mivel számítási problémákat oldanak meg.

Történelem

Az 1970 - es években Christopher Alexander építész tervmintákat állított össze. Az építészet területén ez az elképzelés nem fejlődött ki annyira, mint később a szoftverfejlesztés területén.

1987 -ben Kent Beck és Ward Cunningham átvették Alexander ötleteit, és sablonokat fejlesztettek ki a smalltalk grafikus felhasználói felületet fejlesztő szoftverekhez .

1988- ban Erich Gamma doktori disszertációját kezdte írni a Zürichi Egyetemen ennek a technikának a szoftverfejlesztésben való általános hordozhatóságáról.

1989 és 1991 között James Coplien a C++ programozási kifejezések fejlesztésén dolgozott, és 1991-ben kiadta az Advanced C++ Idioms című kiadványt.

Ugyanebben az évben Erich Gamma befejezi doktori disszertációját, és az USA -ba költözik , ahol Richard Helmmel (Richard Helm), Ralph Johnsonnal (Ralph Johnson) és John Vlissidesszel (John Vlissides) együttműködve kiadja a Design Patterns - könyvet. Az újrafelhasználható objektum-orientált szoftver elemei . Ez a könyv 23 tervezési mintát ír le. Ezen kívül a könyv szerzőinek csapatát "Gang of Four" néven ismeri a nyilvánosság ( eng.  Gang of Four , gyakran rövidítve GoF -re ). Ez a könyv okozta a tervezési minták népszerűségének növekedését.

Előnyök

A teljesen független tervezéshez képest a sablonok számos előnnyel rendelkeznek. A sablonok használatának fő előnye, hogy kész absztrakciókkal csökkenti a fejlesztés bonyolultságát, hogy megoldja a problémák egész osztályát. A sablon adja a megoldás nevét, ami megkönnyíti a fejlesztők közötti kommunikációt azáltal, hogy lehetővé teszi a jól ismert sablonokra való hivatkozásokat. Így a sablonok miatt egységesülnek a megoldások részletei: modulok, projektelemek, és csökken a hibák száma. A sablonok alkalmazása elvileg hasonló a kész kódkönyvtárak használatához. A jól megfogalmazott tervezési minta lehetővé teszi, hogy a jó megoldás megtalálása után újra és újra felhasználható legyen. Egy sablonkészlet segíti a fejlesztőt a lehetséges, legmegfelelőbb tervezési lehetőség kiválasztásában. [egy]

Hátrányok

Míg a kód egyszerű módosítása, hogy illeszkedjen egy ismert mintához, könnyebben érthetővé teheti a kódot, Steve McConnell szerint két probléma van a minták használatával. Először is, egy kiválasztott minta vak követése a program bonyolultságához vezethet. Másodszor, a fejlesztők kísértést érezhetnek, hogy minden különösebb ok nélkül kipróbáljanak egy bizonyos mintát (lásd Golden Hammer ). [2]

Az objektum-orientált tervezésben számos tervezési minta a funkcionális nyelvek elemeinek idiomatikus reprodukciójaként fogható fel [3] . Peter Norvig azt állítja, hogy a Gangs of Four -ban leírt 23 minta közül 16 sokkal könnyebben megvalósítható dinamikusan tipizált nyelveken, mint C++- ban, vagy láthatatlan [4] . Paul Graham a tervezési minták gondolatát antimintának tekinti , annak jelzésére, hogy a rendszer nem rendelkezik kellő absztrakciós szinttel , és gondosan át kell dolgozni [5] . Könnyen belátható, hogy a sablon definíciója „ kész megoldás, de nem közvetlen könyvtárhívás ” lényegében az újrafelhasználás elutasítását jelenti a duplikáció javára . Ez nyilvánvalóan elkerülhetetlen lehet összetett rendszerek esetén, ha olyan nyelveket használnak, amelyek nem támogatják a kombinátorokat és a típuspolimorfizmust , és elvileg kizárható azokban a nyelvekben, amelyek rendelkeznek homoikonitás tulajdonsággal (bár nem feltétlenül hatékonyan), mivel bármilyen minta végrehajtható kódban kell megvalósítani [6] .

Tervezési minták típusai

Alap

Név eredeti név Leírás Leírása: Tervezési minták
Alapsablonok (alapvető)
Delegációs minta delegálási minta Egy objektum kívülről fejez ki valamilyen viselkedést, de valójában egy társított objektumra ruházza át e viselkedés végrehajtásának felelősségét. n/a
funkcionális tervezősablon funkcionális kialakítás Gondoskodik arról, hogy egy számítógépes program minden egyes moduljának csak egy felelőssége legyen, és azt minimális mellékhatással hajtja végre a program más részein. n/a
Változatlan interfész Változatlan interfész Megváltozhatatlan objektum létrehozása . n/a
Felület Felület Általános módszer a számítógépes programok könnyebb érthetőségű strukturálására. n/a
Interfész jelölő Marker felület Attribútumként (egy entitás jelöléseként) a marker interfész implementációjának megléte vagy hiánya kerül felhasználásra. A modern programozási nyelvek ehelyett attribútumokat vagy megjegyzéseket használhatnak. n/a
Property Container ingatlan konténer Lehetővé teszi további tulajdonságok hozzáadását az osztályhoz a tárolóhoz (az osztályon belül), ahelyett, hogy az osztályt új tulajdonságokkal bővítené. n/a
Esemény csatorna esemény csatorna Kibővíti a Közzététel/Feliratkozás mintát , hogy központi csatornát hozzon létre az események számára. Meghatalmazottat használ az előfizetéshez és egy proxyt az esemény közzétételéhez a csatornán. A képviselő a tényleges kiadótól vagy előfizetőtől külön létezik. Egy előfizető egynél több entitástól kaphat közzétett eseményeket, még akkor is, ha csak egy csatornára van regisztrálva. n/a
A kreatív minták  olyan tervezési minták, amelyek elvonatkoztatják a példányosítás folyamatát. Lehetővé teszik a rendszer függetlenítését az objektumok létrehozásának, összeállításának és bemutatásának módszerétől. Az osztályokat létrehozó sablon az öröklést használja a példányosított osztály módosításához, míg az objektumokat generáló sablon a példányosítást egy másik objektumra delegálja.
Absztrakt gyár absztrakt gyár Osztály, amely interfészt jelent a rendszerkomponensek létrehozásához. Igen
Építész Építész Osztály, amely egy komplex objektum létrehozására szolgáló interfészt jelent. Igen
gyári módszer gyári módszer Interfészt határoz meg egy objektum létrehozásához, de az alosztályokra bízza, hogy eldöntsék, melyik osztályt példányosítsák. Igen
Lusta inicializálás Lusta inicializálás Olyan objektum, amely az első hozzáféréskor inicializálódik. Nem
Többhangú Többhangú Győződjön meg arról, hogy az osztály elnevezett objektumpéldányokat, és globális hozzáférési pontot biztosít számukra. Nem
Tárgykészlet objektumkészlet Osztály, amely interfészt jelent az inicializált és használatra kész objektumok halmazával való munkavégzéshez. Nem
Prototípus prototípus Meghatároz egy felületet egy objektum létrehozásához egy másik objektum klónozásával, ahelyett, hogy egy konstruktoron keresztül hozná létre. Igen
Az erőforrás-beszerzés inicializálás Az erőforrás-beszerzés inicializálás (RAII) Az erőforrások megszerzése inicializálással, a felszabadítás pedig az objektum megsemmisítésével párosul. Nem
magányos Szingli Egy osztály, amelynek csak egy példánya lehet. Igen
A strukturális sablonok (Structural) különféle összetett struktúrákat határoznak meg, amelyek megváltoztatják a meglévő objektumok felületét vagy annak megvalósítását, megkönnyítve a program fejlesztését és optimalizálását.
Adapter Adapter/csomagoló Olyan objektum, amely lehetővé teszi két másik objektum interakcióját, amelyek közül az egyik használja, a másik pedig olyan interfészt biztosít, amely nem kompatibilis az elsővel. Igen
Híd Híd Olyan struktúra, amely lehetővé teszi a hívási felület és az osztálymegvalósítási felület egymástól függetlenül történő megváltoztatását. Igen
linker Összetett Olyan objektum, amely magához hasonló tárgyakat egyesít. Igen
Dekorátor vagy csomagoló lakberendező Osztály, amely kiterjeszti egy másik osztály funkcionalitását öröklés nélkül. Igen
Homlokzat homlokzat Egy objektum, amely absztrahál több osztályt egyetlen entitásba egyesítve. Igen
Egyetlen belépési pont elülső vezérlő Egységes interfészt biztosít egy alrendszer interfészei számára. A Front Controller magas szintű interfészt határoz meg, amely leegyszerűsíti az alrendszer használatát. Nem
opportunista Légysúly Ez egy olyan objektum, amely egyedi példányként jelenik meg a program különböző helyein, de valójában nem az. Igen
Helyettes meghatalmazott Olyan objektum, amely közvetít két másik objektum között, és amely megvalósítja/korlátozza a hozzáférést a rajta keresztül elért objektumhoz. Igen
Viselkedési minták határozzák meg az objektumok közötti interakciót, így növelve annak rugalmasságát.
Felelősségi lánc Felelősségi lánc Úgy tervezték, hogy megszervezze a felelősségi szinteket a rendszerben. Igen
Parancs , művelet, tranzakció parancs Egy cselekvést képvisel. A parancsobjektum magát a műveletet és annak paramétereit tartalmazza. Igen
Tolmács tolmács Megold egy gyakori, de változékony problémát. Igen
Iterátor , kurzor Iterátor Olyan objektumot jelöl, amely lehetővé teszi, hogy szekvenciálisan hozzáférjen az összesített objektum elemeihez anélkül, hogy az összesítés részét képező objektumok leírását használná. Igen
Közvetítő közvetítő Sok objektum interakcióját biztosítja, miközben laza csatolást hoz létre, és kiküszöböli annak szükségességét, hogy az objektumok kifejezetten utaljanak egymásra. Igen
Az őrző Emlékeztető Lehetővé teszi egy objektum belső állapotainak rögzítését és mentését a tokozás megsértése nélkül , hogy később vissza lehessen állítani ezekben az állapotokban. Igen
Null Object Null Object Egy "alapértelmezett" objektum megadásával megakadályozza a nulla mutatókat. Nem
Megfigyelő vagy kiadó-előfizető Megfigyelő Egy a többhez függőséget határoz meg az objektumok között, így amikor egy objektum állapota megváltozik, minden tőle függő függő értesítést kap az eseményről. Igen
szolga Szolgáló Arra használják, hogy közös funkciókat biztosítsanak egy osztálycsoport számára. Nem
Leírás Leírás Az üzleti logika megkötésére szolgál. Nem
Állapot Állapot Olyan esetekben használják, amikor a program végrehajtása során az objektumnak állapotától függően meg kell változtatnia viselkedését. Igen
Stratégia Stratégia Célja, hogy meghatározza az algoritmusok családját, mindegyiket beágyazza, és biztosítsa felcserélhetőségüket. Igen
sablon módszer sablon módszer Meghatározza az algoritmus alapját, és lehetővé teszi a leszármazottak számára az algoritmus egyes lépéseinek újradefiniálását anélkül, hogy a szerkezet egészét megváltoztatná. Igen
Látogató Látogató Leír egy műveletet, amelyet más osztályok objektumain hajtanak végre. Amikor a Visitor osztály megváltozik, nincs szükség a kiszolgált osztályok módosítására. Igen
Egyszerű politika egyszerű politika Nem
eseményhallgató eseményhallgató Nem
Egyszeri látogató Egyszeri látogató Optimalizálja a látogatói minta megvalósítását, amelyet inicializálnak, egyszer felhasználnak, majd megsemmisítenek. Nem
Hierarchikus látogató Hierarchikus látogató Lehetővé teszi egy hierarchikus adatstruktúra (pl. fa) összes csúcsának bejárását. Nem

Egyidejűség  – Egyidejűség

Privát

Párhuzamos programozási minták ( Egyidejűség )

Többszálú programok hatékonyabb írásához , és kész megoldások biztosításához a szinkronizálási problémákra .

Név eredeti név Leírás
Aktív objektum aktív objektum Arra szolgál, hogy a metódus végrehajtási szálát elválasztja attól a száltól, amelyben meghívták. Az aszinkron metódushívási és ütemezőmintákat használja.
Balking Balking Csak akkor használható művelet végrehajtására egy objektumon, ha az megfelelő állapotban van.
Kötési tulajdonságok Több megfigyelőt kombinál, hogy a tulajdonságokat szinkronban tartsa a különböző objektumok között [7] .
Üzenetküldés Üzenetküldési minta, Üzenetkezelési minta (MDP) Lehetővé teszi az összetevők és alkalmazások számára az információcserét (üzeneteket).
Kétszeres ellenőrzés blokkolás Duplán ellenőrzött zár Úgy tervezték, hogy csökkentse a zár megszerzésével járó többletköltséget.
Eseményalapú Esemény alapú aszinkron Az aszinkron mintával kapcsolatos problémák megoldása, amelyek többszálú programokban jelentkeznek [8] .
Őrzött felfüggesztés Védett felfüggesztés Csak akkor blokkolja a művelet végrehajtását egy objektumon, ha az megfelelő állapotban van.
Félszinkron/Fél aszinkron
Vezetők/követők
blokkolása zár Az egyik szál zárolja az erőforrást, hogy megakadályozza, hogy más szálak hozzáférjenek vagy módosítsák [9] .
Monitor Monitor Egynél több szál által biztonságosan használható objektum.
reaktor_ Reaktor Úgy tervezték, hogy egy vagy több forrásból szinkron módon továbbítsa a kéréseket a szolgáltatásnak.
Olvasási/írási Olvasási/írási zár Lehetővé teszi, hogy egyszerre több szál is olvasson információkat a megosztott tárhelyről, de egyszerre csak egy szál módosíthatja azokat.
Ütemező Ütemező Mechanizmust biztosít egy ütemezési házirend megvalósításához anélkül, hogy bármilyen konkrét irányelvtől függne.
szálkészlet Szálkészletet biztosít a feladatok feldolgozásához, általában várólistaként ábrázolva.
Szálspecifikus tárhely Különböző globális változók biztosítására szolgál a különböző szálakhoz.
Egyszálú végrehajtás egyszálas végrehajtás Megakadályozza egy metódus egyidejű meghívását, ezáltal megakadályozza a metódus egyidejű végrehajtását.
Kooperatív minta kooperatív minta Mechanizmust biztosít a végrehajtási szálak biztonságos leállításához egy közös jelző használatával a szál befejezésének jelzésére.
Objektumgenerálási sablonok Rugalmas objektumprogramozási minták Feladatvégrehajtási minták System Architecture Patterns Vállalati
  • Az Active Record  egy módja a relációs adatbázis-adatok elérésének objektumorientált programozásban.
  • üzleti delegált .
  • Összetett entitás .
  • Összetett nézet .
  • DAO (adatelérési objektum) adatelérési objektum.
  • DispatcherView .
  • elülső vezérlő .
  • Elfogó szűrő .
  • Registry .
  • Szolgáltatásaktivátor .
  • Szolgáltatáskereső .
  • Szolgáltatás a munkásnak .
  • Session Homlokzat .
  • Transfer Object Assembler .
  • Objektum átvitele
  • Értéklista-kezelő .
  • Nézze meg a Segítőt .
  • Munkaegység .
Stream-feldolgozás tervezési minták
  • Az események egyéni kezelése
  • Kezelés helyi állam felhasználásával
  • Többlépcsős feldolgozás/újraparticionálás
  • Feldolgozás külső könyvtár használatával: adatfolyam csatlakoztatása táblához
  • Adatfolyamok összekapcsolása
  • Rendkívüli események
  • Újrafeldolgozás
Elosztott rendszerek tervezési mintái Adatbázis sablonok
  • adatleképező
  • Személyazonossági térkép
  • Munkaegység
  • Lusta terhelés
Egyéb
  • Repository / Repository .

Más típusú minták

Ma még számos más sablon is létezik.

  • A Carrier Rider Mapper leírja a tárolt információkhoz való hozzáférés biztosítását.
  • Az elemző sablonok leírják a szoftverkövetelmények megírásának (követelményelemzés) alapvető megközelítését a tényleges szoftverfejlesztési folyamat megkezdése előtt.
  • A kommunikációs minták egy szervezet egyes tagjai/alkalmazottai közötti kommunikáció folyamatát írják le.
  • A szervezeti minták egy vállalat/cég szervezeti hierarchiáját írják le
  • Az Anti -Design-Patterns leírja, hogy mit ne tegyünk a programok fejlesztése során, bemutatva a tipikus tervezési és megvalósítási hibákat.

Lásd még

Jegyzetek

  1. McConnell, 2005 , p. 100-101.
  2. McConnell, 2005 , p. 101.
  3. Tervezési minták a Haskellben
  4. Peter Norvig - Tervezési minták dinamikus nyelveken (diák)
  5. A nerdek bosszúja . — „Az OO világban sokat hallani a „mintázatokról”. Kíváncsi vagyok, vajon ezek a minták nem bizonyítják-e néha a (c) esetet, az emberi fordító működését. Ha mintákat látok a programjaimban, azt a baj jelének tartom. A program alakjának csak azt a problémát kell tükröznie, amelyet meg kell oldania. Bármilyen más szabályszerűség a kódban, legalábbis számomra annak a jele, hogy nem elég erős absztrakciókat használok – gyakran azt, hogy kézzel generálok egy-egy megírandó makró kiterjesztését."
  6. Abelson, Sussman. Számítógépes programok felépítése és értelmezése (SICP). . idézetek: „ Eljárás- és adatabsztrakciók építhetők fel, magasabb rendű függvények használhatók a gyakori használati minták rögzítésére, … és a beépített nyelvek könnyen implementálhatók. "(16. o.); „ Az egyik dolog, amit elvárhatunk egy erőteljes programozási nyelvtől, az a képesség, hogy általános sémák elnevezésével absztrakciókat hozzunk létre, majd közvetlenül ezeken az absztrakciókon dolgozzunk. … Gyakran ugyanazt a programsémát használják különböző eljárásokkal. Ahhoz, hogy ezeket a sémákat fogalmakként fejezzük ki, olyan eljárásokat kell felépíteni, amelyek más eljárásokat argumentumként vesznek fel, vagy értékként adják vissza azokat. "(70. o.); A sablonsémák eljárásként való meghatározása az absztrakció eszközeként szolgál. "(263. o.); 4.1.5 "Adatok mint programok" fejezet (357-360.o.); az " absztrakciós eszközök " fogalmát és szerepüket a 25. o.
  7. Kötési tulajdonságok
  8. Christian Nagel, Bill Evjen, Jay Glynn, Karli Watson és Morgan Skinner. Eseményalapú aszinkron minta // Professional C# 2008  (új.) . - Wiley, 2008. - S.  570 -571. — ISBN 9780470191378 .
  9. Zárminta
  10. Interjú és könyvrészlet: Dan Haywood tartományvezérelt terve meztelen tárgyakkal

Irodalom

  • Zandstra M. PHP. Objektumok, minták és programozási technikák. - 5. kiadás - Szentpétervár. : " Dialektika ", 2019. - S. 736. - ISBN 978-5-907144-54-5 .
  • Fowler, Martin. JavaScript kód átalakítása: a meglévő kód tervezésének javítása. - 2. kiadás - Szentpétervár. : " Dialektika ", 2019. - P. 464. - ISBN 978-5-907144-59-0 .
  • Gamma E., Helm R., Johnson R., Vlissides J. Techniques for object-oriented design. Tervezési minták = PHP objektumok, minták és gyakorlat, harmadik kiadás. — 3. kiadás. - M . : " Williams ", 2015. - S. 368. - ISBN 978-5-496-00389-6 .
  • Jason McColm Smith. Elemental Design Patterns = Elemental Design Patterns. - M . : " Williams ", 2012. - 304 p. — ISBN 978-5-8459-1818-5 .
  • Fowler, Martin, Beck, Kent, Brant, John, Opdike, William, Roberts, Don. Refaktorálás: a meglévő kód kialakításának javítása. - M . : " Dialektika ", 2019. - 448 p. - ISBN 978-5-9909445-1-0 .
  • Martin Fowler. Vállalati alkalmazásarchitektúra mintái (Addison-Wesley Signature Series). - M . : " Williams ", 2012. - 544 p. - ISBN 978-5-8459-1611-2 .
  • Mark Grand. Tervezési minták JAVA nyelven. UML-lel illusztrált újrafelhasználható tervezési minták katalógusa = Patterns in Java, 1. kötet. UML-lel illusztrált újrafelhasználható tervezési minták katalógusa. - M . : " Új tudás ", 2004. - S. 560. - ISBN 5-94735-047-5 .
  • Craig Larman. UML 2.0 és tervezési minták alkalmazása = UML és minták alkalmazása: Bevezetés az objektum-orientált elemzésbe, tervezésbe és iteratív fejlesztésbe. - M . : " Williams ", 2006. - S. 736. - ISBN 0-13-148906-2 .
  • Steve McConnell. Tökéletes kód = A kód kész. - Szentpétervár. : Péter, 2005. - S. 896. - (Mesterkurzus). - ISBN 5-7502-0064-7 , 5-469-00822-3.
  • Nia Narhid, Gwen Shapira, Todd Palino. Apache Kafka. Streamfeldolgozás és adatelemzés. Péter, 2019. - 320. o. - (O'Reilly Bestsellers) - ISBN 978-5-4461-0575-5 .

Linkek