Programozási Paradigmák és Technikák

Hasonló dokumentumok
Vizuális és eseményvezérelt programozás , II. félév BMF NIK

Objektumorientált Programozás VI.

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

és az instanceof operátor

Objektumorientált programozás C# nyelven

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

JAVA PROGRAMOZÁS 2.ELŐADÁS

Java felhasználói felület

Osztályok. 4. gyakorlat

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

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

Öröklés és Polimorfizmus

Objektumorientált programozás C# nyelven

C#, OOP. Osztályok tervezése C#-ban

Java és web programozás

BME MOGI Gépészeti informatika 4.

Már megismert fogalmak áttekintése

Programozási nyelvek Java

Java és web programozás

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

GenerikusOsztály<objektumtípus> objektum = new GenerikusOsztály<objektumtípus>();

3. Osztályok II. Programozás II

BME MOGI Gépészeti informatika 7.

Programozás II. labor

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Alprogramok, paraméterátadás

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

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

BME MOGI Gépészeti informatika 6.

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?

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

Programozási nyelvek Java

A C# programozási nyelv alapjai

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

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

Programozás C és C++ -ban

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

Programozás BMEKOKAA146. Dr. Bécsi Tamás 1. Előadás

Eseménykezelés. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor.

OOP és UML Áttekintés

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

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

OOP #14 (referencia-elv)

Unit Teszt. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Unit Teszt / 22

Események C#-ban Krizsán Zoltán iit

A függvények névvel rendelkező utasításcsoportok, melyeknek információkat adhatunk át, és van egy visszatérési értékük.

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

Java és web programozás

Programozási nyelvek Java

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

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

Objektumorientált Programozás VI.

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.

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

Java-ról Kotlinra. Ekler Péter AutSoft BME AUT. AutSoft

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

Szoftvertechnolo gia gyakorlat

ESEMÉNY VEZÉRELT ALKALMAZÁSOK FEJLESZTÉSE I. Bevezetés. Készítette: Gregorics Tibor

Programozás I. Matematikai lehetőségek Műveletek tömbökkel Egyszerű programozási tételek & gyakorlás V 1.0 OE-NIK,

// keressük meg a legnagyobb faktoriális értéket, ami kisebb, // mint százmillió

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

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

Fordított és szkript nyelvek összehasonlító elemzése. Sergyán Szabolcs

Vizuális, eseményvezérelt programozás XI.

Programozás III A JAVA TECHNOLÓGIA LÉNYEGE. Többlépcsős fordítás JAVA PLATFORM. Platformfüggetlenség

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

Access adatbázis elérése OLE DB-n keresztül

Eseménykezelés - Lottó játék

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

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás

hiányzott szeptemberben vagy A tanuló nem hiányzott szeptemberben szöveget

Szoftvertechnológia alapjai Java előadások

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

C# Zero.4 Introducing Visual C# 2.0

Java II. I A Java programozási nyelv alapelemei

Web-technológia PHP-vel

Pénzügyi algoritmusok

Java Programozás 11. Ea: MVC modell

Java és web programozás

Objektum Orientált Programozás VII.

Programozás II. labor

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

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

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

Programozás I. Első ZH segédlet

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

Programozás I. Szöveges fájlok kezelése Felsorolástípus Objektumtömb Gyakorló feladatok

Bevezetés a Python programozási nyelvbe

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

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

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

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

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

Sorosítás (szerializáció) és helyreállítás. 1. Bináris sorosítás és helyreállítás Szükséges névterek Attribútumok. 1.3.

1. Egyszerű (primitív) típusok. 2. Referencia típusok

Programozás BMEKOKAA146. Dr. Bécsi Tamás 10. Előadá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:

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

Delegátumok C#-ban Krizsán Zoltán iit

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

Átírás:

Programozási Paradigmák és Technikák Eseménykezelés Névtelen metódusok (anonymous methods) V 1.0 OE-NIK HP 1

