Objektum orientált szoftverfejlesztés
Kondorosi Károly, Szirmay-Kalos László, László Zoltán
ComputerBooks Kft.
Objektum orientált szoftverfejlesztés

Objektum orientált szoftverfejlesztés

Kondorosi, Károly

Szirmay-Kalos, László

László, Zoltán

Az eredeti mű a ComputerBooks Kiadó gondozásában jelent meg. Az elektronikus kiadás az NKTH által lebonyolított Felsőoktatási Tankönyv- és Szakkönyv-támogatási Pályázat keretében készült, a DocBook XML formátumot Bíró Szabolcs készítette.

Minden jog fenntartva. Jelen könyvet, illetve annak részeit tilos reprodukálni, adatrögzítő rendszerben tárolni, bármilyen formában vagy eszközzel - elektronikus úton vagy más módon - közölni a szerzők engedélye nélkül.


Ajánlás

Könyvünk 1997-es megjelenése óta sok kritikát, de még több pozitív visszajelzést kaptunk. Számos oktatási intézményben látjuk a kötelező, vagy ajánlott irodalmak listáján, és – örömünkre – nem csak az informatika szakokon. Ez azt bizonyítja, hogy az objektumorientált megközelítés egyre inkább hat az informatika alkalmazási területein, és egyre inkább képes betölteni azt a szerepét, hogy alapja lehessen az alkalmazási területek szakértői és az informatikusok által egyaránt érthető formális rendszermodelleknek. Megtisztelő, hogy könyvünk a DIGIT2005 digitális szakkönyvpályázaton támogatást nyert, és így internetes kiadásban is elérhetővé válik.

Ugyanakkor nem kis fejtörést okozott számunkra, hogy hogyan reagáljunk az eltelt tíz esztendő szakmai fejlődésére, hiszen a szoftverfejlesztés az informatika egyik legdinamikusabban fejlődő területének és egyben üzletágának bizonyult ebben az időszakban. Ennek megfelelően új irányzatok, módszerek, eszközök, fogalmak jelentek, jelennek meg, amelyek közül nem egyszerű kiválasztani a lényegeseket, a maradandókat. A komponens-technológia, az aspektus-orientált és az intencionális programozás, a versengő és egymással kölcsönhatásban fejlődő Java és .NET technológiák, az agilis szoftverfejlesztés, a C# nyelv, az analízis-, architekturális és tervezési minták, az új, integrált fejlesztő környezetek (mint például a Visual Studio, vagy az Eclipse) – mind-mind új, lényeges elemekkel színesítették a palettát, és ismeretük elengedhetetlen egy képzett informatikus számára. A szakma egyik legnagyobb hatású konzorciuma, az Object Management Group (OMG), számos szabványt, ajánlást dolgozott ki, amelyek eredményeként a módszertanok, jelölésrendszerek egységesedtek, a fogalmak tisztábbá váltak. Az egységes modellező nyelv (Unified Modelling Language, UML), a modellvezérelt architektúra (Model Driven Architecture, MDA), az objektum metamodell (Meta-Object Facility, MOF), az objektumok együttműködésének elosztott rendszerekben is alkalmazható szabványa (Common Object Request Broker Architecture, CORBA), az interfészleíró nyelv (Interface Definition Language, IDL), széles körben elterjedt szabványokká váltak. A konzorciumnak a szakma legnagyobb piaci szereplői is tagjai, így a szabványok gyakorlati alkalmazása és a forgalmazott termékekben való megjelenése is biztosított. Az OMG dokumentumainak jelentős része nyílt, elérhető a www.omg.org portálon.

Az internetes kiadás előkészítésekor irreális célkitűzés lett volna minden lényeges újdonság tárgyalása, akár csak felületesen is. Valamilyen mértékű átdolgozást azonban feltétlen szükségesnek láttunk, hiszen – egy tankönyvtől elvárhatóan – a jelölésrendszernek alkalmazkodnia kell a szabványokhoz, a példaprogramoknak pedig lefuttathatóknak kell maradniuk a mai rendszereken is.

