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

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

Osztály tervezési szempontok és C++ implementációs ajánlások

Osztálytervezés és C++ implementációs ajánlások I.

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

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

é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

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

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

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

OOP és UML Áttekintés

JAVA PROGRAMOZÁS 2.ELŐADÁS

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

Adatstruktúrák, algoritmusok, objektumok

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

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

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.

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

Java és web programozás

Már megismert fogalmak áttekintése

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

Objektumok inicializálása

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

Objektum orientált programozás Bevezetés

C++ programozási nyelv

Absztrakció. Objektum orientált programozás Bevezetés. Általános Informatikai Tanszék Utolsó módosítás:

Java VII. Polimorfizmus a Java nyelvben

Java VII. Polimorfizmus a Java nyelvben

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.

Java és web programozás

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

Globális operátor overloading

Származtatási mechanizmus a C++ nyelvben

Objektumorientált paradigma és programfejlesztés Bevezető

Java III. I I. Osztálydefiníció (Bevezetés)

Java III. I I. Osztálydefiníció (Bevezetés)

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

C++ programozási nyelv Struktúrák a C++ nyelvben

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

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

OOP. Alapelvek Elek Tibor

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

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

Programozási alapismeretek 4.

Osztályok. 4. gyakorlat

C++ programozási nyelv Konstruktorok-destruktorok

Java IX. telkezelés a Java-ban

C++ programozási nyelv

Java IX. telkezelés a Java-ban

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

Programozási nyelvek Java

Interfészek. PPT 2007/2008 tavasz.

Programozás I. Első ZH segédlet

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

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

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

Osztály tervezési szempontok és C++ implementációs ajánlások

Objektumorientált programozás C# nyelven

Virtuális függvények (late binding)

Programozási nyelvek Java

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

BME MOGI Gépészeti informatika 8.

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

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

Objektumorientált paradigma és a programfejlesztés

Programozási nyelvek Java

Objektumorientált szoftverfejlesztés alapjai

Programozási nyelvek II.: JAVA

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

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?

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

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

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

Programozási nyelvek Java

Generikus Típusok, Kollekciók

OOP: Java 4.Gy: Java osztályok

OOP #14 (referencia-elv)

Osztály és objektum fogalma

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 #1 (Bevezetés) v :39:00. Eszterházy Károly Főiskola Információtechnológia tsz. Hernyák Zoltán adj.

Java és web programozás

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

Mi a különbség az extends és az implements között. Mikor melyiket kell használni? Comperable-t megvalósító oasztályokban össze lehet hasonlitani

Programozás módszertan p.1/46

Elemi Alkalmazások Fejlesztése II.

Programozás. Objektum Orientált Programozás (OOP) Alapfogalmak. Fodor Attila

ELTE SAP Excellence Center Oktatóanyag 1

Programozási nyelvek II.: JAVA, 11. gyakorlat

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

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

Öröklés és Polimorfizmus

Programozási technológia

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

Név: Neptun kód: Pontszám:

Bevezetés a programozásba előadás: Öröklődés

Szoftvertechnolo gia gyakorlat

Programozás III. - NGB_IN001_3

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

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

Átírás:

Osztálytervezés és implementációs ajánlások Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2006. 04. 24. Osztálytervezés és implementációs kérdések OTERV / 1

Osztály tervezés Egy nyelv szabályrendszere számos konstrukciót megenged A software fejlesztés során egy adott problémát kell megoldani Az objektum orientált program a valóság valamely részének a modellje Szükséges tanulmányozni, hogy adott cél elérése érdekében milyen nyelvi szerkezet(ek) használata a legcélszerűbb Osztálytervezés és implementációs kérdések OTERV / 2

Mi is az osztály? Programozás technikai szempontból típus. Programtervezési szempontból a modellezendő valóság valamely fogalmának modellje. A programokban kétféle osztályok lehetnek: közvetlenül az alkalmazási terület (application domain) fogalmait ábrázoló osztályok a programok elkészítéséhez szükséges osztályok Osztálytervezés és implementációs kérdések OTERV / 3

Mit ábrázolhatnak az osztályok? Alkalmazási terület osztályai: Felhasználói fogalmak (pl. teherauto) Felhasználói fogalmak általánosításai (pl. jármű) A megvalósítás osztályai: Hardware/software erőforrások (pl. memória, i/o) Más osztályok implementálásához szükséges osztályok (pl. listák, vermek stb.) Beépített adattípusok és vezérlési szerkezetek Osztálytervezés és implementációs kérdések OTERV / 4

Információ rejtés A jól tervezett osztály belső részleteinek ismerete szükségtelen a használatához Az osztály használata csak annak interface-e segítségével lehetséges. Egy objektum a külvilággal csak az interface-en keresztül képes kommunikálni. Osztálytervezés és implementációs kérdések OTERV / 5