Eseménykezelés A prezentációban eseményt kiváltó és eseményt feldolgozó osztályról beszélünk, de eseménykezelés lehetséges akár egyetlen osztályon belül is Cél: esemény bekövetkezésének jelzése más modul/osztály részére Módszerek: Függvénymutató átadása (DOS), Delegate-ek használata (C#), Interfészek használata (JAVA) V 1.0 OE-NIK HP 2

Interface-ek használata eseménykezeléshez Adott egy eseményt leíró IValami interface, ami rögzíti az esemény leírásához szükséges adatokat és az előírt metódusnevet Egy osztály (eseményt kiváltó/küldő osztály) egy listát tart karban, amelyben IValami típusú referenciákat tárol Publikus eljárások segítségével egy másik osztálynak (eseményt lekezelő osztály) lehetősége van ezen listához példányt hozzáadni, illetve törölni (feliratkozni / leiratkozni) A listához hozzáadott példány IValami típusú van benne egy Valami() nevű metódus, ami az eseményt lekezelő osztály kívánságainak megfelelően lekezeli az eseményt Az eseményt kiváltó osztály egyszerűen végigmegy a listában szereplő (eseményre feliratkozott) IValami példányokon, és mindegyiknek meghívja a Valami() nevű metódusát V 1.0 OE-NIK HP 3

Delegate Egy típus, amelybe metódusokat tudunk belerakni A deklarációnál meg kell kötni, hogy milyen szignatúrájú metódust tud tárolni az adott delegate: delegate double MyDelegate(int param1, string param2); Név: MyDelegate Visszatérési típus: double Paraméterek: 2 db, int+string Fontos: ez még csak egy típusdeklaráció Változó nélkül nem használható Referenciatípus Metóduson belül nem deklarálható Osztályon belül és kívül is deklarálható V 1.0 OE-NIK HP 4

Delegate használata delegate double MyDelegate(int param1, string param2); double funct(int elso, string masodik) return elso + masodik.length; Más metóduson belül: MyDelegate del; del = new MyDelegate(funct); Console.WriteLine(del(5, "hello")); V 1.0 OE-NIK HP 5

Delegate használata delegate double MyDelegate(int param1, string param2); double funct(int elso, string masodik) return elso + masodik.length; Osztály deklarációs részében (metódusokon kívül): MyDelegate del; Más metóduson belül: del += funct; Console.WriteLine(del(5, "hello")); Amíg nem rakunk a delegate-be metódust, az értéke NULL hívás előtt ellenőrizni kell! Lehetséges több metódust belerakni egy delegate-be V 1.0 OE-NIK HP 6

Delegate-paraméter delegate bool Összehasonlító(object bal, object jobb); class EgyszerűCserésRendező public static void Rendez(object[] Tömb, Összehasonlító nagyobb) for (int i = 0; i < Tömb.Length; i++) for (int j = i + 1; j < Tömb.Length; j++) if (nagyobb(tömb[j], Tömb[i])) object ideiglenes = Tömb[i]; Tömb[i] = Tömb[j]; Tömb[j] = ideiglenes; V 1.0 OE-NIK HP 7

Delegate-paraméter példaosztály class diak public string nev; public int kreditek; public diak(string ujnev, int ujkreditek) nev = ujnev; kreditek = ujkreditek; public override string ToString() diak[] csoport = new diak[] new diak("első Egon", 52), return nev + " - " + kreditek; new diak("második Miksa", 97), new diak("harmadik Huba", 10), new diak("negyedik Néró", 89), new diak("ötödik Ödön", 69) ; V 1.0 OE-NIK HP 8

Delegate-paraméter kód bool mycomp(object elso, object masodik) return ((elso as diak).kreditek < (masodik as diak).kreditek); Összehasonlító del = new Összehasonlító(mycomp); EgyszerűCserésRendező.Rendez(csoport, del); VAGY EgyszerűCserésRendező.Rendez(csoport, mycomp); V 1.0 OE-NIK HP 9

Eseménykezelés Eddig: tudunk egy osztályon belül delegate-et deklarálni, és használni Cél: osztályok közötti átjárhatóság funkcionalitás szempontjából a delegate erre jó, a delegate típusnál csak a metódus szignatúrája számít, az azt tartalmazó osztály nem Gyakorlatilag az eseményt kiváltó osztályban egy publikus delegate típusú változó kell Az event kulcsszót használjuk annak jelzésére, hogy ez egy esemény lesz Szerepelhet interface-ben (sima delegate változó nem) Meghívni csak a tartalmazó osztályból lehet (sima publikus delegate-et bárhonnan) Kötött szignatúra: void visszatérési típus, Sender + EventArgs paraméter V 1.0 OE-NIK HP 10

Eseménykezelés Az eseményt lekezelő osztályból rakunk bele egy metódust az eseményt kiváltó osztály delegate-jébe (csak += és -= operátorok!) Vagyis, ha meghívjuk a delegate-et a külső metódust hívjuk meg Fontos: Az eseményt kiváltó osztályban az esemény-delegate meghívásakor nem tudjuk, hogy a delegate tartalmaz-e metódust (vagyis: nem tudjuk, hogy rendeltek-e eseménykezelőt az eseményhez) Ezért a delegate meghívása előtt mindig figyelni kell a NULL értéket Lehetőség van egy eseményhez több eseménykezelőt is rendelni, bár ez a Visual Studio tervező nézetében nem megoldott V 1.0 OE-NIK HP 11

Eseménykezelés Névkonvenciók Feladat Név Elhelyezés Eseményparaméter ValamiEventArgs A névtérben vagy a kiváltó osztályban Delegate ValamiEventHandler A névtérben vagy a kiváltó osztályban Esemény Valami Kiváltó osztályban Eseményt közvetlenül meghívó metódus OnValami Kiváltó osztályban Esemény lekezelése --- Lekezelő osztályban V 1.0 OE-NIK HP 12

Eseménykezelés feladat Hozzunk létre egy egyszerű demonstrációs alkalmazást, amivel form-példányok tudnak egymással kommunikálni A kommunikációra használjunk egy közös statikus osztályt (ChatServer), amely eseményeken keresztül értesíti a formpéldányokat a beérkezett üzenetekről Oldjuk meg a feladatot interface-ek és delegate használatával is! V 1.0 OE-NIK HP 13

Eseménykezelés feladat Hozzunk létre Windows Forms alkalmazást, benne a korábban említett Diák Név, Kreditek osztállyal Legyen lehetőségünk diákok felvitelére, a felvitt diákok jelenjenek meg egy ListBox vezérlőben Az egyes diákoknak gomb segítségével tudjuk növelni a kreditszámát A diák osztályban következzen be a PrímaDiák esemény, ha a kreditszám-változás után a kreditek száma prímszám Az esemény küldője a kiváltó példány legyen, eseményparaméterként küldjük el az aktuális időt A Form osztályban iratkozzunk fel az eseményre, és a prímdiákokról vezessünk egy külön listát V 1.0 OE-NIK HP 14

Programozási Paradigmák és Technikák Eseménykezelés Névtelen metódusok (anonymous methods) V 1.0 OE-NIK HP 15

Névtelen metódusok Angolul: anonymous methods Célok: Kód lerövidítése, olvashatóbbá tétele Apró, levegőben lógó metódusok és eseménykezelők számának csökkentése A metódussal való paraméterezés megkönnyítése, rövidítése Ezáltal a létrehozott osztályok általánosságának növelése (az osztály működése is módosíthatóvá válik azáltal, hogy metódusokat adhatunk meg paraméterül) V 1.0 OE-NIK HP 16

Gyakori példa: dinamikus vezérlők létrehozásánál for (int x = 0; x < 5; x++) for (int y = 0; y < 5; y++) Button uj = new Button(); uj.top = y * 50; uj.left = x * 50; uj.width = uj.height = 40; uj.text = x + ";" + y; Controls.Add(uj); uj.click += new EventHandler(uj_Click); // Cél: Mindegyik gombra fusson le egy eseménykezelő V 1.0 OE-NIK HP 17

Eseménykezelő írásának problémái Tipikusan: egy nagyobb programhoz több saját vezérlő, mindegyikben több saját osztály, több egyedi esemény van Probléma: Az események lekezelésekor minden eseménykezelő egy külön metódus, amik sokszor nagyon egyszerűek. Egy nagy programban rengeteg 1-2-3 soros metódus kerül, ráadásul az eseménykezelő hozzárendelése (a += operátoros sor) és az eseménykezelő kódja távol kerül egymástól külön deklarált metódusok helyett úgynevezett névtelen metódusokat használunk anonymous methods Lényegük: a metódust nem deklaráljuk külön (ezért névtelen: nincs névvel deklarálva, csak kóddal), így egyszerűen megmondjuk, hogy ha bekövetkezik az esemény, akkor tedd EZT V 1.0 OE-NIK HP 18

Gyakori példa: dinamikus vezérlők létrehozásánál Button uj = new Button(); uj.top = y * 50; uj.left = x * 50; uj.width = uj.height = 40; uj.text = x + ";" + y; Controls.Add(uj); uj.click += delegate MessageBox.Show("CLICKED"); ; Záró pontosvessző!!! V 1.0 OE-NIK HP 19

Gyakori példa: dinamikus vezérlők létrehozásánál Button uj = new Button(); uj.top = y * 50; uj.left = x * 50; uj.width = uj.height = 40; uj.text = x + ";" + y; Controls.Add(uj); uj.click += delegate(object kuldo, EventArgs esemenypar) ; MessageBox.Show((kuldo as Button).Text); V 1.0 OE-NIK HP 20

Névtelen metódusok Előny: könnyebben olvasható kód (egyesek szerint ) Csak az egyszer használatos, és lehetőleg rövid eseménykezelőt írjuk így meg: a hosszú kód olvashatatlan, és mivel beágyazott kód, ezért nem újrafelhasználható Lehetőleg ne ágyazzunk egymásba névtelen metódusokat Használatukkal lehetőség van leegyszerűsíteni a korábban delegate-paraméterek használatát is V 1.0 OE-NIK HP 21

Delegate-paraméter delegate bool Összehasonlító(object bal, object jobb); class EgyszerűCserésRendező public static void Rendez(object[] Tömb, Összehasonlító nagyobb) for (int i = 0; i < Tömb.Length; i++) for (int j = i + 1; j < Tömb.Length; j++) if (nagyobb(tömb[j], Tömb[i])) object ideiglenes = Tömb[i]; Tömb[i] = Tömb[j]; Tömb[j] = ideiglenes; V 1.0 OE-NIK HP 22

Delegate-paraméter példaosztály class diak public string nev; public int kreditek; public diak(string ujnev, int ujkreditek) nev = ujnev; kreditek = ujkreditek; public override string ToString() diak[] csoport = new diak[] new diak("első Egon", 52), return nev + " - " + kreditek; new diak("második Miksa", 95), new diak("harmadik Huba", 10), new diak("negyedik Néró", 84), new diak("ötödik Ödön", 69) ; V 1.0 OE-NIK HP 23

Delegate-paraméter példa EgyszerűCserésRendező.Rendez(csoport, delegate(object elso, object masodik) ); return (elso as diak).nev. CompareTo((masodik as diak).nev) < 0; EgyszerűCserésRendező.Rendez(csoport, delegate(object elso, object masodik) ); return (elso as diak).kreditek < (masodik as diak).kreditek; V 1.0 OE-NIK HP 24

Programozási Paradigmák és Technikák Eseménykezelés ismétlés Névtelen metódusok (anonymous methods) V 1.0 OE-NIK HP 25

Források Events tutorial: http://msdn.microsoft.com/en-us/library/aa645739(v=vs.71).aspx Event modifier: http://msdn.microsoft.com/en-us/library/8627sbea(vs.71).aspx Anonymous methods: http://msdn.microsoft.com/en-us/magazine/cc163970.aspx Anonymous methods: http://msdn.microsoft.com/en-us/library/0yw3tz5k.aspx Anonymous methods: http://www.csharp-station.com/tutorials/lesson21.aspx Anonymous methods: http://stackoverflow.com/questions/1116678/c-delegate-definitionanonymous-methods-vs-formally-defined-methods Delegate, Anonymous, Event: Reiter István: C# jegyzet (http://devportal.hu/content/csharpjegyzet.aspx), 164-172. oldal V 1.0 OE-NIK HP 26

V 1.0 OE-NIK HP 27

OE-NIK HP 28