Az internetes kiadást tehát az eredeti könyvhöz képest a következők jellemzik:

  • Megtartottuk az eredeti célkitűzést, azaz bemutatjuk az objektumorientált szoftverfejlesztés alapjait: az analízist, tervezést és a C++ nyelvű implementációt.

  • A bevezető, áttekintő fejezetekben csak ott változtattunk, ahol az új eredmények alapján a szöveg feltétlen korrekcióra szorult.

  • Az OMT (Object Modelling Technique) módszertan és jelölésrendszer helyett az UML-t alkalmazzuk. Ennek megfelelően az adatfolyamokat (dataflow) nem tárgyaljuk, a használati eseteket (use-case) pedig bevezetjük.

  • A C++ nyelv bemutatásakor és a mintafeladatok implementációiban ma elterjedten használt nyelvi környezetet veszünk alapul, így az olvasó a közölt programokat könnyebben fordíthatja és futtathatja az általa elérhető számítógépeken.

Ismételten köszönjük mindazoknak, akik észrevételeikkel, tanácsaikkal segítették munkánkat. Külön köszönjük Dr. Goldschmidt Balázs munkáját, aki ábráinkat az OMT jelölésrendszerről UML-re alakította. Ugyancsak megkülönböztetett köszönet illeti Bíró Szabolcsot, aki az internetes megjelenésre alkalmas formátumra alakította szövegeinket és ábráinkat.

Reményeink szerint a felfrissítés a könyv hasznára válik, és mind az oktatók és hallgatók, mind a gyakorlati szakemberek hasznos olvasmánya marad az elkövetkező években is.

Budapest, 2007. február

A szerzők

Tartalom

