Objektumleírók Konstantinusz Kft 2010

Hasonló dokumentumok
Függőség injekció Konstantinusz Kft 2010

Osztályok. 4. gyakorlat

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

BME MOGI Gépészeti informatika 8.

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

Programozási nyelvek Java

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

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

C++ programozási nyelv

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

JAVA PROGRAMOZÁS 3.ELŐADÁS

Java és web programozás

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

Szoftvertechnolo gia gyakorlat

Programozási nyelvek Java

é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

A C++ öröklés. (Előfeltétel: 12. tétel ismerete)

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

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

JAVA PROGRAMOZÁS 2.ELŐADÁS

Programozási nyelvek Java

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

Programozás III KIINDULÁS. Különböző sportoló típusok vannak: futó, magasugró, focista, akik teljesítményét más-más módon határozzuk meg.

Programozási nyelvek II. JAVA

Java Programozás 1. Gy: Java alapok. Ismétlés ++

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

C++ programozási nyelv Konstruktorok-destruktorok

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

Objektumorientált programozás C# nyelven

Programozási nyelvek II. JAVA

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

Programozási nyelvek 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álytervezés és implementációs ajánlások

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

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Java és web programozás

C# osztályok. Krizsán Zoltán

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

Osztály és objektum fogalma

Programozás II. labor

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

C++ programozási nyelv

OOP: Java 8.Gy: Gyakorlás

ELTE SAP Excellence Center Oktatóanyag 1

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

III. OOP (objektumok, osztályok)

Programozási alapismeretek 4.

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

OOP #14 (referencia-elv)

Bevezetés a Python programozási nyelvbe

Objektum orientált kiterjesztés A+ programozási nyelvhez

Web-technológia PHP-vel

3. Osztályok II. Programozás II

ZH mintapélda. Feladat. Felület

4. Gy: JAVA osztályok

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 2.ELŐADÁS. Objektumorientált programozás

Programozási nyelvek II.: JAVA

.Net adatstruktúrák. Készítette: Major Péter

Programozási Paradigmák és Technikák

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

Bánsághi Anna

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

Öröklés és Polimorfizmus

Interfészek. PPT 2007/2008 tavasz.

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

Objektum Orientált Programozás. 5. JAVA osztályok 21/1B IT MAN

OOP: Java 4.Gy: Java osztályok

#include <iostream> using namespace std; // struct macska is lehetne class macska { public: int kor; int suly; }; void main() { macska cirmi;

OBJEKTUMORIENTÁLT TERVEZÉS ESETTANULMÁNYOK. 2.1 A feladat

Programozás C++ -ban 2007/4

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

OOP. Alapelvek Elek Tibor

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Programozás I. 5. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Java programozási nyelv 6. rész Java a gyakorlatban

Programozás II. ATM példa Dr. Iványi Péter

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

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

Objektumorientált paradigma és programfejlesztés Bevezető

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Smalltalk 3. Osztályok létrehozása. Készítette: Szabó Éva

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

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

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

Programozás C++ -ban

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

OEP Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1. Feladat. Elemzés 1

Az élet szép, környezetünk tele van fákkal, virágokkal, repdeső madarakkal, vidáman futkározó állatokkal.

GENERIKUS PROGRAMOZÁS Osztálysablonok, Általános felépítésű függvények, Függvénynevek túlterhelése és. Függvénysablonok

Abstract osztályok és interface-ek. 7-dik gyakorlat

Elemi Alkalmazások Fejlesztése II.

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

Programozás(A szakirány) II. beadandó feladat Farkas András HP6S15 1. csoport Veszprémi Anna / Hudoba Péter

BME MOGI Gépészeti informatika 4.

C++ programozási nyelv

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

Átírás:

Objektumleírók Konstantinusz Kft. 2010

