Bevezetés a Programozásba II 3. előadás. Biztonságos adattípusok megvalósítása

Hasonló dokumentumok
Bevezetés a Programozásba II 3. előadás. Biztonságos adattípusok megvalósítása. Biztonságos adattípusok megvalósítása

Bevezetés a Programozásba II 2. előadás. Adattípusok megvalósítása egységbe zárással. Adattípusok megvalósítása egységbe zárással

Alkalmazott modul: Programozás 6. előadás. Strukturált programozás: újrafelhasználható adattípusok

Bevezetés a Programozásba II 5. előadás. Objektumorientált programozás és tervezés

Objektumelvű programozás

Osztályok. 4. gyakorlat

Bevezetés a Programozásba II 4. előadás. Adattípusok hordozhatósága

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

OOP #14 (referencia-elv)

Programozási alapismeretek 4.

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

Bevezetés a Programozásba II 8. előadás. Polimorfizmus Giachetta Roberto

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

Objektum-orientált programozás

Szoftvertechnológia 3. előadás. Objektumorientált tervezés: alapismeretek. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Objektumelvű alkalmazások fejlesztése 6. gyakorlat. Öröklődés, polimorfizmus. Öröklődés Kódismétlődés objektum-orientált szerkezetben

Bevezetés, a C++ osztályok. Pere László

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Pénzügyi algoritmusok

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Már megismert fogalmak áttekintése

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

JAVA PROGRAMOZÁS 2.ELŐADÁS

Interfészek. PPT 2007/2008 tavasz.

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Alkalmazott modul: Programozás 10. fejezet. Strukturált programozás: dinamikus memóriakezelés. Giachetta Roberto

OOP: Java 8.Gy: Abstract osztályok, interfészek

Alkalmazott modul: Programozás 8. előadás. Strukturált programozás: dinamikus memóriakezelés. Dinamikus memóriakezelés. Dinamikus memóriakezelés

Alprogramok, paraméterátadás

Eljárások, függvények

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Globális operátor overloading

ELTE SAP Excellence Center Oktatóanyag 1

Informatikai Kar. 3. fejezet. alapismeretek. Giachetta Roberto

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

Alkalmazott Modul III 6. előadás. Objektumorientált programozás: öröklődés és polimorfizmus

Bevezetés a programozásba Előadás: A const

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

S0-02 Típusmodellek (Programozás elmélet)

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

Bánsághi Anna 2014 Bánsághi Anna 1 of 68

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Programozás II gyakorlat. 8. Operátor túlterhelés

Bevezetés a programozásba. 8. Előadás: Függvények 2.

Objektumorientált programozás IX. Osztályok, objektumok

Programozási nyelvek Java

3. Osztályok II. Programozás II

ISA szimulátor objektum-orientált modell (C++)

C++ programozási nyelv

Algoritmizálás és adatmodellezés tanítása 1. előadás

Java programozási nyelv 4. rész Osztályok II.

Java II. I A Java programozási nyelv alapelemei

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

Bevezetés a Programozásba II 10. előadás. Dinamikus memóriakezelés

Java és web programozás

Bevezetés a programozásba II 1. gyakorlat. A grafikus könyvtár használata, alakzatok rajzolása

Programozás II. 2. Dr. Iványi Péter

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Pénzügyi algoritmusok

C# osztálydeníció. Krizsán Zoltán 1. .net C# technológiák tananyag objektum orientált programozás tananyag

Alkalmazott modul: Programozás 11. előadás. Objektumorientált programozás: öröklődés

Alkalmazott modul: Programozás 9. előadás. Strukturált programozás: dinamikus adatszerkezetek

Alkalmazott Modul III 4. előadás. Objektumorientált programozás: objektumok és osztályok. Procedurális programozás Koncepció

Objektumorientált Programozás VI.

Programozási nyelvek a közoktatásban alapfogalmak II. előadás

Java V. Osztályszint. lyszintű ű tagok. Példányváltozó. Osztályváltozó. Általános Informatikai Tanszék Utolsó módosítás:

III. OOP (objektumok, osztályok)

Eseményvezérelt alkalmazások fejlesztése I 11. előadás. Szoftverek tesztelése

Osztálytervezés és implementációs ajánlások

