Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A tartományspecifikus nyelvet (DSL) a DSL-definíciós fájl határozza meg, valamint az esetlegesen írható egyéni programkódot. A DSL-megoldás legtöbb programkódja ebből a fájlból jön létre.
Ez a témakör a DSL-definíció központi funkcióit ismerteti.
A DSL-definíció
Amikor megnyitja Dsl\DslDefinition.dsl, a Visual Studio ablaka az alábbi képhez hasonlít.
A DSL-definíció legfontosabb információi megjelennek a DSL-definíciós diagramon. A DslDefinition.dsl részét képező további információk a DSL Explorerben jelennek meg, amelyek általában a diagram oldalán jelennek meg. A leggyakoribb feladatok diagramjával és a DSL Explorerrel is dolgozhat a speciálisabb testreszabások érdekében.
A DSL-definíciós diagram a modellelemeket definiáló tartományosztályokat és a modellelemek közötti kapcsolatokat meghatározó kapcsolatokat mutatja be. A modellelemek felhasználónak való megjelenítéséhez használt alakzatokat és összekötőket is megjeleníti.
Amikor kiválaszt egy elemet a DSL-definícióban, akár a diagramon, akár a DSL Explorerben, a Tulajdonságok ablakban megjelennek az ezzel kapcsolatos információk. A DSL-részletek ablakban további információk is megjelenhetnek.
A modellek a DSL-ek példányai
A modell a felhasználó által létrehozott DSL-példány. A modell olyan modellelemeket tartalmaz, amelyek a definiált tartományosztályok példányai, valamint az elemek közötti kapcsolatok, amelyek a definiált tartománykapcsolatok példányai. A modellek alakzatokkal és összekötőkkel is rendelkezhetnek, amelyek a modell elemeit és hivatkozásait jelenítik meg egy diagramon. A DSL-definíció tartalmazza az alakzatosztályokat, az összekötőosztályokat és a diagram osztályát.
A DSL-definíciót tartománymodellnek is nevezik. A DSL-definíció vagy tartománymodell a tartományspecifikus nyelv tervezési idő szerinti ábrázolása, míg a modell a tartományspecifikus nyelv futásidejű példánya.
A tartományosztályok modellelemeket definiálnak
A tartományosztályok a tartomány különböző elemeinek létrehozására szolgálnak, a tartománykapcsolatok pedig az elemek közötti kapcsolatok. Ezek azok az elemek és hivatkozások tervezési idő szerinti ábrázolása, amelyeket a modelljeik létrehozásakor a tervezőspecifikus nyelv felhasználói fognak példányosíteni.
Ez az ábra egy olyan modellt mutat be, amelyet egy DSL zenetár felhasználója hozott létre. A zenei albumokat olyan dobozok jelölik, amelyek dallistákat tartalmaznak. A művészeket kerek sarkú dobozok képviselik, és azokhoz az albumokhoz kapcsolódnak, amelyekhez hozzájárultak.
A DSL-definíció két szempontot választ el egymástól. A modellelemek megjelenése a modelldiagramon alakzatosztályok és összekötőosztályok használatával van meghatározva. A modellben tárolt információk tartományosztályok és tartománykapcsolatok használatával lesznek definiálva.
Az alábbi ábrán a zenetár DSL-definíciójában szereplő tartományosztályok és kapcsolatok láthatók.
Az ábrán négy tartományosztály látható: Zene, Album, Előadó és Dal. A tartományosztályok olyan tartománytulajdonságokat határoznak meg, mint a Név, a Cím stb. A példánymodellben ezeknek a tulajdonságoknak az értékei megjelennek a diagramon.
Az osztályok között tartománykapcsolatok vannak: MusicHasAlbums, MusicHasArtists, AlbumbHasSongs és ArtistAppearedOnAlbums. A kapcsolatok több relációval rendelkeznek, például 1..1, 0..*. Például minden dalnak pontosan egy albumhoz kell kapcsolódnia az AlbumHasSongs kapcsolaton keresztül. Minden album tetszőleges számú dallal rendelkezhet.
A DSL-definíciós diagram átrendezése
Figyelje meg, hogy egy tartományosztály többször is megjelenhet a DSL-definíciós diagramon, ahogy az Album is ebben a képen. Mindig van egy fő nézet, és lehetnek referencianézetek .
A DSL-definíciós diagram átrendezéséhez a következő lépéseket teheti:
A fő- és hivatkozásnézetek felcserélése a Fa idehozása és a Fa felosztása parancsokkal. A parancsok megtekintéséhez kattintson a jobb gombbal egyetlen tartományosztályra.
A ctrl+Fel és a Ctrl+Le billentyűkombinációval rendelje újra a tartományosztályokat és az alakzatosztályokat.
Az egyes alakzatok jobb felső sarkában található ikonnal összecsukhatja vagy kibonthatja az osztályokat.
A fa egyes részeinek összecsukásához kattintson a tartományosztály alján található mínuszjelre (-).
Örökség
A tartományosztályok örökléssel határozhatók meg. Öröklési származtatás létrehozásához kattintson az Öröklés eszközre, kattintson a származtatott osztályra, majd az alaposztályra. A modellelem rendelkezik a saját tartományosztályán definiált összes tulajdonsággal, valamint az alaposztálytól örökölt összes tulajdonsággal. A kapcsolatokban is örökli a szerepköreit.
Az öröklés kapcsolatok, alakzatok és összekötők között is használható. Az öröklés azonos csoporton belül kell, hogy maradjon. Az alakzatok nem örökölhetők tartományosztályból.
Tartománykapcsolatok
A modellelemek kapcsolatok alapján kapcsolhatók össze. A hivatkozások mindig binárisak; pontosan két elemet kapcsolnak össze. Bármely elemnek azonban számos hivatkozása lehet más objektumokhoz, és akár több hivatkozás is lehet ugyanazon elempár között.
Ahogyan különböző elemosztályokat is definiálhat, a hivatkozások különböző osztályait is definiálhatja. A hivatkozás osztályát tartománykapcsolatnak nevezzük. A tartománykapcsolat határozza meg, hogy a példányai milyen elemosztályokhoz csatlakozhatnak. A kapcsolat minden végét szerepkörnek nevezzük, a tartománykapcsolat pedig a két szerepkör nevét, valamint magát a kapcsolatot határozza meg.
Kétféle tartománykapcsolat létezik: beágyazási kapcsolatok és referenciakapcsolatok. A DSL-definíciós diagramon a beágyazási kapcsolatok minden szerepkörben egy-egy vonallal rendelkeznek, a referenciakapcsolatok pedig szaggatott vonalakkal rendelkeznek.
Kapcsolatok beágyazása
A modell minden eleme– a gyökér kivételével – egy beágyazási hivatkozás célja. Ezért a teljes modell a hivatkozások beágyazásának egyetlen fáját alkotja. A beágyazási kapcsolatok az elszigetelést vagy a tulajdonjogot jelölik. Két ilyen módon kapcsolódó modellelem neve szülő és gyermek. A gyermekről azt mondják, hogy a szülőbe van ágyazva.
A beágyazási hivatkozások általában nem jelennek meg kifejezetten összekötőként egy diagramon. Ehelyett általában elszigeteléssel jelölik őket. A modell gyökerét a diagram jelöli, a benne beágyazott elemek pedig alakzatként jelennek meg a diagramon.
A példában a Music gyökérosztály az Album osztállyal rendelkezik egy MusicHasAlbums nevű beágyazási kapcsolaton keresztül, amely egy AlbumHasSongs nevű beágyazással rendelkezik a Song osztályhoz. A dalok elemekként jelennek meg az egyes albumok listájában. A Zene osztály rendelkezik egy MusicHasArtists beágyazással a Művész osztályhoz, amelynek példányai alakzatként is megjelennek a diagramon.
Alapértelmezés szerint a beágyazott elemek automatikusan törlődnek a szüleik törlésekor.
Amikor egy modellt XML formátumban mentünk el fájlba, a beágyazott elemek a szülőelemeikbe helyezkednek el, hacsak nem testre szabtuk a szerializálást.
Megjegyzés:
A beágyazás nem ugyanaz, mint az öröklés. A beágyazási kapcsolatban lévő gyermekek nem öröklik a szülő tulajdonságait. A beágyazás a modellelemek közötti kapcsolat típusa. Az öröklés az osztályok közötti kapcsolat, és nem hoz létre kapcsolatokat a modellelemek között.
Beágyazási szabályok
A példánymodell minden elemének pontosan egy beágyazási hivatkozásnak kell lennie, kivéve a modell gyökerét.
Ezért a gyökérosztály kivételével minden nem absztrakt tartományosztálynak legalább egy beágyazási kapcsolat céljának kell lennie, vagy örökölnie kell egy beágyazást egy alaposztályból. Az osztály lehet két vagy több beágyazás célja, de a példánymodell elemeinek egyszerre csak egy szülője lehet. A cél és a forrás közötti szorzásnak 0...1 vagy 1..1-nek kell lennie.
Az Explorer megjeleníti a beágyazási fát
A DSL-definíció egy explorert is létrehoz, amelyet a felhasználók a modelldiagramjuk mellett látnak.
Az Explorer megjeleníti a modell összes elemét, még azokat is, amelyekhez nem definiált alakzatokat. Az elemeket és a kapcsolatok beágyazását jeleníti meg, a hivatkozási kapcsolatokat azonban nem.
Egy elem tartománytulajdonságainak értékeinek megtekintéséhez a felhasználó kiválaszt egy elemet a modelldiagramon vagy a modellkezelőben, és megnyitja a Tulajdonságok ablakot. Megjeleníti az összes tartománytulajdonságt, beleértve azokat is, amelyek nem jelennek meg a diagramon. A példában minden dal címmel és műfajsal is rendelkezik, de csak a Cím értéke jelenik meg a diagramon.
Referenciakapcsolatok
A hivatkozási kapcsolat bármilyen olyan kapcsolatot jelöl, amely nem beágyazható.
A referenciakapcsolatok általában alakzatok közötti összekötőként jelennek meg egy diagramon.
A modell XML-reprezentációjában a két elem közötti hivatkozási hivatkozás monikerek használatával jelenik meg. Vagyis a monikerek olyan nevek, amelyek egyedileg azonosítják a modell egyes elemeit. Az egyes modellelemek XML-csomópontja tartalmaz egy csomópontot, amely meghatározza a kapcsolat nevét és a másik elem monikerét.
Szerepkörök
Minden tartománykapcsolat két szerepkörrel, egy forrásszerepkörrel és egy célszerepkörrel rendelkezik.
Az alábbi képen a Publisher tartományosztály és a PublisherCatalog tartománykapcsolat közötti sor a forrásszerepkör. A célzott szerepkör a tartománykapcsolatot az Album tartományosztályhoz kötő vonal.
A kapcsolathoz társított nevek különösen fontosak a modellen áthaladó programkód írásakor. A DSL-megoldás létrehozásakor például a létrehozott Publisher osztálynak van egy albumgyűjteményt tartalmazó tulajdonságkatalógusa. Az Album osztály rendelkezik egy Publisher nevű tulajdonsággal, amely a Publisher osztály egyetlen példánya.
Amikor kapcsolatot hoz létre egy DSL-definícióban, a tulajdonság- és kapcsolatnevek alapértelmezett értékeket kapnak. Azonban módosíthatja őket.
Sokféleségek
A szorzások megadják, hogy hány elem rendelkezhet ugyanazzal a szerepkörrel egy tartománykapcsolatban. A példában a katalógusszerepkör nulla-a-többhöz (0...*) szorzási beállítása azt határozza meg, hogy a Publisher tartományosztályának bármely példánya annyi PublisherCatalog kapcsolati hivatkozással rendelkezhet, amennyit meg szeretne adni.
Konfigurálja egy szerepkör szorzását a diagram beírásával vagy a MultiplicityTulajdonságok ablak tulajdonságának módosításával. Az alábbi táblázat a tulajdonság beállításait ismerteti.
| Multiplicitás típusa | Description |
|---|---|
| 0..* (Nullától többig) | A tartományosztály minden példánya rendelkezhet a kapcsolat több példányával, vagy a kapcsolat egyetlen példányával sem. |
| 0..1 (Nullától egyig) | A tartományosztály minden példánya legfeljebb egy kapcsolattal rendelkezhet, vagy egyáltalán nem rendelkezhet kapcsolattal. |
| 1..1 (Egy) | A tartományosztály minden példánya rendelkezhet a kapcsolat egy-egy példányával. A kapcsolatnak egynél több példánya nem hozható létre a szerepkörosztály egyik példányából sem. Ha az ellenőrzés engedélyezve van, érvényesítési hiba jelenik meg, ha a szerepkörosztály bármely példánya nem rendelkezik kapcsolatpéldánysal. |
| 1..* (Egy a többhöz) | A szerepkörhöz tartozó osztály minden példányának, amely ilyen multiplicitással rendelkezik, több példánya is lehet a kapcsolatnak, és minden példánynak legalább egy kapcsolatban kell lennie. Ha az ellenőrzés engedélyezve van, érvényesítési hiba jelenik meg, ha a szerepkörosztály bármely példánya nem rendelkezik kapcsolatpéldánysal. |
Tartománykapcsolatok osztályokként
Az Áruházban hivatkozás jelenik meg a LinkElement példányaként, amely a ModelElement származtatott osztálya. Ezeket a tulajdonságokat a tartománykapcsolatok tartománymodell-diagramjában határozhatja meg.
Azt is megteheti, hogy a kapcsolatot más kapcsolatok forrása vagy céljaként is használhatja. A tartománymodell-diagramon kattintson a jobb gombbal a tartománykapcsolatra, majd kattintson a Megjelenítés osztályként parancsra. Megjelenik egy további osztálydoboz. Ezután kapcsolatokat is csatlakoztathat hozzá.
A kapcsolatot részben örökléssel is definiálhatja, ahogyan a tartományosztályokkal is. Válassza ki a származtatott kapcsolatot, és állítsa be az Alapkapcsolatot a Tulajdonságok ablakban.
A származtatott kapcsolatok az alapkapcsolatra specializálódnak. A hivatkozott tartományosztályokat az alapkapcsolat által összekapcsolt osztályokból kell származtatnia, vagy azokkal azonosnak kell lennie. Amikor egy modellben létrejön a származtatott kapcsolat hivatkozása, az a származtatott és az alapkapcsolatok példánya is. A programkódban a hivatkozás ellentétes végére navigálhat az alap vagy a származtatott osztály által létrehozott tulajdonságok használatával.