1. Tartalomjegyzék 1. Tartalomjegyzék... 2 2. Mi az a leíró?... 2 3. Közvetett paraméter átadások... 4 4. Absztrakt metódusok, absztrakt konstrukció... 7 5. Validálás leíróval... 10 2. Mi az a leíró? Vegyünk egy egyszerű példát egy osztályra és annak a konstruktorára, egy C-szerű fiktív nyelven. class Szemely{ string nev,cim,telefon; public Szemely(string nev, string cim, string telefon){ this.nev=nev; this.cim=cim; this.telefon=telefon; Most pedig, ahelyett, hogy a konstruktor paramétereit külön-külön szerepeltetnénk, mint formális paramétereket, definiáljunk egy adattípust, ami ugyanazokat a mezőket tartalmazza, mint az adott metódus formális paraméterei. Ezt a struktúrát fogjuk leírónak nevezni. Ezek után a metódus nem a paramétereket kéri be egyenként, hanem egy leírót. 2/12

struct Szemely_leiro { string nev, cim, telefon; class Szemely{ string nev,cim,telefon; public Szemely(Szemely_leiro leiro){ this.nev=leiro.nev; this.cim=leiro.cim; this.telefon=leiro.telefon; Eddig látszólag nem történt semmi különös, szóval mégis mire jó ez? A továbbiakban nézzünk meg néhány specifikus esetet, amin keresztül megérthetjük ennek a módszernek a hasznát. 3/12

3. Közvetett paraméter átadások Tegyük fel, hogy a fent látott Szemely osztálynál kötelező kitölteni a nevet és a címet, és azt szeretnénk, hogy addig ne is lehessen létrehozni egy Szemely példányt, amíg a paraméterek nincsenek rendben. Ehhez mindenképp kell még a konstruktor előtt valamilyen ellenőrzés, más néven validálás, hiszen mire a konstruktorba írt kód lefut, addigra már késő, a példány létrejött. Tehát kell egy osztálymetódus, ami bekéri ugyanazokat a paramétereket, mint a konstruktor, leellenőrzi őket, és a minden rendben, akkor példányosítja az objektumot, és visszaadja a példányt. Az ilyen metódusokat hívják factory metódusnak, mivel objektumok gyártását végzik. Most lássuk először a hagyományos paraméterezéssel. class Szemely{ string nev,cim,telefon; public static bool validalas(string nev, string cim, string telefon){ if (nev== or cim== ) return false; return true; public static Szemely letrehoz(string nev, string cim, string telefon){ if (!validalas(nev, cim, telefon)) return null; return new Szemely(nev, cim, telefon); protected Szemely(string nev, string cim, string telefon){ this.nev=nev; this.cim=cim; this.telefon=telefon; 4/12

Itt a konstruktor nem publikus, tehát kívülről nem konstruálható közvetlenül ez az osztály, muszáj a letrehoz() metódust használni. Viszont itt máris látható egy kellemetlenség. A nev, cim, telefon paramétereket a letrehoz() metódus, illetve a validalas() metódus formális paraméter listájában is szerepeltetni kell, és át is kell adni őket, egymásnak és a konstruktornak. Ez a helyzet problémás redundanciákat okozhat. Ötször kell leírnom ugyanazt a paraméter listát. Ez fölösleges, és ráadásul amikor egyik metódus átadja a másiknak, akkor még a jó sorrendre is figyelni kell, nehogy összekeveredjenek. Gondoljuk el, mi lenne, ha a paraméterlistát változtatni kell, vagyis bővíteni, és/vagy kivenni belőle dolgokat. Ekkor még jobb esetben is öt helyen kell átírni, és nem elrontani a sorrendeket. Ebben a helyzetben már sokkal vonzóbbnak tűnik a leírós megoldás: class Szemely{ string nev,cim,telefon; public static bool validalas(szemely_leiro leiro){ if (leiro.nev== or leiro.cim== ) return false; return true; public static Szemely letrehoz(szemely_leiro leiro){ if (!validalas(leiro)) return null; return new Szemely(leiro); protected Szemely(Szemely_leiro leiro){ this.nev=leiro.nev; this.cim=leiro.cim; this.telefon=leiro.telefon; 5/12

Figyeljük meg, mennyivel szebb és egyszerűbb lett a kód. Itt már ha változtatni akarok a paraméter listán, akkor nem kell számtalan helyen átírnom, és nem kell a paramétereket egyesével átadogatni a metódusok között. Ha lenne egy tucat mezője a leírónak, a legtöbb helyen akkor is csak a leírót adom át, így teljesen átlátható marad a kód. Általánosságban tehát azt mondhatjuk, hogy a leírók paraméter listákat fognak össze egy csomagba, ezzel a csomag könnyen hordozhatóvá válik, ráadásul a metódusok, amik között átadogatjuk, nem is kell hogy ismerjék a tartalmát. Figyeljük meg, hogy a letrehoz() metódus semmit nem kell hogy foglalkozzon a leíró tartalmával, nem kell tudnia róla hogy mi van benne, csak közvetítenie kell a validalas() metódus és a konstruktor között. A leíróknak ez a tulajdonsága pedig egészen új, érdekes lehetőségeket nyit meg előttünk. 6/12

4. Absztrakt metódusok, absztrakt konstrukció Leírók kapóra jönnek amikor az ember absztrakt osztályokkal, és erős polimorfizmussal dolgozik. Előfordulnak olyan helyzetek, amikor olyan kódot kell írni, ami paraméterként kapott ismeretlen szerkezetű információk alapján ismeretlen osztályú absztrakt objektumok metódusait kell hogy használja. Absztrakt metódus interfésze (formális paraméterlista, stb.) az azt implementáló alosztályokban ugyanaz kell hogy maradjon. Viszont előfordulhat, hogy alosztályonként más kellene hogy legyen ennek a metódusnak a paraméter listája. Ez főleg akkor történhet meg, ha ez a metódus valamilyen másik osztályt példányosít, aminek a konstruktorához szükséges információt ő maga is paraméterként kéri be. Ekkor a különböző implementációk más paraméterlistát igényelhetnének, mivel más fajta objektumokat akarnak konstruálni. Ez hagyományos módon nem lehetséges, már eleve azért sem, mert ez nyelvi szinten ellentmondásos lenne. De szerencsére leírók használatával van egy kiskapunk. Most nézzünk erre a szituációra egy példát. Lesz egy műhelyünk ami mindenféle típusú autókat szerel össze, majd végül leteszteli a motort, a féket, és kifesti a megadott színre. A trükk az, hogy a különféle autótípusok összeszerelése egyedi módon történik, egyedi alkatrészekből. Ezért, hogy ne a műhelynek kelljen tudnia, hogy hogyan kell minden egyes típust összeszerelni, autószerelők vannak, akik értenek egy-egy típus összeszereléséhez. Így a műhely csak megkapja egy nagy konténerben az alkatrészeket, amikről nem is kell tudnia semmit, átadja a megfelelő szerelőnek, az összeszereli, a műhely pedig elvégzi a teszteket, és az utómunkát. abstract class Auto_leiro{ abstract class Auto{ Szin szin; void motorteszt(){ //motor tesztelési kódja.. void fekteszt(){ //fék tesztelési kódja.. 7/12

void kifest(szin szin){ this.szin=szin; abstract class AutoSzerelo{ abstract Auto osszeszerel(auto_leiro alkatreszek); class Muhely{ public Auto autoosszeszerel(autoszerelo szerelo, Auto_leiro alkatreszek, Szin szin) { Auto auto; auto=szerelo.osszeszerel(alkatreszek); auto.motorteszt(); auto.fekteszt(); auto.kifest(szin); return Auto; Ebben az esetben annyival tovább léptünk, hogy már leíró is egy objektum, nem csak egy sima adatszerkezet. Így neki is lehetnek alosztályai, absztrakt tagjai stb. Láthatjuk hogy az autót, és az autószerelőt is egy absztrakt osztály képviseli, amiből majd a konkrét autó típusok, és a hozzájuk tartozó szakértő szerelők fognak származni. Az AutoSzerelo osztály ebben az esetben egy úgynevezett factory szerepét tölti be, vagyis egy olyan objektum, ami más osztályok 8/12

példányosítását végzi. Ebben az esetben az AutoSzerelo osztály osszeszerel metódusa ugyanaztteszi, mint korábban a Szemely osztály letrehoz() metódusa. Ide is ugyanúgy lehetne validálást is beépíteni, mint ahogy azt fent láttuk. A lényeg, hogy minden AutoSzerelo alosztály ebben a metódusban példányosítja a megfelelő osztályú autót, és az ehhez szükséges információt egy leírón keresztül kapja, amit akár egyenesen tovább is adhat az autó konstruktorának anélkül hogy kibontaná, hiszen az autó konstruktora is működhet leíróval. Így végül, mint láthatjuk, a Muhely autoosszeszerel() metódusa teljesen vakon tud autókat gyártani, anélkül hogy tudná, hogy mit gyárt és miből. Ezt hívjuk absztrakt konstrukciónak. Ezek a helyzetek leginkább akkor fordulnak elő, ha valamilyen plugin-ezhető rendszert kell készíteni. Például ebben az esetben a különböző autó típusok, az alkatrészeik, és a szerelőik működhetnének plugin-ként. 9/12

5. Validálás leíróval Végül jöjjön a leíróknak egy érdekes alkalmazása. Láttuk korábban, hogy objektumok konstruálása valamilyen ellenőrzésen megy át először, ezért használunk validáló metódusokat, amik vagy az adott osztály statikus metódusai, vagy egy factory példány metódusai. Viszont, ha az ember leírót használ, akkor a validálást fel lehet fogni úgy is, hogy egy adott paraméter listáról szeretném eldönteni,hogy valid-e vagy sem. Ha pedig valid, akkor fel lehet használni. Ebben az elgondolásban úgy tűnik mintha a validálás, illetve validitás magához a paraméter listához kötődne. Márpedig ha a leíró egy paraméter listát testesít meg, akkor ezek a leírónak a tulajdonságai, illetve viselkedése, vagyis a leíró validálja önmagát. Konkrétabban fogalmazva, a korábban látott validáló metódusok átköltözhetnek a leíróba, persze feltéve, hogy a leíró egy objektum. Nézzük meg, hogyan változik ezzel a Szemely és Szemely_leiro példakódunk: class Szemely_leiro { string nev, cim, telefon; bool valid=false; Szemely_leiro(string nev, string cim, string telefon){ this.nev=nev; this.cim=cim; this.telefon=telefon; bool validalas(){ //ha már validak vagyunk akkor nem kell újra ellenőrzés if (this.valid) return true; if (this.nev== or this.cim== ) return false; 10/12

//beállítjuk a leíró állapotát validra this.valid=true; return true; class Szemely{ string nev,cim,telefon; public static Szemely letrehoz(szemely_leiro leiro){ //itt már a leírótól kérdezzük meg, hogy valid-e if (!leiro->validalas()) return null; return new Szemely(leiro); protected Szemely(Szemely_leiro leiro){ this.nev=leiro.nev; this.cim=leiro.cim; this.telefon=leiro.telefon;; Ezt a fajta leírót akár előre be is validálhatom, és amikor átadom a letrehoz() metódusnak, akkor a validálási folyamat nem fog még egyszer lefutni. 11/12

Leírókkal ennél messzebbre is lehet menni. Például lehet beépíteni automatikus validálásokat olyan dolgokra, amiket gyakran kell vizsgálni (string üres-e, számmá konvertálható-e, stb). Lehet alapértelmezett értékek incializálását is végezni, lehet automatikus hibaüzeneteket generálni. Mindenképp érdemes élni ezzel a módszerrel, ha mást nem akkor csak a kód egyszerűsítése céljából. 12/12