Bevezetés a programozásba. 9. Előadás: Rekordok

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Osztálytervezés és implementációs ajánlások

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

Gregorics Tibor Tanácsok modularizált programok készítéséhez 1

Kivételkezelés a C++ nyelvben Bevezetés

Felhasználó által definiált adattípus

Alkalmazott modul: Programozás 10. előadás. Objektumorientált programozás: tervezés és megvalósítás

C++ referencia. Izsó Tamás február 17. A C++ nyelvben nagyon sok félreértés van a referenciával kapcsolatban. A Legyakoribb hibák:

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

Programozási nyelvek Java

Programozás módszertan

Java programozási nyelv 5. rész Osztályok III.

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Járműfedélzeti rendszerek II. 4. előadás Dr. Bécsi Tamás

OOP: Java 4.Gy: Java osztályok

Adatbázis Rendszerek II. 5. PLSQL Csomagok 16/1B IT MAN

OOP. Alapelvek Elek Tibor

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

A gyakorlat során az alábbi ábrán látható négy entitáshoz kapcsolódó adatbevitelt fogjuk megoldani.

Átírás:

Pázmány Péter Katolikus Egyetem Információs Technológiai és Bionikai Kar Bevezetés a Programozásba II 3. előadás Biztonságos adattípusok megvalósítása 2014.02.24. Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto

Adattípusok Adattípusok létrehozása során definiálnunk kell az értékhalmazt, illetve a művelethalmazt összetett típusok esetén típuskonstrukciókat használunk, amelyek megadják az egyszerű adatok összekapcsolásának módját pl. RRRRRRRRRRRRRRRR = iiiiii iiiiii\{0}, +,, az adattípusokat mindig újrafelhasználhatónak kell megvalósítanunk, és lehetővé kell tenni annak biztonságos használatát az adattípusok példányaira garantálnunk kell, hogy mindig olyan értékeket vegyenek fel, amelyeket az értékhalmaz megenged, azaz konzisztens állapotban legyen PPKE ITK, Bevezetés a programozásba II 3:2