Előszó
1. 1. Bevezetés a szoftverfejlesztésbe
1.1. Szoftvertechnológiák
1.2. A fejlesztés elvi alapjai
1.2.1. A szoftverfejlesztés alapproblémái
1.2.2. Uraljuk a bonyolultságot!
1.2.3. A leírás szigorúsága
1.2.4. A fejlesztés folyamata
1.3. A szoftver életciklusa
1.3.1. Termékek életciklusa
1.3.2. A szoftver életciklusának jellegzetességei
1.3.3. A vízesésmodell
1.3.4. Az inkrementális fejlesztési modell és a prototípus
1.3.5. Spirálmodellek
1.3.6. Az újrafelhasználhatóság
1.3.7. Minőségbiztosítás a szoftverfejlesztésben
2. 2. Az objektumorientáltság fogalma
2.1. Út az objektumig
2.1.1. A kezdetektől az absztrakt adatstruktúrákig
2.1.2. Funkcionális kontra adatorientált tervezés
2.1.3. Irány az objektum!
2.2. Az objektum fogalma
2.2.1. Az objektum
2.2.2. Osztályok és példányok
2.2.3. Az objektumok típusai
2.2.4. Az objektum-változó
3. 3. Modellezés objektumokkal
3.1. A modellek áttekintése
3.1.1. Objektummodell
3.1.2. Dinamikus modell
3.1.3. Funkcionális modell
3.2. Az objektummodell
3.2.1. Attribútumok
3.2.2. A relációk és a láncolás
3.2.3. Normalizálás
3.2.4. Öröklés
3.2.5. Komponens-reláció
3.2.6. Metaosztály
3.3. Dinamikus modellek
3.3.1. Események és állapotok
3.3.2. Az állapotdiagram
3.3.3. Az állapotgép fogalmának kiterjesztése
3.3.4. Beágyazott állapotmodellek
3.3.5. Az állapotátmenet-tábla
3.4. A funkcionális modell
3.5. A modellek kapcsolata
4. 4. Fejlesztési módszer
4.1. Analízis
4.1.1. A feladatdefiníció
4.1.2. Objektummodellezés
4.1.3. Dinamikus modellezés
4.1.4. Funkcionális modellezés
4.2. Objektumorientált tervezés
4.2.1. Architektúrális tervezés
4.2.1. Külső interfész tervezése
4.2.2. Objektumtervezés
5. 5. Objektumok valósidejű rendszerekben
5.1. A valósidejű rendszerek jellemzői
5.1.1. Meghatározás, osztályozás
5.1.2. Egyéb jellemző tulajdonságok
5.1.3. Közkeletű félreértések és vitapontok
5.2. Időkövetelmények
5.2.1. Az időkövetelmények megadása
5.2.2. Az időkövetelmények típusai
5.3. A fejlesztés problémái
5.4. Valósidejű feladatokra ajánlott módszertanok
6. 6. Objektumorientált programozás C++ nyelven
6.1. A C++ nyelv kialakulása
6.2. A C++ programozási nyelv nem objektumorientált újdonságai
6.2.1. A struktúra és rokonai neve típusértékű
6.2.2. Konstansok és makrok
6.2.3. Függvények
6.2.4. Referencia típus
6.2.5. Dinamikus memóriakezelés operátorokkal
6.2.6. Változó-definíció, mint utasítás
6.2.7. Névterek
6.3. A C++ objektumorientált megközelítése
6.3.1. OOP nyelvek, C → C++ átmenet
6.3.2. OOP programozás C-ben és C++-ban
6.3.3. Az osztályok nyelvi megvalósítása (C++ → C fordító)
6.3.4. Konstruktor és destruktor
6.3.5. A védelem szelektív enyhítése - a barát (friend) mechanizmus
6.4. Operátorok átdefiniálása (operator overloading)
6.4.1. Operátor-átdefiniálás tagfüggvénnyel
6.4.2. Operátor-átdefiniálás globális függvénnyel
6.4.3. Konverziós operátorok átdefiniálása
6.4.4. Szabványos I/O
6.5. Dinamikus adatszerkezeteket tartalmazó osztályok
6.5.1. Dinamikusan nyújtózkodó sztring osztály
6.5.2. A másoló konstruktor meghívásának szabályai
6.5.3. Egy rejtvény
6.5.4. Tanulságok
6.6. Első mintafeladat: Telefonközponti hívásátirányító rendszer
6.7. Öröklődés
6.7.1. Egyszerű öröklődés
6.7.2. Az egyszerű öröklődés implementációja (nincs virtuális függvény)
6.7.3. Az egyszerű öröklődés implementációja (van virtuális függvény)
6.7.4. Többszörös öröklődés (Multiple inheritence)
6.7.5. A konstruktor láthatatlan feladatai
6.7.6. A destruktor láthatatlan feladatai
6.7.7. Mutatók típuskonverziója öröklődés esetén
6.7.8. Az öröklődés alkalmazásai
6.8. Generikus adatszerkezetek
6.8.1. Generikus szerkezetek megvalósítása előfordítóval (preprocesszor)
6.8.2. Generikus szerkezetek megvalósítása sablonnal (template)
7. 7. Objektumok tervezése és implementációja
7.1. Az objektum, a dinamikus és a funkcionális modellek kombinálás
7.1.1. Az objektummodell elemzése
7.1.2. A dinamikus modell elemzése
7.1.3. Osztályok egyedi vizsgálata
7.2. Az üzenet-algoritmusok és az implementációs adatstruktúrák kiválasztása
7.2.1. Áttekinthetőség és módosíthatóság
7.2.2. A komplexitás
7.2.3. Az adatstruktúrák kiválasztása, az osztálykönyvtárak felhasználása
7.2.4. Robusztusság
7.2.5. Saját debugger és profiler
7.3. Asszociációk tervezése
7.4. Láthatóság biztosítása
7.5. Nem objektumorientált környezethez, illetve nyelvekhez történő illesztés
7.6. Ütemezési szerkezet kialakítása
7.6.1. Nem-preemptív ütemező alkalmazása
7.7. Optimalizáció
7.8. A deklarációs sorrend megállapítása
7.9. Modulok kialakítása
8. 8. Mintafeladatok
8.1. Második mintafeladat: Irodai hierarchia nyilvántartása
8.1.1. Informális specifikáció
8.1.2. Használati esetek
8.1.3. Az objektummodell
8.1.4. A dinamikus modell
8.1.5. Objektumtervezés
8.1.6. Implementáció
8.2. Harmadik mintafeladat: Lift szimulátor
8.2.1. Informális specifikáció
8.2.2. Használati esetek
8.2.3. Az objektum-modell
8.2.4. A dinamikus modell
8.2.5. Objektumtervezés
8.2.6. A konkurens viselkedés tervezése
9. Irodalomjegyzék