S01-6 Szoftverfejlesztési modellek
Tartalom
- Szoftverfejlesztési modellek (vízesés, spirális, evolúciós, RUP, XP, xUML)
- Architekturális minták és hatásuk a rendszer minőségi jellemzőire
- Tervezési minták (GoF, valamint 3 további létrehozási minta)
- Konkurens minták
- Antiminták, újratervezési minták
1. Szoftverfejlesztési modellek (vízesés, spirális, evolúciós, RUP, XP, xUML)
A szoftverfejlesztés hagyományos fázisai:
- Követelmények felmérése
- Specifikáció
- Vázlatos/finom tervek készítése
- Implementáció
- Integráció
- Verifikáció/validáció (megfelel-e a specifikációnak/ezt kérte-e a user)
- Rendszerkövetés/karbantartás
Ezeket használják fel, vagy módosítják a következő szoftverfejlesztési modellek.
1.1 Vízesés modell
- Az egyes fázisok lineárisan követik egymást.
- Előre megtervezi a projekt időtartamát, ráfordításait.
- Elvárja minden fázis megfelelő dokumentálását, amely tartalmazza annak eredményeit.
- Jól strukturált dokumentált folyamatot biztosít.
- Nehézkes a megszervezése, tervezése és fájdalmas az új feature-ök bevezetése.
- Nem teszi lehetővé a követelmények megváltoztatását, nem készül fel az esetleges nehézségekre.
- Csak akkor szabad egy fázisról a következőre ugrani, ha az előző “biztosan véget ért” (reviewed & verified).
- Rövid élettartamú, előre jól specifikálható projekteknél lehet jó.
1.2 Boehm féle spirális modell
- A spirál minden hurka a gyártási folyamat egy fázisát jelképezi.
- Nincsenek fix hurkok, (pl.: specifikáció, vagy tervezés), azok az igényeknek megfelelően alakulnak ki.
- Minden ilyen fázisnak 4 szakasza van: (az ábrán lásd bal fentről kezdve)
- A célok és korlátok meghatározása
- Különböző megoldások elemzése, stratégiák kialakítása. Prototípus készítés
- Az előző pont feladatának megoldása
- A következő lépés megtervezése (nyilván az utolsónál ilyen nincs)
- A módszer jól dokumentálható, áttekinthető, a fázisok rugalmasak.
- Ellenben elég drága a sok kidolgozás és próbálgatás.
- A 3. pont kivételével nehezen párhuzamosítható.
- a fejlesztés ciklusokban történik, amelyben az elkészített prototípusok, valamint a továbbfejlesztésével kapcsolatos kockázatok kiértékelésre kerülnek
- előnyei:
- jobban alkalmazkodik a változó követelményekhez
- a prototípusok lehetővé teszik a nehézségek előrelátását
- hátrányai:
- költségesebb a prototípus elkészítése és a kockázatkiértékelés végett
- továbbá a prototípusok megzavarhatják a felhasználót
1.3 Evolúciós modell
- Akkor jó, ha nincs pontos specifikáció
- Először a prototípust készítjük el, majd a megrendelővel folyamatosan egyeztetve jutunk el a végleges megoldásig
- Hátránya, hogy gyenge a dokumentáció, áttekinthetetlen egy idő után és nehezen módosítható.
1.4 RUP (Rational Unified Process)
- Az UML alkotóitól egy iteratív, inkrementális módszer.
- 4 fázisa van, mindegyik állhat több iterációból, ezeken belül munkafolyamatokból: modellezés, követelményelemzés, tervezés, implementáció, tesztelés, telepítés, konfigurálás, változáskezelés, projektvezetés, stb
- Fázisai:
- Előkészítés: Architektúra, költségbecslés. (Use case és activity diagramokkal)
- Kidolgozás: Minimális kódolással az 1.) véglegesítése, innen már csak építeni kell.
- Megvalósítás: Ez a fejlesztési fázis, egészen a tesztelésig
- Átadás: Kb készen van, még tesztelendő, újrakiadható állapot javításokkal
1.5 Extreme Programming (XP)
- Lightweight fejlesztés, kis csapatokkal, határozatlan, változékony körülményekre.
- Alapelvei, hogy mindig a legegyszerűbb megoldást válasszuk, azokat csináljuk meg először, van idő próbálkozni. Ha egy megoldás rossz, el kell dobni!
- Kis csapatokban, folyamatosan tanulva, pair-programming alkalmazásával a lehető legmagasabb minőséget biztosítva kell dolgozni
- Fázisai:
- Feltárás: Az architektúra kitalálása (pár hét)
- Tervezés: Az első kiadás határidejének megállapítása (pár nap)
- Iterációk: 1-4 hetes, 2-6 hónapos kiadások, itt történik a fejlesztés nagy része.
- Fejlesztés, karbantartás, befejezés: Konfiguráció, bővítés, módosítás és átadás
1.6 Végrehajtható UML (xUML)
- Ebben az esetben csak egy platformfüggetlen modell van, csak a feladatra koncentrálunk.
- Ebből pedig kódgenerálással előáll a platformfüggő termék.
- Ezt az UML megszorításával (és kiterjesztésével) valamint az Action Specification Language-dzsel érjük el.
- Menete:
- Meghatározzuk a alrendszereket (use case és szekvencia diagramokkal)
- Létrehozzuk a modellt (osztálydiagramok és állapotdiagramok)
- Ellenőrizzük őket
- Modellfordítást végzünk (kódgenerálás)
- A komponensekből összeállítjuk a terméket
2. Architekturális minták és hatásuk a rendszer minőségi jellemzőire
- A rendszer kívülről látható részeit mutatja meg, a belső implementációt NEM.
- Az elemek által nyújtott szolgáltatások, kommunikáció, hibakezelés, erőforrás használat tartozik ide.
- A kezdeti döntések kihatnak a következő tulajdonságokra:
- Rendelkezésre állás
- Megbízhatóság
- Teljesítmény
- Biztonság
- Tesztelhetőség
- Használhatóság
Csövek és szűrők: Adatfolyam feldolgozása a komponensek (szűrők) között. A komponensek bemenettel és kimenettel rendelkeznek és valamilyen transzformációt hajtanak végre az adatokon. Az adatokat pedig a csövek szállítják. Van passzív és aktív szűrő. Az aktív szűrő tud igényelni és küldeni is. Két aktív szűrő között a kommunikációt az egyik szűrő vagy a cső szinkronizálja. Ha a szűrők lineárisak, akkor csővezetékről beszélünk.
Objektumelvű rendszer: A komponensek objektumok, közöttük eljáráshívással történik a kommunikáció. A belső reprezentációjuk rejtett. A kommunikációhoz kapcsolat kell, és ha az egyik publikus része változik, akkor valószínűleg a használóját is módosítani kell.
Eseményalapú rendszer: A komponensek nem tudják, hogy más milyen eseményeket bocsát ki, mire iratkozik fel és milyen sorrendben szolgálódik ki. Sőt, nem tudni, hogy ki-mit csinál és meddig.
Réteg szerkezetű rendszer: Minden réteg az alatta lévő szolgáltatásait használja, vele kommunikál. A módosítások max 1-2 réteget érintenek, tesztelés esetén lehet szimulálni a rétegeket.
Gyűjtemény: Komponens adattár, komponensek veszik körbe és tárolja őket. Ha végre is hajt műveleteket, akkor táblának, ha nem, akkor adatbázisnak nevezzük. Így a komponensek függetlenek is lehetnek egymástól, jól módosítható.
Virtuális gép, értelmező: A bemenő adatokat értelmezi, feldolgozza, majd a feldolgozó interfészen ki is adja az eredményt.
Modell-Nézet-Vezérlő: A rétegek elkülönülnek. A modell az adatokért és a rajtuk végzett műveletekért felel. A nézet a megjelenítésért, míg a vezérlő a felhasználói utasítások kezeléséért felel. A rendszer sajnos könnyen bonyolulttá válhat.
Továbbiak: szerver-kliens, modell-nézet, gyakran használt “módszerek”: állapotgép-rendszer, felügyelő (supervisor), monád (“számítás-építő”)
3. Tervezési minták (GoF, valamint 3 további létrehozási minta)
4. Konkurens minták
- Eseményalapú aszinkron hívás: Ha egy esemény sokáig tart, egy új szálban indítjuk el
- Ütemező: szálak sorbaállítása (pl szekvenciális kód kell egy adott helyen, nem futhatnak akárhogy a szálak)
- Aktív objektum: Minden művelet futtatás külön objektum. Párhuzamosítható, szinkronizálható.
- Blokkolás: Csak akkor engedünk egy szálnak végrehajtani egy műveletet, ha az objektum egy bizonyos állapotban van. (más esetben szimplán “eldobjuk” a műveletet)
- Író-olvasó zárás: Több olvasó lehet, de egyszerre csak egy író. (írás közben nincs más I/O!)
- Threadpool: Olyan, mint az objektumkészlet.
- Termelő-fogyasztó: Aszinkron, párhuzamos folyamatok. Feladatok generálása/végrehajtása. A termelő egy közbeiktatott raktárba helyezi az objektumokat, ahonnan a fogyasztó kiveheti.
5. Antiminták, újratervezési minták
- Antiminták
- Mindenható objektum: Túl sokat tud, egy idő után borzasztóan nehéz lesz a módosítás.
- Kör-ellipszis probléma: Mi az általánosabb? Mindig attól függ, milyen műveletek vannak.
- Felesleges rétegződés: Ha túl sok réteg van a rendszerben, érdemes összevonni néhányat.
- Jojó probléma: Túl hosszú az öröklődési lánc.
- Poltergeist objektum: Az osztály összes objektumának élete túl rövid (pl: paraméter átadás, üzenetküldés, stb)
- Újratervezési minták
- Létrehozó metódus: Olyan, mint a singletonnál. Inkább legyenek olyan műveltek, amik visszaadnak egy objektumot.
- Műveletek kihelyezése: Egy bonyolult művelet egy részét kihelyezzük, ezzel több kisebb műveletre bontva, amelyek egyenként már könnyebben értelmezhetőek.
- NullObject: A nullreferencia sokszor gondot okozhat. Ilyenkor érdemes egy NullObject típust bevezetni.
További források