Osztály interface fogalma A public metódusok összessége. Ezeket kell ismernie az osztály használójának. Használatukhoz nem szükséges ismerni az osztály implementációs részleteit. protected metódusok és adattagok. Kibővíti az interface-t a leszármazott osztályok számára Használata veszélyeket rejt magában, mert implementációs függést hoz létre az ős és a leszármazott osztály között Osztálytervezés és implementációs kérdések OTERV / 6

Osztály interface fogalma (folyt.) Technikai szempontból az interface részét képezik az esetleges public minősítésű adattagok is, de használatuk nem ajánlott. Ellentmond az információ rejtésnek. A tárgy keretein belül a a fenti "nem ajánlott" kifejezés jelentése: "tilos"! Osztálytervezés és implementációs kérdések OTERV / 7

A jó osztály interface Teljes minden funkciót tartalmaz, ami az osztálytól elvárható nem az adott alkalmazás szempontjai határozzák meg újrafelhasználható egységet alkot az osztály Osztálytervezés és implementációs kérdések OTERV / 8

A jó osztály interface (folyt.) Minimális nem tartalmaz a felhasználó számára érdektelen (esetleg veszélyes) elemeket belső felhasználású funkciók private vagy protected minősítésűek a belső áttervezés nincs rá hatással Osztálytervezés és implementációs kérdések OTERV / 9

A jó osztály interface (folyt.) Kezelhető méretű általában legfeljebb néhány tíz metódus A sok funkció között nagyobb valószínűséggel lesznek hasonlóak (félreértés veszélye!) A terjedelmes interface általában tervezési hibára utal: Az interface része belső funkció is Osztálytervezés és implementációs kérdések OTERV / 10

A jó osztály interface (folyt.) terjedelmes interface (folytatás) Az osztály határait nem jól állapítottuk meg, és túl sok feladatot akarunk rábízni. A helyes architektúra kialakítása érdekében az eredetileg tervezett osztályt több osztályra kell bontani, és ezek között leszármaztatással vagy más mechanizmussal megteremteni a kapcsolatot. Osztálytervezés és implementációs kérdések OTERV / 11

Az osztály interface részei Kezelő tagok és metódusok Konstruktorok, örökölt "kész" metódusok (pl. tosting, clone, stb) Sokszor nem is a programozó, hanem a program implicite hívja meg. Elérési függvények Az adattagok értékének elérésére vagy azok értékének módosítására. Munkavégző függvények Az osztály lényegi funkcióit aktivizáló függvények. Osztálytervezés és implementációs kérdések OTERV / 12

Osztályok közötti kapcsolatok Logikai szintű kapcsolatok általánosítás/pontosítás (is-a) tartalmazás (has-a) használat (use) Osztálytervezés és implementációs kérdések OTERV / 13

Az általánosítás/pontosítás implementálása Leszármaztatási mechanizmus (öröklődés) segítségével A leszármazott osztály objektuma egyben ős objektum is. Osztálytervezés és implementációs kérdések OTERV / 14

