5M. Tétel: Programozási technológiák
Verziókezelés, verziókezelő rendszerek.
Verziókezelés:
A verziókezelés lényege a forráskódot érintő változások megfelelő követése.
Előnyei:
Backup (visszaállítás):
- A fájlok a szerkesztés közben mentésre kerülnek és bármikor visszaállíthatók.
Szinkronizáció:
- Ha egy szoftveren egynél több ember dolgozik, akkor fontos, hogy folyamatosan a kódbázis legfrissebb verzióját lássák mindannyian.
Változások követése:
- Ahogy a fájlok változnak, az egyes változtatások információkkal láthatók el, leírást adva arról, hogy mit miért tettünk.
Felelősség követése:
- Mivel az egyes változtatások egyértelmű felhasználóhoz/fejlesztőhöz köthetőek, mindig pontosan tudhatjuk, ki és mikor követett el bizonyos változtatásokat.
Elágazás (branching) és összefésülés (merging):
- A kódbázis egy másolatát lemásolhatod egy külön ágba, ahol ott aztán elkülönítve követett változtatásokat hajt végre. Amint elkészült, ezeket a változtatásokat akár össze is fésülheted az eredeti kódbázissal.
Alapfogalmak:
Repository:
- Az adatbázis, ami az összes fájlt tárolja nekünk.
Working copy:
- A kódbázis helyi verziója, amin éppen dolgozunk.
Revision:
- Fájlok halmazának egyértelműen azonosítható halmaza.
Head:
- Repositoryban található legfrissebb verzió.
Branch:
- Létrehozásakor másolatot készítünk az egész kódbázisról. Pl: mikor egy új funkción dolgozunk, és ha készen vagyunk vele, akkor akarjuk a projecthez csatolni.
Merge:
- Amikor a funkció elkészült, ezzel a művelettel csatoljuk hozzá.
Conflict:
- Merge közben jöhet létre, hiszen a miénktől függetlenül fejlődő másik ágban akár ugyanazok a fájlok is módosulhattak, amiken dolgoztunk.
Resolve:
- Az ütközéseket vele oldjuk fel.
Verziókezelő rendszerek:
- A verziókezelést a verziókezelő rendszerek valósítják meg.
- Pl: CVS, SVN, GIT.
- Git a legnépszerűbb manapság, okai pedig, hogy ő a leggyorsabb, a rendszer eloszott, nincs szükség központi repositoryra.
- Teljes verziótörténet offline is elérhető minden egyes kliensen.
Szoftvertesztelési alapfogalmak (tesztszintek, teszttípusok, teszttervezési módszerek).
- Tesztelés célja, hogy hibát találjuk és azt rögzítsük.
- Hibák jelenthetők:
- Kódolás során.
- Szoftver használata során.
- Elemzés, tesztelés során.
- Jelenthetjük:
- Kód hibáit.
- Futtatott rendszer.
- Dokumentumok.
- Követelmény.
- Felhasználói történet.
- Célja:
- Tájékoztatás nyújtása.
- Javaslat.
- Hibajegy tartalma:
- Leírás.
- Lépések.
- Aktuális eredmény.
- Elvárt eredmény.
- Tesztelési módok:
- White box testing:
- Fejlesztőnek a feladata az elvégzése.
- Olyan szoftver tesztelési módszer, amely során a szoftver (egy komponensének) belső struktúráját, felépítését, implementációját teszteljük. Pl: Unit teszt.
- Fajtái:
- Egység tesztelés:
- legkisebb önállóan működő egységeket teszteli pl: metódusokat adott paraméterrel
- Integrációs tesztelés:
- programegységeket, modulokat, azok egymással és a környezettel történő együttműködését teszteli.
- Az összeillesztés során keletkező hibákat keresi.
- Rendszer tesztelés:
- éles környezetben teszteljük, ahogy használni is fogják.
- Megfele-e a követelmény specifikációnak
- Funkcionális specifikációnak
- Rendszertervnek
- Ez gyakran inkább black boxing teszt.
- Átvételi teszt:
- Ügyfél végzi
- Lehet alfa teszt (fejlesztői cégnél tesztelik, de nem a fejlesztői csapat), béta teszt (végfelhasználók tesztelik, ami lehet nyílt vagy zárt).
- Egység tesztelés:
- Előnyei:
- Fejlesztés korai szakaszában elkezdhető a tesztírás.
- Kód optimalizálható rejtett hibák kiszűrésével.
- Le lehet fedni az összes lehetséges tesztesetet.
- Könnyű automatizálni.
- Hátrányai:
- A tesztek nagyon komplexé válhatnak, a teszt írójának magasan képzettnek kell lennie.
- A tesztek fenntarthatósága nehéz.
- Programozási tudás szükséges hozzá.
- Black box testing:
- Tesztelő feladata az elvégzése.
- Programozási tudás nem szükséges hozzá.
- A tesztelő a kódot nem ismeri, nem lát bele a rendszerbe.
- A hibákat maga deríti fel.
- White box testing:
Teszttervezési módszerek:
- Specifikáció alapú technikák:
- Ezeket a módszerek a teszteseteket közvetlenül a rendszer specifikációjából (modelljéből) vezetik le.
- Black-box technikának is nevezzük, mivel az egyes szoftver modulok belső szerkezetének ismerete nélkül, az egyes modulok által teljesítendő funkcionalitások alapján tervezhetjük meg a teszteseteket.
- Modell alapú technika:
- Közvetlenül az UML (egységes modellező nyelv) modellből vezeti le a teszteseteket és formalizált teszt specifikációt alkalmaz.
- Struktúra alapú technikák:
- Ezek a módszerek a kód ismeretében határozzák meg a teszteseteket. Ez lenne a white-box testing.
- Gyakorlat alapú technikák:
- A tesztelőknek a munkájuk során megszerzett tapasztalataira épülő, a szakmai intuíciókat is értékesítő technikák.
Objektum orientált tervezési alapelvek (GoF, SOLID).
- GoF (Gang of four), és a négy szerzőre utal, akik a könyvet írták.
- Címe: az újrahasznosítható objektumorientált szoftver elemei.
- Maga a könyv 2 részből áll, az első 2 fejezetben az oop által nyújtott lehetőségekről esik és buktatókról esik szó, a többi fejezetben pedig tervezési mintákat mutat be.
- Szerintük egy jó oop szoftvert tudunk készíteni akkor, ha megfogadjuk a következőket:
- Programozz interface-re és ne implementációra.
- Implementációra akkor programozunk, ha az osztály felelősségi körét rosszul határozzuk meg és egy osztály több felelősségi kört is lefed.
- Ha implementációra programozunk és megváltozik az osztály, akkor a vele kapcsolatban álló osztályoknak is változniuk kell.
- Ha interface-re programozunk és megváltozik az implementáció, de a felület nem, akkor nem kell megváltoztatni a többi osztályt.
- Interface karbantarthatóbb.
- Objektum összetétel az öröklődés helyett.
- Osztályoknak polimorf viselkedést és a kód újrafelhasználását kell megvalósítania, ahelyett, hogy ősosztályból örökölnének.
- Az öröklődés egyes esetekben súlyos problémákat okozhat, ha nincs kellő gondossággal implementálva.
- Pl: gyémántprobléma, mikor egy gyerekosztály örök egy szülőosztálytól, akiknek közös a nagyszülőosztályuk.
- Előnyök:
- Az interface-ek használatának előnye, hogy nagyobb fokú flexibilitást nyújt.
- Sokkal természetesebb az osztályokat különböző komponensekből, mint közös tulajdonságokat keresve felépíteni.
- Pl: gázpedál és a kormány nagyon kevés közös tulajdonsággal rendelkezik, mégis mindkettő fontos az autóban.
- Átláthatóbb lesz a rendszer.
- Hátrányok:
- Adott komponensek által nyújtott metódusokat implementálni kell az örököltetett osztályban, még akkor is, ha ezek csak a metódusokat továbbítják.
- Programozz interface-re és ne implementációra.
- SOLID ( [S]ingle Responsibility Principle, [O]pen/Closed Principle, [L]iskov Substitution Principle, [I]nterface Segregation Principle, [D]ependency Inversion Principle)
- Egyetlen felelősség elve, Nyílt/Zárt elv, Liskov helyettesítési elv, Interfész elválasztási elv, Függőségi megfordítási elv.
- Egyetlen felelősség elv
- kimondja, hogy egy osztály vagy modul egy, és csak egy felelősséggel rendelkezzen (egy oka legyen a változásra).
- Nyílt/Zárt elv
- kimondja, hogy egy osztály vagy modul legyen nyílt a kiterjesztésre, de zárt a módosításra.
- Liskov helyettesítési elv
- kimondja, hogy minden osztály legyen helyettesíthető a leszármazott osztályával anélkül, hogy a program helyes működése megváltozna.
- Interfész elválasztási elv
- kimondja, hogy egyetlen kliens se legyen rákényszerítve arra, hogy olyan eljárásoktól függjön, amelyeket nem is használ.
- Függőség megfordítási elv
- Kimondja, hogy a magas szintű modulok ne függjenek az alacsony szintű moduloktól. Mindkettő absztrakcióktól függjön.
- Egyetlen felelősség elv
- Egyetlen felelősség elve, Nyílt/Zárt elv, Liskov helyettesítési elv, Interfész elválasztási elv, Függőségi megfordítási elv.
Függőség-befecskendezés.
- Függőségnek nevezzük azt, amikor class A használja class B néhány funkcióját, mivel ilyenkor az A class függ a B classtól.
- A függőségbefecskendezés annak a megnevezése, hogy a függőségek hogyan kapcsolódnak az osztályhoz.
- Dependecy Injection:
- A függőség kívülről adódik be az osztálynak.
- Vagyis nem szükséges a new operátor használata a classban, helyette legyen a konstruktornak egy paramétere vagy settere.
- Egy task továbbítása valaki másnak, úgy, hogy ezt egy objektum létrehozásával egyidejűleg tesszük meg, közvetlenül a függőség használatával, ezt nevezzük dependency injection-nek (függőség befecskendezésnek).
- 3 fajtája van:
- Konstruktor befecskendezés:
- A függőség a konstruktoron keresztül van biztosítva.
- Konstuktor paramétere kapja meg az osztály interface-ét.
- Metodus befecskendezés:
- Metódus állítja be a függőséget.
- Interface befecskendezés:
- A függőség biztosít egy befecskendező metódust, ami befecskendezi a függőséget bármelyik kliensnek, amelynek ez át lesz adva.
- Konstruktor befecskendezés:
- Felelős:
- Objektumok létrehozásáért.
- Tudja, hogy melyik classoknak van szüksége azokra az objektekre.
- És biztosítja számukra azokat az objekteket.
- Használatának előnyei:
- Segít a unit tesztelésben.
- Egyszerűbb vele az alkalmazás bővítése.
- Hátrányai:
- Komplex az elsajátítása.
- Sok fordítási hiba futási időre tolódik át.
Architekturális minták (MVC).
- Model-View-Controller.
- Gyakori egy alkalmazás több rétegre való bontása, megjelenítés, tartománylogika, adatelérés.
- Az MVC-ben a megjelenítés tovább bomlik nézetre és vezérlőre.
- Jobban meghatározza egy alkalmazás szerkezetét, mint az egy programtervezési mintára jellemző.
- Modell:
- Az alkalmazás által kezelt információ tartomány-specifikus ábrázolása.
- View:
- A modell megjelenítése egy megfelelő alakban.
- Controller:
- Az eseményeket, jellemzően felhasználói műveleteket dolgozza fel és válaszol rájuk.
- Service:
- A contoller és a modell közötti réteg. A modelltől kér le adatokat és a controller-nek adja.
- Használata nem kötelező, mivel nem része az MVC-nek.
- Előnyei:
- Egyidejű fejlesztés (több fejlesztő esetén).
- Könnyen változtatható.
- Tesztelhetőség.
- Több nézet egy modellhez.
- Hátrányai:
- Kód olvashatósága.
- Nehezebben tanulható.
Tervezési minták.
- Nevezzük a gyakran előforduló programozási feladatokra adható általános, újrafelhasználható megoldásokat.
- Rendszerint egymással együttműködő objektumok és osztályok leírása.
- Célja, hogy leírást, sablont nyújtson.
- Előnyeik:
- Lerövidítik a tapasztalatszerzési időt, mivel a legtöbb problémára már van megoldás.
- Lerövidítik a tervezési időt, mivel az összes minta jól dokumentált, könnyen újrafelhasználható.
- Közös szótár a fejlesztőket tekintve, megkönnyítve az egymás közötti kommunikációt.
- Magasabb szintű programozást tesz lehetővé.
Szabad és nem szabad szoftverek.
- A szabad szoftver az olyan szoftver, amelyet a felhasználó:
- tetszőleges céllal, tetszőleges alkalommal futtathat.
- Működését tanulmányozhatja, és módosíthatja.
- Terjesztheti.
- Ezeket a jogokat a szoftverhez írásban kiadott licencszerződés biztosítja.
- Nem feltétlenül ingyenes.
- A nem szabad szoftver olyan szoftver, amelyet nem lehet szabadon módosítani és továbbadni.
Szoftverlicencek, szabad és nyílt forrású licencek fajtái.
- A szoftverlicenc:
- Szoftverek használatának és terjesztésének módját szabályozó jogi eszköz.
- Nem szabad szoftverek esetén a végfelhasználói licencszerződés kifejezést használják.
- Nyílt forráskódú szoftver nem azonos a szabad szoftverrel.
- Forráskódnak végig nyíltnak kell maradnia, és be kell tartani a programozás során egy fejlesztési modellt.
- Korlátozott szoftver:
- Olyan szoftver, amit korlátozottan lehet használni, így nem tekinthető szabad szoftvernek.
- Pl: trial
- Olyan szoftver, amit korlátozottan lehet használni, így nem tekinthető szabad szoftvernek.
- Licenc fajták:
- Amelyik licenc előírja a licenselés megőrzését a módosított programokra is, copyleft licensnek nevezzük.
- BSD:
- Nem követeli meg a módosított kód egészére az eredeti licencet.
- GNU General Public License:
- Minden módosításra az eredeti licenc kell, hogy vonatkozzon.