Gyakorlati alapok III.
Az osztályok közötti kapcsolatok
Az objektumorientált programozás egyik fő jellegzetessége, hogy a futó kód az osztályokból úgynevezett példányosítással létrehozott, már saját memóriacímmel és további, a biztonságos futtatáshoz elengedhetetlenül fontos tulajdonságokkal felruházott objektumok közötti aktív kommunikáció (sok esetben üzenetküldés) eredménye.
Alapjában véve még értelme sincs olyan objektumorientált programnak, amelyben az objektumok között nincsenek kapcsolati pontok, azaz nem tudnak együttműködni egymással.
A kapcsolatok megléte tehát döntő fontosságú, módszertanilag nézve már csak az a kérdés, hogy ezek a kapcsolatok milyen jellegűek, azaz voltaképpen milyen szempontok szerint katalogizáljuk őket. A kapcsolatok jellegük szerint ötfélék lehetnek:
-
általános jelleg
-
ismertségi
-
tartalmi
-
-
multiplicitás
-
fok
-
irány
-
szerepnév
Általános jelleg
Ismertségi
A kapcsolat alapja azon ismeret, amely során legalább az egyik osztály (objektum) tud a másikról. Ennek legszemléletesebb példája a HTTP-protokoll működése, amelyben ha a kliens nem tud a szerver létezéséről, akkor nem is alakulhat ki közöttük kapcsolat. Ettől függetlenül önállóan is léteznek, azaz létük nem függ egy másik osztálytól-objektumtól, bár az említett példához visszatérve nincs sok értelme kliensek leprogramozásának, ha nem tudnak szerverekhez kapcsolódni.
Tartalmi
Ezen típusú kapcsolatban az osztályokból keletkezett objektumok egész-rész, másképpen fogalmazva halmaz-részhalmaz kapcsolatban állnak egymással. Ha a rész nem képes létezni az egész nélkül, erős tartalmazási kapcsolatként definiálható. Például:
-
szülő és gyermekei osztály,
-
élőlény és testrészei osztály,
-
nyersanyag és késztermék osztály,
-
stb.
Ha a rész képes létezni az egész nélkül is, gyenge tartalmazási kapcsolatként definiálható. Például:
-
főnök és beosztottai osztály,
-
raktár és raktáráru osztály,
-
vonatjárat és utasai osztály,
-
stb.
Multiplicitás
A kapcsolatban résztvevő osztályok konkrét számát határozza meg. Nézzünk példákat szabványos, UML-alapú osztálydiagram-jelölésük szerint:
-
2 - az osztály 2 osztállyal van kapcsolatban,
-
0..1 - osztály 0 vagy 1 osztállyal van kapcsolatban,
-
5..10 - osztály 5 vagy 10 osztállyal van kapcsolatban,
-
* - osztály akárhány osztállyal kapcsolatban lehet,
-
1..* - az osztály legalább 1, illetve akárhány osztállyal kapcsolatban lehet,
-
stb.
Fok
A kapcsolat mértékét határozza meg. 2 fokmérője van: egy és sok.
Egy-egy
Logikai párosításban 1 osztály kizárólag 1 osztállyal tud kapcsolódni. Például:
-
név és személyi szám osztály,
-
férjnév és feleségnév osztály (legalábbis európai kultúrkörben),
-
autó és rendszám osztály,
-
stb.
Egy-sok
Logikai párosításban 1 osztály több osztállyal is tud kapcsolódni. Például:
-
állam és tartományai osztály,
-
termék és vevői osztály,
-
szolgáltató és ügyfelei osztály,
-
stb.
Sok-sok
Logikai párosításban több osztály több osztállyal is tud kapcsolódni. Például:
-
országok és állampolgáraik osztály,
-
árukészletek és vevői osztály,
-
kerületek és lakói osztály,
-
stb.
Irány
Az osztályok kapcsolódásának iránya azt jelenti, hogy a kapcsolódás 2 irányú-e vagy csak egyirányú. Az utóbbi esetben csakis az egyik osztály tud a másikról.
Az alapértelmezés nyilvánvalóan az egyirányú kapcsolat, hiszen kapcsolati irány nem is értelmezhető, ha nincs kapcsolódás.
Példák egyirányú kapcsolódásra:
-
áruház és látogatói osztály - hiszen áruház sohasem megy látogatóihoz,
-
ország és turistái osztály - hiszen ország sohasem látogatja meg turistáit,
-
napilap és vásárlói osztály - hiszen napilap sohasem veszi meg vásárlóit,
-
stb.
Példák kétirányú kapcsolódásra:
-
szerver és kliens osztály - ennek legszemléletesebb példája a HTTP-protokoll működése, amely során szerver és kliens adatcsere érdekében folyamatosan kommunikál egymással,
-
bevándorlás és kérelem-elbírálás osztály - mindkét osztály tud a másikról, az egyik felülbírálja a másikat,
-
iskola és tanulói osztály - az iskola tud tanulóiról és ez fordítva is igaz,
-
stb.
Szerepnév
A szerepnév utal az osztály a kérdéses kapcsolat(ok)ban betöltött szerepére. Mivel ezt legtöbbször maga a programozó osztja ki, szigorúan be kell tartani az általános névkonvenciós szabályokat (Az adatok, metódusok elnevezésének problémái című fejezet). Például:
-
iskola és tanulói osztály - ahol a 2 szerepnév egyértelműen meghatározza az intézmény és rendszeres látogatói közti kapcsolatot.