Példa: öröklődés public class Szemely { } public class Hallgato extends Szemely { } public class Proba { public void sortiszik(szemely sz ); public void feladatotbead(hallgato h); Osztálytervezés és implementációs kérdések OTERV / 15

Példa: öröklődés (folyt.) public static main(string args) { Hallgato nagypista = new Hallgato(); Szemely kispista = new Szemely(); SortIszik(kispista ); // OK //OK, mert egy Hallgato egyben Szemely is SortIszik(nagypista ); // Hibás, mert egy Szemely nem // biztos, hogy Hallgato is FeladatotBead( kispista ); } } Osztálytervezés és implementációs kérdések OTERV / 16

Példa: hibás öröklődés public class Madar { public Kaja miteszik(); public void Repul(); } public class Strucc extends Madar { } A Strucc örökli a repülés képességét a Madar osztálytól => hibás modell! Osztálytervezés és implementációs kérdések OTERV / 17

Példa: hibás öröklődés (folyt.) A hiba oka: a természetes nyelv pontatlansága. Mit jelent pontosan: "A madár tud repülni" "Minden madár tud repülni" "A madarak általában tudnak repülni" Nem a valóság viszonyait modelleztük. Osztálytervezés és implementációs kérdések OTERV / 18

Példa: hibás öröklődés javítása Egyik lehetséges javítás: public class Madar { public Kaja MitEszik(); public boolean TudRepulni(); } class Strucc extends Madar { } Csak a repülés lehetőségét örökli. Nem igazi, mert hibás példányok létrehozását teszi lehetővé. Osztálytervezés és implementációs kérdések OTERV / 19

Példa: hibás öröklődés javítása (folyt) public class Madar { public Kaja miteszik(); } public class GyalogMadar extends Madar { }; public class RendesMadar extends Madar { public void Repul(); } public class Strucc extends GyalogMadar {...}; class Sas extends RendesMadar{...}; Osztálytervezés és implementációs kérdések OTERV / 20

A tartalmazás implementálása Kétféle tartalmazás kapcsolat: aggregáció: a rész az egészhez tartozik, de önállóan is létező entitás kompozíció: a rész önmagában nem létezhet, csak valaminek a részeként Osztálytervezés és implementációs kérdések OTERV / 21

Tartalmazás: példa és UML jelölés Autó Ház Motor 1 4..5 Aggregáció Kerék 0..1 1..* Konyha Kompozíció Szoba Osztálytervezés és implementációs kérdések OTERV / 22

A tartalmazás implementálása: aggregáció A tag objektum referenciája a tartalmazó osztályban. Ez adattag, tehát általában private! Az egy - több kapcsolat (több "rész") megvalósítása különböző adatszerkezetekkel lehetséges (tömb, Vektor stb). A referenciák beállítása általában a befoglaló osztály konstruktorának feladata, már létező ("külső") objektumok referenciáinak felhasználásával. Osztálytervezés és implementációs kérdések OTERV / 23

Példa: aggregáció implementálása Példa: public class Motor {... } public class Kerek {... } public class Auto { private Motor motorja; private Kerek kerekek[] = new Kerek[4]; private Kerek potkerek; } Osztálytervezés és implementációs kérdések OTERV / 24

Tartalmazás implementálása: kompozíció Lehetséges megoldások: A tartalmazó osztályban osztálydefiníció a tartalmazott számára, private hozzáférési kategóriával A tartalmazó osztály konstruktorának vagy valamelyik metódusának a feladata a "rész" példányosítása. "Kívülről" nem is lehetséges, a private minősítés miatt. Osztálytervezés és implementációs kérdések OTERV / 25

Öröklődés vagy tartalmazás? Mindkét esetben egy objektum más objektumot tartalmaz. Az öröklődés esetén ez implicit módon történik. Technikai különbségek: A leszármazott objektum pontosan egy ősobjektumot tartalmaz. Tagobjektumok tetszőleges számú típussal, típusonként tetszőleges számmal definiálhatók. Osztálytervezés és implementációs kérdések OTERV / 26

Öröklődés vagy tartalmazás?? (folyt.) Különbségek tervezési szempontból Más logikai kapcsolatot fejeznek ki (is-a, has-a). Ha például az Auto osztályt a Motor osztály leszármazottjaként definiáljuk, akkor egy Auto objektumnak lesz egy Motor része, de nem igaz az, hogy az Auto egy (speciális) Motor. Az öröklés az interface újrafelhasználása: a leszármazott osztály interface-ének része lesz az ősosztály interface-e. Osztálytervezés és implementációs kérdések OTERV / 27

Öröklődés vagy tartalmazás?? (folyt.) Különbségek tervezési szempontból (folytatás) A private tag objektummal az osztályának a funkcióit használjuk fel a befoglaló osztály implementációjához. A tagosztály interface-e nem képezi részét a befoglaló osztály interface-ének. Osztálytervezés és implementációs kérdések OTERV / 28

Öröklődés vagy tartalmazás?? (folyt.) Különbségek tervezési szempontból (folytatás) A public tag objektummal a befoglaló osztály interface-ét kiegészítjük a tag objektumok osztályainak interface-eivel. Nem mindig szerencsés megoldás: Rontja a program áttekinthetőségét. Erős függőséget hoz létre az osztályok között. (Egy tagobjektum osztályának változása nem csak a befoglaló osztály módosítását jelenti, hanem a befoglaló objektum használati pontjainak módosítását is!) Osztálytervezés és implementációs kérdések OTERV / 29

Használat kapcsolat implementálása Fajtái: (CX és CY osztályok) CX használja a CY nevet (feltételezi, hogy CY hozzáférhető a használat helyén) adattag típusa metódus visszatérési értékének vagy paramétereinek típusa CX használja a CY osztályt (a hozzáférési kategóriák alapján) meghívja a CY egy metódusát írja/olvassa a CY egy adattagját Osztálytervezés és implementációs kérdések OTERV / 30

Használat kapcsolat impl. (folyt.) CX létrehoz egy CY típusú objektumot Probléma a használat kapcsolat implementálásával: Csak közvetett nyelvi eszközök jelzik az ilyen kapcsolatokat Korlátozó tényezők: csomagok és az osztályok hozzáférési kategóriája osztály tagjainak hozzáférési kategóriája Osztálytervezés és implementációs kérdések OTERV / 31