Adattípusok A konzisztens állapot csak akkor tartható fent, ha korlátozzuk az értékek beállítását a bárki által lekérdezhető, illetve módosítható értékek ezt nem tehetik lehetővé, pl.: struct Rational { // racionális szám típusa int numerator; // számláló int denominator; // nevező // típusműveletek }; Rational r; r.denominator = 0; // inkonzisztens állapotba hozza r-t PPKE ITK, Bevezetés a programozásba II 3:3

Láthatóság Annak érdekében, hogy a biztonságos kezelést lehetővé tegyük, korlátoznunk kell a hozzáférést a mezőkhöz le kell tiltanunk a külső hozzáférést, csak a típuson belül (metódusokon keresztül) lehessen az értékeket módosítani A típusok tagjainak külső hozzáférését a láthatóság kezelésén keresztül szabályozhatjuk az elrejtendő tagokat private: kulcsszó mögé tesszük, ezek csak a típuson belül lesznek láthatóak a mindenki számára elérhető tagokat a public: kulcsszó mögé tesszük alapértelmezetten (kulcsszó nélkül) minden látható lesz PPKE ITK, Bevezetés a programozásba II 3:4

Láthatóság A rejtett tagok külső hívása fordítási hibához vezet, ezért csak a publikus tagokon (metódusokon) keresztül, ellenőrzött környezetben kezelhetőek Pl.: struct MyType{ private: int value; // rejtett mező public: MyType() { value = 0; } // publikus konstruktor void Add(int v) { value += v; } // publikus metódus }; PPKE ITK, Bevezetés a programozásba II 3:5

Láthatóság és hozzáférés A használat során csak a publikus tartalmat érhetjük el, pl.: MyType mt; // példányosítás a publikus konstruktorral mt.add(10); // publikus művelet hívása int v = mt.value; // rejtett mező elérése, fordítási hibás okoz! Az elrejtett tagokat elnevezhetjük más módon (pl. _ jellel kezdve), így könnyen azonosíthatjuk őket Amennyiben biztonságos küldő hozzáférést szeretnénk biztosítani a rejtett mezőkhöz, készíthetünk publikus beállító ( setter ), illetve lekérdező ( getter ) műveleteket PPKE ITK, Bevezetés a programozásba II 3:6

Láthatóság és hozzáférés Pl.: struct MyType { private: int _value; // rejtett mező public: // konstruktor, egyéb metódusok void setvalue(int v) { if (v > 0) _value = v; } // ellenőrzött beállítás int getvalue() { return _value; } // lekérdezés }; mytype.setvalue(-1); // nem rontja el az állapotot PPKE ITK, Bevezetés a programozásba II 3:7

Példa Feladat: Valósítsuk meg a téglalapok típusát úgy, hogy a méretek sohase lehessenek negatívok. ehhez elrejtjük a mezőket, és ellenőrzött beállításokat végzünk (a konstruktorban és a beállító műveletben) Megoldás: struct Rectangle { // téglalap típusa private: // rejtett rész double _width; // szélesség double _height; // magasság public: // látható rész Rectangle() { } PPKE ITK, Bevezetés a programozásba II 3:8

Példa Megoldás: Rectangle(double w, double h) { // 2 paraméteres konstruktor művelet _width = w < 0? 0 : w; _height = h < 0? 0 : h; } double getwidth() { return _width; } // lekérdező műveletek void setwidth(double w) { _width = w < 0? 0 : w; } // beállító műveletek PPKE ITK, Bevezetés a programozásba II 3:9

Példa Feladat: Valósítsuk meg a racionális szám típusát úgy, hogy a 0 nevezőt nem engedélyezzük. ehhez elrejtjük a mezőket, és ellenőrzött beállításokat végzünk (a konstruktorban és a beállító műveletben) Megoldás: struct Rational { private: // a mezők rejtettek int _numerator; int _denominator; public: // a műveletek publikusak Rational(); PPKE ITK, Bevezetés a programozásba II 3:10

Példa Megoldás: // lekérdező és beállító műveletek: void setnumerator(int value); void setdenominator(int value); int numerator(); int denominator(); }; void Rational::setDenominator(int value) { _denominator = value == 0? 1 : value; // speciális beállítás } PPKE ITK, Bevezetés a programozásba II 3:11

Példa Megoldás: // külső értékmódosítási operátorok: Rational operator+=(rational& r1, Rational r2) { r1.setnumerator(r1.numerator() * r2.denominator() + r2.numerator() * r1.denominator()); // a műveletet a lekérdező/beállító // műveleteken keresztül végezzük el r1.setdenominator(r1.denominator() * r2.denominator()); return r1; } PPKE ITK, Bevezetés a programozásba II 3:12

Láthatóság és hozzáférés Általánosan elmondható, hogy az adattípusok mezőit mindig elrejtjük csak megfelelő műveleteken keresztül biztosítjuk a hozzáférést és a módosítást (csak azokra a mezőkre, és csak azt a műveletet, amelyre kívül szükség lehet) amennyiben a típus rendelkezik segédművelettel, amely csak az értékek kezelésében játszik szerepet, azt is elrejtjük ha a konstruktort elrejtjük, akkor nem lehet példányosítani a típust, azaz nem tudunk belőle változót létrehozni (néha hasznos, ha a típust direkt nem akarjuk példányosítani) ez nem vonatkozik a rekordokra (művelet nélküli típusokra) PPKE ITK, Bevezetés a programozásba II 3:13

Láthatósági kulcsszavak Az típusok tekintetében a C++ két fajtát különböztet meg alapértelmezetten minden látható: struct alapértelmezetten minden rejtett: class konvenció szerint a class kulcsszót típusokra, a struct kulcsszót rekordokra használjuk Pl.: class MyType { // rejtett tagok public: // publikus tagok private: // rejtett tagok }; PPKE ITK, Bevezetés a programozásba II 3:14

Példa Feladat: Valósítsuk meg a racionális számok típusát úgy, hogy mindig egyszerűsítsük a tárolt értéket. minden értékbeállítás után le kell futtatni az egyszerűsítést, amit euklideszi algoritmussal valósítunk meg ez egy segédművelet, ezért szintén elrejtjük cím szerint adjuk át az értékeket, és adja vissza azok egyszerűsített értékét mivel az algoritmus csak pozitív számokra alkalmazható, módosítanunk kell a szerkezetén (ami a megjelenés miatt is fontos) a nevezőnek és számlálónak tároljuk csak az abszolút értékét (unsigned int), és külön tároljuk az előjelet PPKE ITK, Bevezetés a programozásba II 3:15

Példa Megoldás: Rational::Rational(int num, int denom) { _sign = num * denom < 0? -1 : 1; // az előjelet megfelelően állítjuk be _numerator = abs(num); // csak az abszolút értékeket tároljuk _denominator = denom!= 0? abs(denom) : 1; // nem engedélyezzük a 0 hányadost } simplify(_numerator, _denominator); PPKE ITK, Bevezetés a programozásba II 3:16

Példa Megoldás: // racionális szám típusa: class Rational { private: // a mezők és a segédműveltek rejtettek int _sign; // az előjelet külön el kell mentenünk unsigned int _numerator; // csak az abszolút értéket tároljuk el unsigned int _denominator; void simplify(unsigned int& a, unsigned int& b); // egyszerűsítés PPKE ITK, Bevezetés a programozásba II 3:17

Példa Megoldás: void Rational::simplify(int& a, int& b) { int c = a, d = b; // euklideszi algoritmus futtatása while (c!= d) { if (c > d) c -= d; else d -= c; } a /= c; b /= d; } PPKE ITK, Bevezetés a programozásba II 3:18

Barát műveletek Néha kényelmetlen, hogy a típushoz tartozó külső metódusok (pl. operátorok) nem láthatják a rejtett mezőket, holott igazából nem a külvilághoz tartoznak A típusban lehetőségünk van megadni barát (friend) műveletek halmazát, vagyis olyan külső műveleteket, amelyek láthatják a rejtett értékeket is a műveletek szintaxisát a típusban kell leírni a friend kulcsszó mellett (ez nem számít deklarációnak, csak egy jelzésnek) az azonos szintaxissal létrehozott külső műveletek láthatják a rejtett értékeket PPKE ITK, Bevezetés a programozásba II 3:19

Barát műveletek Pl.: struct MyType { private: int _value; // rejtett érték friend void AddValue(MyType, int); // barát művelet jelzése }; void AddValue(MyType m, int v){ // barát művelet definíciója m._value += v; // módosíthatjuk a rejtett értéket } PPKE ITK, Bevezetés a programozásba II 3:20

Példa Feladat: Valósítsuk meg a téglalapok típusát úgy, hogy a kiíró operátorokat barát műveletként illesztjük. Megoldás: class Rational { friend istream& operator>>(istream& s, Rectangle& rec); // barát műveletek friend ostream& operator<<(ostream& s, Rectangle rec); PPKE ITK, Bevezetés a programozásba II 3:21

Példa Megoldás: istream& operator>>(istream& s, Rectangle& rec) { // beolvasó operátor double w, h; s >> w >> h; rec._width = w < 0? 0 : w; // közvetlenül elérhetjük a mezőket, mivel // barát műveletben vagyunk rec._height = h < 0? 0 : h; } return s; PPKE ITK, Bevezetés a programozásba II 3:22

Konstansok A programjainkban sokszor használunk konstansokat, de ezek rendszerint név nélküli konstansok, amikre pusztán az értékük segítségével hivatkozunk Elnevezett konstansokat a const kulcsszóval tudunk létrehozni, ekkor a névhez rögzített értéket rendelhetünk, amely a későbbiekben nem változtatható, pl.: const double pi = 3.14159265358979323846; Lehetőségünk van konstansokat változónak, illetve változót konstansnak értékül adni, pl.: int u; u = 5; const int v = u; // v megkapja u értékét, azaz 5-t int w = v; w++; // w már változó PPKE ITK, Bevezetés a programozásba II 3:23

Konstansok Konstansokat alprogramoknál a paraméterátadásban, vagy a visszatérési értékben is használhatunk konstans paraméter esetén nem módosíthatjuk a paraméterben kapott értéket konstans visszatérési érték esetén az érték nem módosítható pl.: const int SomeFunction(const float param){ } Természetesen a saját típusainkból is létrehozhatunk konstansokat, pl.: const MyType m; a konstruktor művelet beállítja a kezdőértékeket, de ezt követően nem módosíthatunk semmin PPKE ITK, Bevezetés a programozásba II 3:24

Konstans referenciák Nem csupán egyszerű konstansokat, de konstans referenciákat is létrehozhatunk pl.: MyType m; // változó const MyType& n = m; // konstans referencia ekkor nem jön létre új, de nem módosíthatunk az értékeken a későbbiek során a referencián keresztül (a változón keresztül igen) ha paraméterátadásban használjuk, akkor elérjük, hogy csak bemenő irányú legyen a paraméter, ugyanakkor ne másolódjon a memóriában, ami hatékonyabb, ugyanakkor biztonságos programműködést tesz lehetővé PPKE ITK, Bevezetés a programozásba II 3:25

Konstans metódusok Amennyiben egy típuspéldányt konstansnak (vagy konstans referenciának) veszünk, csak olyan metódusai futtathatóak, amelyek nem módosítják az objektum attribútumait, ezeket nevezzük konstans metódusoknak konstans metódusban nem módosíthatóak a mezők (ezt fordítási időben ellenőrzi) a kódban a const kulcsszóval jelöljük a metódust: class <típusnév>{ <típus> <metódusnév>(<paraméterek>) const { <nem módosító műveletek> } }; PPKE ITK, Bevezetés a programozásba II 3:26

Konstans metódusok Pl.: class MyType { private: int _value; public: int getvalue() const { // konstans művelet return _value; } // nem módosít semmilyen értéket void setvalue(int v) { } }; const MyType mt; // konstans objektum cout << mt.getvalue(); // megengedett mt.setvalue(10); // hiba, nem konstans művelet PPKE ITK, Bevezetés a programozásba II 3:27

Strukturált programozás A procedurális programozásban felülről lefelé tervezést követünk a feladatot részfeladatokra bontjuk, ahhoz megoldó alprogramokat rendelünk az adatok lehetnek globálisak, vagy lokálisak hátránya, hogy: a feladat módosítása könnyen újratervezést, illetve jelentős módosításokat igényel ha az adatok felépítése változik, minden pontban változtatnunk kell a használatukon a programrészek csak kis mértékben hordozhatóak PPKE ITK, Bevezetés a programozásba II 3:28

Strukturált programozás Strukturált programokban a program felépítését alulról felfelé tervezéssel végezzük, azaz azonosítjuk a feladatban részt vevő (összetett) entitásokat (változókat, konstansokat), és azok együttműködésével oldjuk meg a feladatot az entitásokat adattípusok segítségével képezzük, majd azokból hozzuk létre a példányokat az adattípusok megvalósításához korlátozzuk a hozzáférést, így a belső módosítások nem befolyásolják a felhasználást módját előnye, hogy a feladat módosítása nem befolyásolja a program szerkezetét, a programegységek pedig könnyebben hordozhatóak PPKE ITK, Bevezetés a programozásba II 3:29

Példa Feladat: Készítsünk grafikus felületű alkalmazást, amely a képernyő közepére kirajzol egy téglalapot, amelynek színét kattintással tudjuk változtatni. ha a procedurális megközelítést választjuk: a feladat egy téglalap kirajzolása (alprogrammal), a színek (lokális változók) változtatása ha a strukturált megközelítést választjuk: meg kell valósítanunk a téglalap típusát, ami a képernyő egy adott pontjába kirajzolható tárolja a pozícióját, méreteit, színét a színt akár külön típusként is megvalósíthatjuk PPKE ITK, Bevezetés a programozásba II 3:30

Példa Feladat: Készítsünk grafikus felületű alkalmazást, amelyben a képernyő tetszőleges pontján el tudunk helyezni egy új téglalapot (bal kattintással), majd annak színét tudjuk módosítani (jobb kattintással), amelyiket elhelyezkedik az egér. ha a procedurális megközelítést választjuk, akkor: az előző megoldást teljesen át kell dolgoznunk be kell vezetni a pozíció kezelést, tárolást, keresést ha a strukturált megközelítést választjuk, akkor: könnyen kiegészíthetjük a téglalap típusát egy tartalmazási művelettel, és minden más adott egy téglalap helyett több téglalapot kezelünk PPKE ITK, Bevezetés a programozásba II 3:31