Bevezetés a programozásba II 8. Előadás: Osztályok, objektumok, osztályszintű metódusok
vektor.h #ifndef VEKTOR_H #define VEKTOR_H class Vektor { int meret, *mut; public: Vektor(int meret); int szamlal(int mit); }; #endif main.cpp Emlékeztető #include "vektor.h".. vektor.cpp #include "vektor.h" Vektor v(5); v.szamlal(0); int Vektor::szamlal(int mit) { int c=0; for (int i=0;i<meret;i++) if(mut[i]==mit) c++; return c; }
vektor.h #ifndef VEKTOR_H #define VEKTOR_H Emlékeztető Típus : class Vektor { Osztály int meret, *mut; { public: Vektor(int meret); int szamlal(int mit); }; #endif } main.cpp #include "vektor.h".. vektor.cpp #include "vektor.h" Változó : Vektor v(5); Objektum v.szamlal(0); int Vektor::szamlal(int mit) int c=0; for (int i=0;i<meret;i++) if(mut[i]==mit) c++; return c;
Osztályok Osztálynak nevezzük azokat a típusokat, amik összetett típusok, mezői vannak metódusok kapcsolódnak hozzá adat elrejtés, egyéb biztonsági garanciák (öröklődés) Adat absztrakció Ma legdivatosabb programozási módszertan
Objektumok Egy objektum: egy osztály egy példánya, azaz deklarált változó Van címe, memóriát foglal A struct fogalma kibővült metódusokkal Saját mezők, saját metódusok, this Modularitás
Egy példa Feladat: Űrhajós lövöldözős játék Eljárásközpontú megoldás: függvények rajzoláshoz függvények a szereplők mozgatásához függvények billentyűzet kezeléséhez függvények hálózat kezeléséhez egy nagy main függvény, ami a játékszabályok ismeretében a fentieket hívogatja Az adatok?
Egy példa Feladat: Űrhajós lövöldözős játék Moduláris megoldás: Szereplők adatai osztályokban (űrhajó, billentyű) Szereplők viselkedése metódusokban (rajzolás, mozgás) Az egymásra hatás szabályait a metódusok tartalmazzák (lokálisak) A main függvény csak létrehozza a játékmotort
Szemléletbeli különbségek Az eljárásközpontú programozás jelszava: keress jó algoritmust! A moduláris programozás jelszava: ráérsz jó algoritmust keresni, előbb rendezd az adataidat! Mindkét szemléletnek van létjogosultsága A különbségek többszemélyes, sokverziós programozásnál jönnek elő Új szempontok
Új szempontok Eddig mivel foglalkoztunk: algoritmus futásidő és memóriaigény biztonságos kód Újrafelhasználhatóság Karbantarthatóság Fejlesztési idő és költség Programtervezés folyamata, becslések
Karbantarthatóság A feladat kis változása kis programbéli változást okozzon Egy adat vagy funkció csak egy helyen szerepeljen Átlátható, olvasható kód elnevezési konvenciók tabulálás Gyorsan kereshető, moduláris kód Hibajelenség hiba helye a kódban, logikus felépítés
Fejlesztési idő és költség 1 programozó 10 nap alatt megoldja a feladatot Több programozó? Első lépés: n programozó kevesebb mint n*10 nap alatt oldja meg a feladatot Második lépés: n programozó 10 nap alatt oldja meg a feladatot Harmadik lépés: n programozó 10/n nap alatt oldja meg a feladatot
Fejlesztési idő és költség Kommunikáció egyértelműsége és tömörsége Tervezés, absztrakció adatok csoportosítása Szeparálható kód, szeparálható felelősség modularitás egyenként könnyű feladatok Külön tesztelhetőség Könyvtári, szabványos eljárások használata
Osztályok tervezése Vezérlés Az osztály szerepe a rendszerben Szerződés modell Ki kit hív meg, dinamikus memóriakezelés Reprezentáció Egy lehetséges megvalósítása a típusnak Szükség és lehetőség mérlegelése, STL konténerek A választott reprezentáció meghatároz metódusokat Gyakori lekérdezésekhez mező
Összefoglalás adatok gyűjtése Osztályok szerepei reprezentáció választása Osztály metódusai, tagjai Igény felmérés tervezési hiba új verzió programhiba rendszerbe illesztés Tesztelés modulonként Megvalósítás
Osztályszintű műveletek Metódusok hívásához általában objektum kell mezők csak objektumban vannak Mi a helyzet, ha a mezőktől független a metódus működése? Osztályszintű függvény, objektum nélkül is hívható class S{ public: static void fv() { } }; int main() { S::fv(); }
A static használata static T v = kezdoertek; A v változó ennek a sornak az első kiértékelésekor deklarálódik, majd az értéke megmarad, a blokkon kívül is A kezdőértéket sem veszi fel újra később Alapértelmezésben 0 kezdőérték is garantált Jól használható függvényhívások számolására, függvényben "előző híváskor felvett érték" Globálisan nem illik, fordítási egységek közötti takarásra való
Statikus tag class S{ public: static int m; }; int S::m; int main() { S sa; S sb; cout << sb.m; sa.m=1; cout << sb.m; S::m=2; cout << S::m; cin.get(); } Statikus adat deklaráció 0 1 2 Ha a deklaráció hiányzik akkor a linker hibát ad Az m mező osztályszintű
Összefoglalás Statikus tagokat osztályokban, osztályszintű adatokhoz (pl. futásidőben változtatható alapértelmezett érték, darabszám) Statikus metódusokat osztályszintű, (nem statikus) mezőket nem érintő funkciókhoz Osztályszint objektumszint A láthatóság osztályszintű