A cikksorozat előző részében megnéztük, hogy a fogalmainkat hogyan tudjuk összegyűjteni, és egységes, minden fél által érthető formában tárolni. Láttuk a módszer előnyeit, de a korlátait is. Ebben a cikkben egy kiegészítő módszert szeretnék bemutatni, mely segítségével grafikus módon tudjuk ábrázolni a fogalmainkat és ezek kapcsolatait.
Egy ábra – vagy ezer szó
“Egy ábra többet ér ezer szónál” – mindenki ismeri ezt a mondást. Azt már kevesebben tudják, hogy a mondás eredetileg nem egy nagyon bölcs ember nagyon mély gondolata volt, hanem egy autógumi kereskedés reklámja.
Ettől függetlenül, a reklám kitalálója igencsak fején ütötte a szöget: gyakran egy jól elkészített ábrára ránézve azonnal megértjük a “nagy képet”. A grafikus ábrázolás egyik nagy előnye az, hogy az absztrakciós szint emelésével a “lényegre” tudunk koncentrálni és nem veszünk el az apró részletekben.
Fogalmi ábrázolás
Azt már beláttuk, hogy ha valamit ábrázolunk, az nagy mértékben tudja segíteni a megértésünket. Vajon van-e lehetőségünk arra, hogy a fogalmi modellezés során valamilyen módon ábrákat használjunk? Hát persze hogy van, különben már vége is lenne a cikknek 🙂 Álljunk neki naivan, mindenféle előzetes ismeretek nélkül: hogyan ábrázolnánk a fogalmi modellünket?
Ami biztos, hogy vannak fogalmaink. Írjuk fel őket egy papírra valahogyan szétdobálva. Így lett egy csomó csomó feliratunk, eddig jók vagyunk.
Korábban láttuk, hogy a fogalmaink között valamiféle kapcsolat is lehet. Hogyan ábrázolnánk a kapcsolatot? Egyszerűen csak húzzunk az egyes, egymáshoz kapcsolódó fogalmaink közé egy vonalat, és a vonal mellé írjuk oda, hogy ez milyen kapcsolatot is jelent.
Elég az, hogy csak egyszerű kapcsolatunk van? Nem, bizonyára nem, az első cikkből láthatjuk, hogy nem csak egyszerű, egyenrangú kapcsolatok léteznek, hanem van olyan, hogy tartalmazás (például egy jármű állhat különböző részekből), vagy generalizáció (pl. a háromfényű lámpa, a gyalogátkelő lámpa, stb. az mind egyfajta lámpa).
Mi a helyzet azzal az esettel, amikor korlátozni akarjuk azt, hogy egy kapcsolat során a kapcsolatban szereplő fogalmak példányaiból hány darab lehet. Nulla vagy egy? Pontosan egy? Vagy lehet akárhány?
Ahogy egyre inkább elmélyülünk az ábrázolásban, rájövünk arra, hogy bár remek ötletnek tűnik egy saját jelölésrendszer feltalálása, de vajon a többi ember érteni fogja-e, és ha igen, akkor ugyanazt fogja érteni alatta, mint mi? Egy nyelvet fogunk beszélni? Jó eséllyel nem; ezért hozta létre Rumbaugh, Jacobson and Booch az Unified Modeling Language (röviden UML) jelölésrendszert még a 1990-es évek végén.
UML
Jelenleg elég annyit tudnunk az UML-ről, hogy a jelölésrendszer több diagram típust definiál, ebből fogalmi modellezésre a Class diagramot tudjuk használni. Az UML metamodellje (az a modell, amelyik leírja magát az UML szabványt) meglehetősen komplex, ezért mi annak egy egyszerűsített, nem feltétlenül pontos, de a célnak megfelelő részhalmazával fogunk csak ebben a cikkben foglalkozni. Nézzük tehát, hogy egy fogalmi modell-t hogyan tudunk az UML jelölésrendszerével ábrázolni, milyen elemekből tudunk dolgozni.
Fogalom (Concept)
A fogalom az egyik alapvető építőeleme a fogalmi modellezésnek. A valóságban lévő objektumok kategorizálása után az adott kategóriának nevet adva jön létre a fogalom.
A fogalmakat az UML Class diagramban használt class model elemmel tudjuk ábrázolni. Az UML lehetőséget ad arra, hogy attribútumokat (egy gépjármű modellezése esetén pl. szín, gyártási év, gyártó neve, stb.) illetve operációkat (műveletek, melyek az adott fogalmon értelmezettek) rendeljünk egy fogalomhoz, de a fogalmi modellezés absztrakciós szintjén ezeket nem nagyon szoktuk használni. Ennek az a legfőbb oka, hogy megpróbáljuk a fogalmi modellünket olyan tisztán, zavaró elemektől mentes állapotban tartani, amennyire csak lehet.
A fogalmat az UML-ben egy dobozzal ábrázoljunk, melynek a neve a fogalom neve.
Kapcsolat (Association)
Az egyes fogalmak a legritkább esetben állnak önállóan: szinte mindig van valamilyen összefüggés, kapcsolat. A fogalmi modellezés során a kapcsolatokat is modellezni fogjuk.
A kapcsolatnak különböző típusai lehetnek, ezek:
- Generalizáció/specializáció/altípus (Generalization/Specialization/Subtype)
- Egyszerű kapcsolat (Association)
- Aggregáció (Aggregation)
- Kompozíció (Composition)
Generalizáció/specializáció
Az egyes fogalmak között létezhet hierarchia, amit magyarul az altípus, vagy az egyfajta kifejezéssel szoktunk leírni. A kacsa egyfajta madár. A teherautó a gépjármű egy altípusa.
Ezen hierarchiát alapvetően két modellezési folyamattal tudjuk kialakítani: az egyik a a generalizáció, a másik a specializáció.
A generalizáció azt jelenti hogy fogunk különböző fogalmakat, általánosítjuk őket és ennek az általánosítás keretében új fogalmat hozunk létre. Nézzünk erre a példát: van egy olyan fogalmunk hogy Tehén, van egy olyan fogalmunk hogy Ló, és van egy olyan fogalmunk, hogy Alpaka. Ezeket mind szelídek és a ház körül élnek, ezért létrehozunk egy új fogalmat amelyet elnevezünk Háziállatnak, és a fent említett jószágokat besoroljuk alá.
A generalizáció egy bottom-up tervezési módszer: alulról indulunk, megkeressük a közös tulajdonságokat, és azok alapján hierarchiába szervezzük az egyes elemeket.
A másik lehetséges módszerünk specializáció. A specializáció során egy fogalomból indulunk, majd szépen kibontjuk. Nézzünk erre is egy példát. Egy szoftvert kell terveznünk, amiben szükség van felhasználók kezelésére. Tehát van egy Felhasználó fogalmunk. Ezután elkezdünk gondolkodni azon, hogy mégis milyen felhasználóink lehetnek? Hát, van Ügyfelünk, aki a rendszer ügyfél funkcióit használja. Aztán kellene egy olyan, aki a rendszert karbantartja. Ő lesz az Adminisztrátor. Később jön egy olyan igény, hogy legyenek olyan Felhasználók, akik különböző riportokat tudnak nézegetni és lekérdezéseket tudjanak futtatni. Legyenek ők a Manager-ek.
A specializáció egy top-down tervezési módszer, egy adott fogalomból indulunk ki, majd azt menet közben, ahogy egyre mélyül a domain tudásunk, kibontjuk.
Ha veszünk két fogalmat melyek generalizáció/specializáció kapcsolatban vannak, akkor őket a következő kategóriákba soroljuk: amelyik általánosabb, az a supertype, amelyik pedig specifikusabb, az a subtype.
Egyszerű kapcsolat
Az első kapcsolati típus amivel foglalkozni fogunk az egyszerű kapcsolat. Az egyszerű kapcsolat két egyenrangú fogalom között értelmezett, és egy vonallal jelöljük. Nézzünk erre egy példát: van egy szerverünk, van egy kliensünk, le akarjuk írni a kettő közötti kapcsolatot.
Fontos megjegyezni, hogy a kapcsolat az egyszerű kapcsolat, aggregáció, illetve kompozíció esetében nem az egyes fogalmak, hanem a fogalmak egyes példányai között jön létre.
Aggregáció
Az aggregáció egy olyan olyan alá-fölérendelt kapcsolat ahol az egyik fél (szülő) birtokolja a másik felet (gyerek), viszont ez egy laza kapcsolat: az alárendelt szereplő (gyerek) létezhet a fölérendelt (szülő) nélkül. Az aggregációt egy vonallal, és a szülő oldalán található üres rombusszal ábrázoljuk. Az aggregációra gondoljunk úgy, hogy ha a szülőt megszüntetjük, abból még nem következik, hogy a gyerek is megszűnik létezni.
Nézzünk erre egy példát: van egy Cégünk. A Cég áll Részlegekből. Egy Részleghez tartoznak Dolgozók. Ha a részleget megszüntetjük, akkor kirúgjuk a dolgozót? Természetesen nem, egyszerűen csak átkerül egy másik részleghez.
Kompozíció
A kompozíció egy olyan olyan alá-fölérendelt kapcsolat ahol az egyik fél (szülő) birtokolja a másik felet (gyerek), viszont ez egy erős kapcsolat: az alárendelt szereplő (gyerek) nem létezhet a fölérendelt (szülő) nélkül. A kompozíciót egy vonallal, és a szülő oldalán található kitöltött rombusszal ábrázoljuk. A legegyszerűbb úgy gondolni a kompozícióra, hogy ha töröljük a szülőt, akkor törölni fogjuk a gyerekeit is. Nézzünk egy példát: modellezzünk egy fájlrendszert. A fájlrendszer könyvtárakból és fájlokból áll. A könyvtár tartalmaz valahány fájlt. Ha a könyvtárat töröljük, akkor a benne lévő fájlok is törlődnek.
Példányosítás
A korábbi cikkekben olvashattuk arról hogy mi a fogalom és hogyan jön létre: vesszük az objektumokat, közös tulajdonság alapján kategóriába soroljuk őket, ezt a kategóriát elnevezzük, és ez lesz a fogalom. Ezeket a fogalmakat, és a közöttük lévő kapcsolatokat modellezzük. A tervezés során azonban van egy másik szint, ahol nem csak a fogalmakat, hanem a fogalomból létrejött példányokat vizsgáljuk. Amikor egy Fogalomból létrehozunk egy objektumot (egy adatbázis rekord, egy fájl, egy üzenet, egy memóriaszelet, stb. formájában), azt nevezzük példányosításnak.
Számosság
A fogalmimodell-ábrázolás során néha szükségünk van arra, hogy az egyes kapcsolatoknál jelezzük, hogy egy adott kapcsolatnál az egyes fogalmakból hány darab lehet, hogy az értelmes legyen. Ezt úgy tehetjük meg, hogy a kapcsolatot jelölő vonal fogalom oldalaihoz plusz információt (ez a számosság) írunk.
A leggyakrabban használt számosságok:
- 0,
- 0 vagy 1,
- 1,
- 0..* (akárhány),
- 1..* (akárhány)
- * (akárhány),
- nem definiált
Nézzük a fenti könyvtáros példát.
A fenti példát a következőképpen kell értelmezni: a könyvtár fogalom tetszőleges példányára igaz az, hogy hozzá 0..akárhány fájl tartozhat. Lehet hogy üres, lehet hogy 5, lehet hogy százcsilliárd. A másik oldalról nézve, egy fájlhoz mindig tartozik egy és csakis egy könyvtár.
Számomra mindig gondot jelentett, hogy a számosságokat honnan is kell nézni, egészen addíg, amíg nem ismertem meg a következő trükköt: ha kíváncsiak vagyunk, hogy a Fájl fogalomhoz mit írjunk, akkor képzeljük el, hogy ráállunk a Könyvtár fogalomra, és megnézzük, hogy onnan hány Fájl fogalmat látunk. Nullát vagy egyet, Egyet, többet, minimum egyet? Ezt a számot írjuk azon fogalom mellé, amit megfigyelünk (jelen esetben a Fájl mellé).
Összefoglaló
Ebben a cikkben a fogalmimodell-ábrázolás felszínét karcolgattuk. Beszéltünk a fogalomról, és a fogalmak egymás közötti kapcsolatáról, megtanultuk a kapcsolat, generalizáció, aggregáció, és kompozíció típusú kapcsolatokat, megtudtuk, hogy mi a példányosítás, és hogyan is kell a számosságakról gondolkozni.