Haladó C++ Programozás Programtervezési minták – alapok Sonkoly Balázs 2014.11.20.
Programtervezési minták - alapok Áttekintés Programtervezési minták – alapötletek Minták megadása Milyen tervezési problémákat oldanak meg? Minták csoportosítása 2014.11.20. Programtervezési minták - alapok
Programtervezési minták - alapok Hatékonyság ↔ átláthatóság Most: hangsúly a tervezésen „Sokkal könnyebb egy jól működő programot hatékonnyá tenni, mint egy hatékonyt jól működővé.” [Yourdon] Jól tervezett program (pl. minták használata): általában több munka, mint az alkalmi megoldásokkal, de megéri újrahasznosíthatóság rugalmasság 2014.11.20. Programtervezési minták - alapok
Programtervezési minták (1) Cél: jobb újrahasznosíthatóság nagyobb rugalmasság ötletek rögzítése a tervezéshez ne kelljen minden problémára új megoldást kidolgozni Objektumközpontú programozás előnyei rugalmasság modularitás átláthatóság Már bevált, működőképes megoldások újrahasznosítása nem kezdeti ötletek, hanem hosszú évek alatt kidolgozott megoldások többszöri újratervezés, újrakódolás 2014.11.20. Programtervezési minták - alapok
Programtervezési minták (2) NEM egyszerű építőelemek, melyek egy osztályként megvalósíthatók összetett, teljes alkalmazások vagy alrendszerek készítéséhez használható tervezetek HANEM egymással együttműködő objektumok és osztályok leírásai, amelyek testre szabott formában valamilyen általános tervezési problémát oldanak meg egy bizonyos összefüggésben tulajdonképpen „receptek”, „megoldás sablonok” 2014.11.20. Programtervezési minták - alapok
Programtervezési minták - alapok Minták – alapötlet Christopher Alexander – 1977 Épületek és városok mintái „Minden MINTA olyan problémát ír le, ami újra és újra felbukkan a környezetünkben, s aztán leírja hozzá a megoldás magját, oly módon, hogy a megoldás milliószor felhasználható legyen, anélkül, hogy valaha is kétszer ugyanúgy csinálnánk.” 2014.11.20. Programtervezési minták - alapok
Programtervezési minták - alapok Minták megadása Minta neve jó név választása mindig fontos tudunk beszélni róla, hivatkozni rá Probléma leírása mikor alkalmazzuk a mintát a probléma és összefüggései Megoldás terv felépítéséhez szükséges elemek (osztályok, objektumok), viszonyaik, hatáskörük, együttműködési lehetőségeik nem konkrét megvalósítás – sablon, ami különböző helyzetekben alkalmazható Következmények előnyök, hátrányok értékelés – tervezési alternatívák 2014.11.20. Programtervezési minták - alapok
Tervezési problémák (1) Minták: fontos tervezési problémákra adnak megoldást Megfelelő objektumok keresése Szükséges objektumok kiválasztása Objektumfelületek meghatározása alapfogalmak: művelet szignatúrája: név, input (objektum-) paraméterek, visszatérési érték objektum felülete: összes szignatúrája típus: egy bizonyos felület (objektumnak több típusa is lehet!) egyforma felületek futásidőben cserélhetők (polimorfizmus) kulcselemek azonosítása felületen áthaladó adatok mit ne tegyünk a felületbe felületek közötti kapcsolatok 2014.11.20. Programtervezési minták - alapok
Tervezési problémák (2) Objektummegvalósítások meghatározása objektum típusa ↔ osztálya felületöröklés ↔ osztályöröklés felületöröklés: egy objektum mikor használható egy másik helyett osztályöröklés: objektum megvalósítása egy másik objektum megvalósításának segítségével C++ nem tesz különbséget, de tipikusan (tiszta) osztályöröklés: privát öröklés (tiszta) felületöröklés: nyilvános öröklés tisztán elvont osztályoktól 1. alapelv: Programozzunk a felületre a megvalósítás helyett! Az elvont osztályban meghatározott felületet bővítsük (felületöröklés) Változásra tervezve: új igények és változó igények megérzése (benne van a mintákban) 2014.11.20. Programtervezési minták - alapok
Öröklés vagy összetétel (kompozíció)? Öröklés („fehér dobozos”) előnyök statikus (fordításkor) egyértelmű könnyebb az újrahasznosított megvalósítás módosítása (szülőnél) hátrányok örökölt megvalósítás futási időben nem változtatható megszegi az egységbezárást ez a függőség korlátozza az újrahasznosíthatóságot, rugalmasságot javaslat: csak elvont osztályoktól örököljünk Összetétel („fekete dobozos”) előnyök dinamikus (futási időben) figyelmesen tervezett felületek kellenek nem szegjük meg az egységbezárást kompatibilis típusú objektumok cserélhetők kevesebb megvalósítási függőség egyszerűbb osztályhierarchia hátrányok nehezebb érthetőség 2. alapelv: Használjunk objektum-összetételt osztályöröklés helyett, amikor csak lehet! 2014.11.20. Programtervezési minták - alapok
Képviselet (delegáció) Speciális összetétel Örökléshez hasonló kód újrahasznosítási módszer Résztvevők: fogadó objektum és képviselője Példa: Ablak – Téglalap kapcsolat az Ablak egy Téglalap (osztályöröklés) helyett az Ablaknak van egy Téglalap példánya (képviselője), akire bizonyos műveleteket átruház Előnyök viselkedés kialakítása futási időben összetétel módja változtatható Hátrányok nehezebb érthetőség, mint statikusabb programoknál Javaslat: Csak akkor használjuk, ha többet egyszerűsít, mint bonyolít! 2014.11.20. Programtervezési minták - alapok
Öröklés és paraméterezett típusok C++: sablonok Egy típus meghatározása anélkül, hogy minden általa felhasznált típust megadnánk Paraméterek Korábban volt részletesen Ezekkel most nem foglalkozunk 2014.11.20. Programtervezési minták - alapok
Objektummodell – jelölések (ism.) Fontosabb relációk Öröklés (szülő-gyermek kapcsolat) („háromszög”) Komponens (összetétel, aggregáció) reláció („rombusz”) Hivatkozás (ismeretség) („folytonos vonal”) Példányosítás („szaggatott vonal”) Egy összetettebb példa 2014.11.20. Programtervezési minták - alapok
Minták csoportosítása Cél szerint létrehozási szerkezeti viselkedési Hatókör szerint osztály objektum 2014.11.20. Programtervezési minták - alapok