2. gyakorlat¶
A gyakorlat anyaga¶
Projektmunka¶
A projektterv mintája elérhető itt, míg egy kitöltött projektterv elérhető itt.
Git¶
A projekt megvalósításához Gitet fogunk használni, ide kell dolgoznia a csapat minden tagjának. Ha valaki esetleg nincs tisztába a Git működésével, a megtanuláshoz segítség lehet:
A fejlesztéshez ajánlott követni a git flow-t, ehhez segítség: https://danielkummer.github.io/git-flow-cheatsheet/
UML¶
Megjegyzés
Ez a gyakorlati oldal csak vázlatszerűen tárgyalja az UML nyelvet (annak egyes részeit), az előadáson, illetve az ajánlott irodalomban bővebben is olvashatunk róla!
- UML - Unified Modeling Language (Egységesített Modellező Nyelv)
- Hivatalos oldal, amelyen elérhető a nyelv teljes specifikációja és dokumentációja
- Wikipédia leírás az UML-ről magyar, illetve angol nyelven
- Előnyei
- Nyílt szabvány
- A szoftverfejlesztés ciklusainak mindegyikét támogatja
- Hatalmas tapasztalati tudásra épít
- Sok eszköz és sok cég támogatja, fejleszti a szabványt
- Használhatjuk szoftverrendszer elemeinek
- vizualizálására
- specifikálására
- létrehozására
- dokumentálására
- Modell: egy teljes rendszer leírása
- Diagram: a rendszer egy részének, valamely szemszögből való vizuális leírása
- Két nagy részre bontható alapvetően
- Statikus modellek, például:
- Osztálydiagram, leírás
- Objektumdiagram
- Csomagdiagram
- Komponensdiagram
- Dinamikus modellek, például:
- Állapotdiagram
- Szekvenciadiagram
- Használati eset (use case) diagram
- Statikus modellek, például:
Az objektum¶
Az objektum egy entitás ábrázolása (ez lehet valós - lámpa, autó - vagy pedig elvont - matematikai függvény, zombi - amely rendelkezik állapottal, viselkedéssel, identitással.
Állapot¶
Egy az objektum lehetséges létezési lehetőségei közül (a tulajdonságok aktuális értéke által meghatározva). Ez időben változó lehet, pl.: egy lámpa ami ki van kapcsolva, egy későbbi időpontban be lehet kapcsolva.
Egy programban ez gyakorlatilag változókat fog jelenteni, amelyek valamely típusbeli konkrét értékkel rendelkeznek (pl.: egy lámpa objektum aktuális tulajdonsága egy boolean típusú változó, amely True vagy False értékeket vehet fel, és ez jelöli azt, hogy az adott lámpa be van-e kapcsolva; egy autó objektum egy tulajdonsága lehet, hogy éppen mekkora sebességgel halad, amelyet reprezentálhatunk egy int típusú változóval, és adott autó konkrétan az int értéktartományon belül egy adott értékkel halad, amely természetesen változhat, és jellemzően változik is.
Viselkedés¶
Az objektum viselkedése annak leírása, hogy az objektum hogy reagál más objektumok kéréseire. Az objektum kérésre csinál valamit, ami akár az állapotát is megváltoztathatja.
Egy programban ez gyakorlatilag metódusokat fog jelenteni, pl.: lámpa objektum bekapcsol(), kikapcsol() nevű metódusai, melyek megváltoztatják az állapotát; autó objektum gyorsit(), lassit() nevű metódusai, melyek a pillanatnyi sebességet változtatják meg.
Identitás¶
Minden objektum egyedi, még akkor is, ha éppen ugyanabban az állapotban vannak, és ugyanolyan viselkedést képesek megvalósítani.
Ez gyakorlatilag azt jelenti, hogy hiába van két, azonos gyártó által gyártott, ugyanolyan típusú, színű autó objektum, melyek pillanatnyilag éppen ugyanakkora sebességgel haladnak, ez a két autó objektum akkor is különböző.
Osztályok¶
Fogalma¶
Az osztály gyakorlatilag egy adott objektumcsoport "formai" leírása. Egészen konkrétan objektumok csoportjának leírása, amelyeknek közösek az attribútumaik, operációik, más objektumokkal való kapcsolataik és szemantikus viselkedésük. Az osztály egy adott objektum típusát jelenti. Az osztályokat csoportosíthatjuk valamilyen logika szerint, akár hierarchikusan, csomagokba.
Megjegyzés
Az osztály egy adott objektum típusa, azaz az objektum egy osztály példánya. Van egy konkrét autó objektumunk, amelyet a Toyota gyártott, Corolla típusú, fekete színű és éppen 46 km/h-val halad. Ez pontosan egy osztály példánya lehet, jelen esetben az autó osztály példánya. Az autó osztály tárolja, hogy ki gyártotta (szöveges), milyen típusú (szöveges), milyen színű (szöveges), és éppen mennyivel halad (egész).
Osztálydiagram - class diagram¶
Az osztálydiagram az osztályoknak és azok kapcsolatainak összefoglaló diagramja. Az osztályok csomagokba kerülhetnek itt is. Ez a diagramtípus az egyik legalapvetőbb, és legtöbbet használt diagramtípus, amellyel modellezhetjük az osztályainkat, és az azok között lévő kapcsolatokat. Az osztálydiagramokról bővebben az előadáson esett szó, illetve olvashatunk ezen és ezen a linken.
UML osztálydiagram elemei¶
Egy UML osztálydiagram elemei az osztályok, és az osztályok közötti kapcsolatok.
Osztály¶

Az osztály jele a téglalap. A téglalapnak 3 része van: a felső részbe írjuk az osztály nevét, a középső részbe kerülnek az osztályhoz tartozó adattagok, általában típusmegjelöléssel. A nagy téglalap alsó részébe kerülnek az osztályhoz tartozó metódusok.
Kapcsolatok¶
Objektum-kölcsönhatásokat valósítanak meg. Alapvető kapcsolatok osztályok között: asszociáció, aggregáció (gyenge, erős), öröklődés. Ezen kapcsolatoknak különböző tulajdonságai lehetnek (név, irány, szerep, multiplicitás, stb).
Asszociáció¶
Osztályok közötti kétirányú összeköttetés, megadható az iránya (az üzenet iránya). A kapcsolatban résztvevő osztályok léte egymástól általában független, de legalább az egyik ismeri és/vagy használja a másikat. Gyakorlatilag az osztályokból létrejövő objektumok között van összefüggés.
Jele: a két osztály között húzott vonal, adott esetben nyíllal valamelyik végén.

Az asszociáció tulajdonságát az asszociációhoz húzott szaggatott vonallal jelölhetjük, ahogy az a fenti példán is látható. A fenti példán a Személy és a Lakás közötti kapcsolatnak van egy Lakik tulajdonsága.
Aggregáció¶
Az aggregáció egy rész-egész kapcsolatot jelent, az asszociáció egy speciális, erősebb formája. Az egyik objektum fizikailag is tartalmazza, vagy birtokolja a másikat, mégpedig úgy, hogy a rész-objektum(ok) létezése az egész-objektumtól függ.
Jele: a két osztály között húzott vonal, egy rombusszal a tartalmazó oldalán
Gyenge aggregáció¶
Egy speciális asszociáció, amelynél a tartalmazó létezhet a tartalmazott nélkül is, pl.: alma és kukac.
Jele: a két osztály között húzott vonal, egy üres rombusszal a tartalmazó oldalán

Erős aggregáció - kompozíció¶
Ez egy erősebb fizikai tartalmazás, itt a részek élettartama szigorúan megegyezik az egészével, pl.: ember-fej, lakás-gerendaszerkezet.
Jele: a két osztály között húzott vonal, egy teli rombusszal a tartalmazó oldalán

Öröklődés¶
Egy olyan osztályok közötti kapcsolat, ahol az egyik osztály megosztja a struktúráját és/vagy viselkedését egy vagy több másik osztállyal. Öröklődéssel egy egész hierarchiát készíthetünk, a származtatott osztály örököl az ősosztály(ok)tól. Ez az újrafelhasználhatóság egyik alapeszköze. Az öröklődés relációnak nincs neve, multiplicitása.
Öröklődés során az attribútumokat (egy programban gyakorlatilag tagváltozókat) és operációkat a lehető legfelső szinten definiálni kell.
A származtatott (gyerek) osztály mindent örököl az őstől (attribútumokat, viselkedést, kapcsolatokat is), és kiegészítheti ezeket sajátokkal.
A származtatott osztály egy örökölt operációnak saját implementációt is adhat. Ezt nevezzük felüldefiniálásnak (overriding), ez a polimorfizmus alapja.
A tipikus öröklődési szintek száma (ős-gyerek viszony) 3-5 körül szokott lenni.

Többszörös öröklődés¶
Előfordulhat, hogy egy osztály nem csak egy, hanem több ősosztálytól is örököl, azaz az összes ősének az összes tulajdonságát és operációját megörökli, ezt nevezzük többszörös öröklődésnek. Ezzel azonban érdemes vigyázni, hiszen ha egy osztály sok másik osztályból öröklődik közvetlenül, akkor az osztály könnyen átláthatatlanná, kezelhetetlenné válhat.

Megjegyzés
A legtöbb objektum-orientált nyelvben, így Java-ban, és C#-ban sincs többszörös öröklődés, de pl. a C++, Python nyelvekben van.
Use case¶
Használati eset modellezés¶
- Rendszer viselkedését modellezi:
- funcionalitás
- kommunikáció eszköz (felhasználó felé is)
- legmagasabb absztrakció
- Megvilágítja:
- rendszer tervezett funkcióit (használati eseteit)
- rendszer környezetét (szereplő - Actor)
- ezek közötti kapcsolatokat (Use Case Diagram)
- Eseményáramlás érthető, magas szintű
Use case diagram kapcsolatok¶
- Asszociáció
- Általánosítás
- Kiterjesztés
- Tartalmazás
Eszközök¶
- ArgoUML Letöltés
- BOUML Letöltés
- Violet UML Editor Letöltés vagy WebStart
- Gliffy Letöltés vagy WebStart
- Modelio Letöltés
Feladatok¶
Modellezzünk le egy egyszerű 2 lapos póker játékot, játékossal, osztóval, téttel.