7. kurzus Az objektum-orientált tervezés alapelemei IRT Illyés László 7. kurzus Az objektum-orientált tervezés alapelemei
Az objektum fogalma A programozói gyakorlat a következő cél megfogalmazásához vezetett: egy objektumra vonatkozó minden információ a program egyetlen helyén jelenjen meg. Adatszerkezet és algoritmus egy helyen Ez az információ a program többi részében, sőt más programokban is könnyen újrahasználható legyen Szisztematikus programfejlesztés során tudatosult, hogy az információ-feldolgozási probléma megközelíthető az adatok és az algoritmusok oldaláról
Az objektumorientált paradigma Paradigmának nevezzük egy világszemlélet, látás és gondolkodásmódot, amelyet az adott fogalomkörben használt elméletek, modellek és módszerek összessége jellemez. Az objektumorientáltság egy paradigma, amelynek alapján több rendszerfejlesztési módszertant is kidolgoztak. Ezek a módszertanok a modellezéstől az implementációig sőt a karbantartásig átfogják a teljes fejlesztési folyamatot. Az a rendszer, amelynek fejlesztésére, leírására a módszertanok használhatók, értelmezhető a szoftver rendszernél lényegesen tágabban is, jelenthet egy integrált hardver-szoftver együttest vagy egy szervezetet is.
Az objektumorientált módszertan Az objektumorientált módszertan alkalmazásával a kifejlesztendő rendszert együttműködő objektumokkal modellezzük, a tervezés és az implementáció során pedig ezen objektumokat "szimuláló" programegységeket alakítunk ki. A minket körülvevő világ olyan objektumokkal írható le, mint házak, városok, emberek, járművek stb. Ugyanezen világ jellemezhető olyan objektumokkal is mint napközi, iskola, egyetem, diák, tanár. A modell objektumait az határozza meg, hogy a rendszer milyen vonatkozásait akarjuk megjeleníteni, az objektum modell a valóság mely szeletét reprezentálja. Az objektumok valamilyen absztrakciót tükröznek.
Az objektum − Az objektum egy valós vagy absztrakt, azonosítható, egyedi entitás, amely a vizsgált környezet egy jól definiált szereplője. − Egy objektum más objektumokra hatást gyakorol és más objektumok hatással vannak rá. − Objektumként definiálható bármi, aminek pontos határai meghúzhatók. − Az objektum jellemezhető a rajta értelmezett műveletekkel és a rajta elvégzett műveletek hatását rögzítő állapottal.
Az objektum definíciója Az objektum egy rendszer egyedileg azonosítható szereplője, amelyet a külvilág felé mutatott viselkedésével, belső struktúrájával és állapotával jellemezhetünk. Egységbe zárás (encapsulation) azt jelenti, hogy egy objektum egységbe zárja az állapotát tartalmazó adatstruktúrát, a rajtuk végrehajtott műveleteket. Az objektum tervezőjének a feladata a struktúra, viselkedés és állapotok programozása. A külvilág (külső program) az objektum szolgáltatásait veszi igénybe.
Az objektum felelőssége Minden objektum felelős önmagáért Az objektumhoz felelősség rendelhető, amelynek vállalása és teljesítése az objektum feladata
Az objektum viselkedése Az általa végrehajtott tevékenységsorozatban nyilvánul meg. aktív passzív Aktív: folyamatosan működik, valamilyen tevékenységet hajt végre, más objektumokra hatást gyakorol. (főprogram, vezérlő-objektum) Passzív: addíg nem tesz semmit, amíg valamilyen külső hatás nem éri (esemény, üzenet) (pl. daemon)
Üzenetek Az objektumok egymásra hatása az üzeneteken keresztül valósul meg. Az üzenetek továbbításához “infrastruktúra” szükségeltetik Az üzenet szerepe: vezérlési szerep adatcsere az objektumok között az üzenet komponensei: név paraméter
Üzenetek küldése Egy adott nevű üzenet többször is elküldhető más-más vagy ugyanazon paraméterekkel Egy objektum több, különböző nevű üzenet fogadására képes. Ezek sorrendje is fontos lehet az objektum számára Azonos nevű, különböző paraméterekkel kapott üzenet az objektum azonos reakcióit idézik elő, amelyik folytatása függhet a paraméter értelmezésétől A paraméter más objektum is lehet.
Üzenetek-komolyabban Aki kapja tudja-e (kell-e tudnia), hogy az üzenetet kitől kapta, képes-e szelektíven fogadni Konkurens objektumok problémái: Indulhat-e a rendszer eleve több aktív objektummal? Létezhetnek-e aszinkron műveletek Objektumon belüli konkurencia lehetséges-e? (az objektum még nem dolgozta fel az előző üzenetet, amikor újabb üzenetet kap, amelyik esetleg teljesen más viselkedésre ösztönzik)
Események (event) Egyes módszertanok az üzenet helyett az esemény fogalmát vezetik be az objektumok közötti kölcsönhatás modellezésénél. Az esemény egy azonosítható, pillanatszerű történés Az eseményekhez statikus (név) és dinamikus (paraméter) információk tartozhatnak Az eseményeket az objektumok hozzák létre (objektum lehet a felhasználó is, mint aktor) Felmerülő kérdések: van-e címzettje az eseménynek eldöntheti-e az objektum, hogy melyik eseményre reagáljon egy eseményre egyetlen objektum reagál-e vagy több
Üzenet és esemény Az együttes használat sokszor egyértelmű Ha egy objektum észlel egy eseményt, majd erről üzenetküldéssel értesít egy másik objektumot, a számára az üzenet is lehet egy esemény Pl.: Ha van egy szenzorunk, amelyik egy gépnél a maximális lehetséges elmozdulást jelzi, az általa küldött üzenet egy olyan esemény a vezérlőegység számára, amelyik gép leállására vagy a mozgásirány megváltoztatására kényszeríti Az üres üzenet is tartalmazhat kódolt információt
Metódusok (operációk) Üzenet hatására az objektumok végrehajtják a hozzájuk rendelt felelősségek által meghatározott cselekedeteket. Ezen cselekedeteket metódusoknak vagy operációknak nevezzük Az objektum viselkedésének meghatározása a metódusokba van belekódolva Üzenet: MIT, metódus: HOGYAN Ugyanaz az objektum ugyanarra az üzenetre (ugyanolyan paraméter értékekkel) másképp is reagálhat, a korábbi hatásoktól függően
Ugyanannak az objekumnak 2 ugyanolyan egymásutáni eseméyre való regálása hozzaAd(6) hozzaAd(11)
A hozzaAd(ertek:int) megvalósítása Public void hozzaAd(int ertek){ S=S+ertek; } Az objektum állapota minden üzenetre változik. (Változik az S attribútum értéke) Rövidített változata az értékadásnak S+=ertek;
Üzenetek, események és metódusok Ezek alkotják az osztály felelősségét és az osztály jelölésében a 3-ik részt foglalják el Lehetnek: Üres üzenet Paraméterezett üzenet Üres üzenet visszatérési értékkel Paraméterezett üzenet visszatérési értékkel
Állapotok Az objektum azonos tartalmú üzenetre különbözőképpen reagálhat Pl. A felvonó attól függően indul el felfele vagy lefele, hogy a hívó személy milyen relatív pozícióban van hozzá képest Az objektumban végbemenő változások nyomát az objektum állapota jellemzi. Az objektum állapotát az attribútumok tárolják. Az attribútumok értékei változhatnak az objektum életciklusa során
Objektumok létehozása, inicializálása Az objektumnak életciklusa van. Megszületik, él és meghal. Születéskor meg kell adni a kezdeti adatait. Az inicializálást végző metódust konstruktornak nevezzük. Egy osztálynak lehet több konstruktora is. Javaban az objektumot a new(új) operátoral hozzuk létre. Az operátor után meg kell adni az osztály nevét. Mivel a konstruktor neve egyben az osztály neve is, az objektum automatikusan inicializálódik.
Egy osztálynak több konstruktora Egy ablak a képernyőn megadható többféle képpen. A bal felső sarok helyzete a képernyőn +szélesség+magasság A bal felső sarok helyzete + jobb alsó sarok helyzete Pont(x:int, y:int){} Ablak(balFelsoPont:Pont, szelesseg:int, magassag:int){} Ablak(balFelsoPont:Pont, jobbAlsoPont:Pont){}
A főprogram üzenetei Keletkezik 2 új pont objektumunk pont P1=new pont(2.2,3.3); pont P2=new pont(2.2,6.3); Keletkezik egy új szakasz objektumunk a 2 létező ponttal szakasz szk=new szakasz(P1,P2); Kiíratjuk a szakasz hosszát System.out.println("szakasz hossza="+szk.mennyiaHossza());
A metódus megvalósítása public double mennyiaHossza() { return Math.sqrt(Math.pow((kezdoPont.getYKoord()-vegPont.getYKoord()),2) +Math.pow((kezdoPont.getXKoord()-vegPont.getXKoord()),2)); } Ez a metódus elkéri a kezdőpont és a végpont koordinátáit (üzenet válasszal-get), amely alapján kiszámítható a szakasz hossza.
Osztályok és példányok (objektumok) Megegyező viselkedésű és struktúrájú objektumok egy közös minta alapján készülnek, amit osztálynak nevezünk. Az osztály a megegyező viselkedésű és struktúrájú objektumok gyára, vagy forrása Az objektum az osztály egy pédánya (instance) Az objektum egy bizonyos pillanatban létező egyed. Minden objektum különbözik a másik, ugyanazon osztályból származó objektumtól- equals – ki kivel egyenlő Az objektum ismeri az osztályt, amelyikből származik
Osztályok és objektumok A kutya osztály A kutya osztály egy példánya, kutya neve Néró (objektum) A kutya osztály egy másik példánya, kutya neve Beethoven (objektum) A kutya osztály egy általános példánya (objektuma) név nem ismert vagy nem jellemző
Az információ-elrejtés elve Az objektumok más objektumok által csak a metódusokon keresztül érhetők el. Lehetnek belső metódusok, amelyek a működés egy részét is elrejtik (függvényhívás) A publikus metódusokat nevezhetjük az osztály szolgáltatásainak is, azokon keresztül valósul meg az objektum felelőssége
A Demeter törvény (az objektum és környezete közötti csatolás gyengítésének elve) A csatolás a leggyengébb, ha a metóduson belül csak az alábbi elemekre történik hivatkozás: A metódus paramétereire és eredményére A metódust tartalmazó osztály attribútumaira A program globális változóira A metódusban definiált lokális változókra
CRC kártyák (Class-Responsibility-Collaboration) Osztály-Felelősség-Együttműködés kártyák Egy brainstorming eszköz, amelyik az objektum-orientált szoftver tervezésében használnak Ward Cunningham javasolta Index kártyákból készítették (76x127mm) ISO mérete az A7-es. Tartalma: az osztály neve a szuper- és alosztályok (ha léteznek) az osztály felelősségei azon osztályok, amelyekkel együttműködik a szerző
Osztály-felelősség-együttműködés Kis kártyák használata a tervezés komplexitását csökkenti. Ráirányítja a tervező figyelmét az osztály lényegére és eltávolítja a túlzott részletességtől. Kényszeríti a tervezőt, hogy ne adjon túl sok felelősséget egy osztálynak Mivel hordozható, elhelyezhető egy táblán, s újra rendezhető a tervezés folyamán A legbanálisabb módszer: olvasva a követelmény-specifikációt, kiválasztjuk a főneveket, mint lehetséges osztályokat vagy attribútumokat és az igéket, mint lehetséges felelősségeket