Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
Agiles Modellieren mit
             Domain Specific Languages -
                 Eine DSL für eine
              generische...
Agiles Modellieren mit
             Domain Specific Languages -
                 Eine DSL‘s für eine
              generisc...
Dominik Hirt
http://www.efinia.de
Personal Finance Management
Das Modellieren mit
Domain Specific Languages
vereinfacht den Entwicklungs-
prozess und erhöht die
Qualität unserer Softwar...
^[A-Z0-9._%-]+@(?:[A-Z0-9-]+.)+[A-Z]{2,4}$
^[A-Z0-9._%-]+@(?:[A-Z0-9-]+.)+[A-Z]{2,4}$
SELECT COUNT(*)
FROM Account JOIN Customer
WHERE Account.CustID = Customer.ID
WHERE Customer.Name LIKE ‘D%’
SELECT COUNT(*)
FROM Account JOIN Customer
WHERE Account.CustID = Customer.ID
WHERE Customer.Name LIKE ‘D%’
1.e2-e4 e7-e5
2.Lf1-c4 Sb8-c6
3.Dd1-f3 Lf8-c5
4.Df3xf7#
1.e2-e4 e7-e5
2.Lf1-c4 Sb8-c6
3.Dd1-f3 Lf8-c5
4.Df3xf7#
Unified
 Modeling
Language
Das Problem




Browser   Desktop      Mobile   Tablet


                                   API

           Server / Platt...
Die Ursachen




Redundanz     Abstraktion   Wiederverwendung
Mythos Wiederverwendbarkeit



‣   Klassen

‣   Services

‣   Komponenten

‣   Modelle

‣   Prozesse
Model Driven Software Development




Domäne          Modell        MetaModell
Ein [...] Metamodell stellt die Elemente
einer Modellierungssprache und ihre
Beziehungen in einem Modell dar.
            ...
grammar de.efinia.webapp.WebAPI with org.eclipse.xtext.xbase.Xbase
generate webAPI "http://www.efinia.de/webapp/WebAPI"
We...
function createAccount {
	    request {
	    	    url : "/konto"
	    	    method : PUT
        param name String
        ...
function createAccount {
	    request {
	    	    url : "/konto"
	    	    method : PUT                       RESTful Arch...
grammar de.efinia.dsl.MessagesDsl with org.eclipse.xtext.common.Terminals

generate messagesDsl "http://www.efinia.de/dsl/...
Vorher                                  Nachher
<?xml version="1.0" encoding="UTF-8"?>    message impressum.pageTitle {
<m...
Vorher                                  Nachher
<?xml version="1.0" encoding="UTF-8"?>    message impressum.pageTitle {
<m...
grammar de.efinia.categories.Categories with org.eclipse.xtext.common.Terminals

generate categories "http://www.efinia.de...
// Hauptkategorien
category "Haus/Wohnung"
category "PKW"
category "Ernährung"

// Unterkategorien
category "Telefon" --> ...
Model Driven Software Development


MetaModell




                                                       lauffähige
  Mod...
Redundanz
Single Source
MetaModell          Modell




             Test
<Demo>

powered by
‣   Routine Implementierungen

‣   Boilerplate Code

‣   Java Bean Hölle
EFinTLModel:
     useCases+=UseCase*
     dialogs+=Dialog*




                                                   Top Secr...
blog.todo42.net
d.hirt@efinia.de
Agiles Modellieren mit Domain Specific Languages
Agiles Modellieren mit Domain Specific Languages
Agiles Modellieren mit Domain Specific Languages
Agiles Modellieren mit Domain Specific Languages
Agiles Modellieren mit Domain Specific Languages
Agiles Modellieren mit Domain Specific Languages
Nächste SlideShare
Wird geladen in …5
×

von

Agiles Modellieren mit Domain Specific Languages Slide 1 Agiles Modellieren mit Domain Specific Languages Slide 2 Agiles Modellieren mit Domain Specific Languages Slide 3 Agiles Modellieren mit Domain Specific Languages Slide 4 Agiles Modellieren mit Domain Specific Languages Slide 5 Agiles Modellieren mit Domain Specific Languages Slide 6 Agiles Modellieren mit Domain Specific Languages Slide 7 Agiles Modellieren mit Domain Specific Languages Slide 8 Agiles Modellieren mit Domain Specific Languages Slide 9 Agiles Modellieren mit Domain Specific Languages Slide 10 Agiles Modellieren mit Domain Specific Languages Slide 11 Agiles Modellieren mit Domain Specific Languages Slide 12 Agiles Modellieren mit Domain Specific Languages Slide 13 Agiles Modellieren mit Domain Specific Languages Slide 14 Agiles Modellieren mit Domain Specific Languages Slide 15 Agiles Modellieren mit Domain Specific Languages Slide 16 Agiles Modellieren mit Domain Specific Languages Slide 17 Agiles Modellieren mit Domain Specific Languages Slide 18 Agiles Modellieren mit Domain Specific Languages Slide 19 Agiles Modellieren mit Domain Specific Languages Slide 20 Agiles Modellieren mit Domain Specific Languages Slide 21 Agiles Modellieren mit Domain Specific Languages Slide 22 Agiles Modellieren mit Domain Specific Languages Slide 23 Agiles Modellieren mit Domain Specific Languages Slide 24 Agiles Modellieren mit Domain Specific Languages Slide 25 Agiles Modellieren mit Domain Specific Languages Slide 26 Agiles Modellieren mit Domain Specific Languages Slide 27 Agiles Modellieren mit Domain Specific Languages Slide 28 Agiles Modellieren mit Domain Specific Languages Slide 29 Agiles Modellieren mit Domain Specific Languages Slide 30 Agiles Modellieren mit Domain Specific Languages Slide 31 Agiles Modellieren mit Domain Specific Languages Slide 32 Agiles Modellieren mit Domain Specific Languages Slide 33 Agiles Modellieren mit Domain Specific Languages Slide 34 Agiles Modellieren mit Domain Specific Languages Slide 35 Agiles Modellieren mit Domain Specific Languages Slide 36 Agiles Modellieren mit Domain Specific Languages Slide 37 Agiles Modellieren mit Domain Specific Languages Slide 38 Agiles Modellieren mit Domain Specific Languages Slide 39 Agiles Modellieren mit Domain Specific Languages Slide 40
  • Gehören Sie zu den Ersten, denen das gefällt!

Agiles Modellieren mit Domain Specific Languages

  1. 1. Agiles Modellieren mit Domain Specific Languages - Eine DSL für eine generische WebApp - API Dominik Hirt efinia UG, Leipzig 20. IndustrieTag InformationsTechnologie IHK Halle-Dessau 20. November 2012
  2. 2. Agiles Modellieren mit Domain Specific Languages - Eine DSL‘s für eine generische WebApp - API Dominik Hirt efinia UG, Leipzig 20. IndustrieTag InformationsTechnologie IHK Halle-Dessau 20. November 2012
  3. 3. Dominik Hirt
  4. 4. http://www.efinia.de
  5. 5. Personal Finance Management
  6. 6. Das Modellieren mit Domain Specific Languages vereinfacht den Entwicklungs- prozess und erhöht die Qualität unserer Software.
  7. 7. ^[A-Z0-9._%-]+@(?:[A-Z0-9-]+.)+[A-Z]{2,4}$
  8. 8. ^[A-Z0-9._%-]+@(?:[A-Z0-9-]+.)+[A-Z]{2,4}$
  9. 9. SELECT COUNT(*) FROM Account JOIN Customer WHERE Account.CustID = Customer.ID WHERE Customer.Name LIKE ‘D%’
  10. 10. SELECT COUNT(*) FROM Account JOIN Customer WHERE Account.CustID = Customer.ID WHERE Customer.Name LIKE ‘D%’
  11. 11. 1.e2-e4 e7-e5 2.Lf1-c4 Sb8-c6 3.Dd1-f3 Lf8-c5 4.Df3xf7#
  12. 12. 1.e2-e4 e7-e5 2.Lf1-c4 Sb8-c6 3.Dd1-f3 Lf8-c5 4.Df3xf7#
  13. 13. Unified Modeling Language
  14. 14. Das Problem Browser Desktop Mobile Tablet API Server / Plattform
  15. 15. Die Ursachen Redundanz Abstraktion Wiederverwendung
  16. 16. Mythos Wiederverwendbarkeit ‣ Klassen ‣ Services ‣ Komponenten ‣ Modelle ‣ Prozesse
  17. 17. Model Driven Software Development Domäne Modell MetaModell
  18. 18. Ein [...] Metamodell stellt die Elemente einer Modellierungssprache und ihre Beziehungen in einem Modell dar. [Wikipedia]
  19. 19. grammar de.efinia.webapp.WebAPI with org.eclipse.xtext.xbase.Xbase generate webAPI "http://www.efinia.de/webapp/WebAPI" WebAPIModel: functions += Function* ; Function: 'function' name = ID '{' request=Request response=Response '}' ; Request: 'request' '{' 'url : ' url=URLType ('method :' method=HttpRequestMethod)? params+=Parameter* '}' ; URLType: '/'ID ; enum HttpRequestMethod: GET='GET' | POST='POST' ;
  20. 20. function createAccount { request { url : "/konto" method : PUT param name String param kontoNummer String 1..10 param blz String 8 } response { param accountId long 1..8 } } function updateAccount { request { url : "/konto/{accountId}" method : POST param name String } response { param accountId long 1..8 } } function deleteAccount { request { url : "/konto" method : DELETE param id long } response { param success long 1..8 error deleteAccountError } } error deleteAccountError "Konto löschen fehlgeschlagen"
  21. 21. function createAccount { request { url : "/konto" method : PUT RESTful Architektur param name String param kontoNummer String 1..10 param blz String 8 } response { param accountId long 1..8 } } function updateAccount { request { url : "/konto/{accountId}" method : POST RESTful Architektur param name String } response { param accountId long 1..8 } } function deleteAccount { request { url : "/konto" method : DELETE RESTful Architektur param id long } response { param success long 1..8 error deleteAccountError } } error deleteAccountError "Konto löschen fehlgeschlagen"
  22. 22. grammar de.efinia.dsl.MessagesDsl with org.eclipse.xtext.common.Terminals generate messagesDsl "http://www.efinia.de/dsl/MessagesDsl" Messages: (allMessages += Message)* ; Message: 'message' name = JavaIdentifier '{' (languages += Language)* '}' ; JavaIdentifier : ID ('.' ID)*; Language: name = ID ':' value = STRING ;
  23. 23. Vorher Nachher <?xml version="1.0" encoding="UTF-8"?> message impressum.pageTitle { <messages xmlns:xsi="http://www.w3.org/ de : "efinia | Impressum" 2001/XMLSchema-instance" } message impressum.title { xsi:noNamespaceSchemaLocation="efiniaMe de : "Impressum" ssages.xsd"> } message login.pageTitle { <message key="impressum.pageTitle"> de : "efinia | Login" <de>efinia | Impressum</de> } </message> message login.title { <message key="impressum.title"> de : "Willkommen bei efinia" <de>Impressum</de> } </message> <message key="login.pageTitle"> <de>efinia | Login</de> </message> <message key="login.title"> <de>Willkommen bei efinia</de> </message>
  24. 24. Vorher Nachher <?xml version="1.0" encoding="UTF-8"?> message impressum.pageTitle { <messages xmlns:xsi="http://www.w3.org/ de : "efinia | Impressum" 2001/XMLSchema-instance" } message impressum.title { xsi:noNamespaceSchemaLocation="efiniaMe de : "Impressum" ssages.xsd"> } message login.pageTitle { <message key="impressum.pageTitle"> de : "efinia | Login" <de>efinia | Impressum</de> } </message> message login.title { <message key="impressum.title"> de : "Willkommen bei efinia" <de>Impressum</de> } </message> <message key="login.pageTitle"> <de>efinia | Login</de> </message> <message key="login.title"> <de>Willkommen bei efinia</de> </message> 60%
  25. 25. grammar de.efinia.categories.Categories with org.eclipse.xtext.common.Terminals generate categories "http://www.efinia.de/Categories" CategoryModel: elements += AbstractElement* ; AbstractElement: Category | Keyword ; Category: 'category' name = STRING ('-->' parent=[Category|STRING])? ; Keyword: 'keyword' name = STRING '-->' category=[Category|STRING] ;
  26. 26. // Hauptkategorien category "Haus/Wohnung" category "PKW" category "Ernährung" // Unterkategorien category "Telefon" --> "Haus/Wohnung" category "Miete" --> "Haus/Wohnung" category "Strom" --> "Haus/Wohnung" category "Wasser" --> "Haus/Wohnung" category "Benzin" --> "PKW" category "Versicherung" --> "PKW" category "Steuern" --> "PKW" // Zuweisung von Schlüsselwörtern keyword "Telekom" --> "Telefon" keyword "Vodafone" --> "Telefon" keyword "O2" --> "Telefon" keyword "ePlus" --> "Telefon" keyword "Aldi" --> "Ernährung" keyword "Netto" --> "Ernährung" keyword "Edeka" --> "Ernährung"
  27. 27. Model Driven Software Development MetaModell lauffähige Modell Generator Artefakte Software java sql html Templates / js Transformationsregeln
  28. 28. Redundanz Single Source
  29. 29. MetaModell Modell Test
  30. 30. <Demo> powered by
  31. 31. ‣ Routine Implementierungen ‣ Boilerplate Code ‣ Java Bean Hölle
  32. 32. EFinTLModel: useCases+=UseCase* dialogs+=Dialog* Top Secr messages+=Message* segments+=Segment* datenElementGruppen+=DEG*; UseCase: et 'geschaeftsvorfall' name = ID '{' dialogs+=[Dialog]* '}'; Dialog: 'dialog' name = ID '{' messages+=[Message]* '}'; Message: 'nachricht' name = ID '{' 'type' ':' type=NachrichtenType 'sender' ':' sender=SenderType 'segments' '{' segments += [Segment] '}' '}'; Segment: 'segment' kennung=ID name=ID '{' datenElemente += (DE | DEGRef)* //datenGruppenElemente += (DEGRef)* '}'; DE: 'DE' name=ID ':' format=Format length=Length status=Quantity anzahl=INT restriktion=Constraint)?; DEGRef: 'DEG' reference=[DEG] ':' status=Quantity anzahl=INT; DEG: 'DEG' name = ID '{' gruppenDatenElemente+=(DE)* '}'; enum Format: an="an" | num="num" | dig="dig" | id="id"; MINMAX_LENGTH: min=INT '..' max=INT; MAX_LENGTH: ('..')? max=INT; EXACT_LENGTH: len=INT; enum Quantity: M='Muss' | K='Kann'; QualifiedName: ID ('.' ID)*; enum HBCIVersion : v201='201' | v210='210' | v220='220' | v300='300'; enum NachrichtenType : K='Kundennachricht' | B='Banknachricht'; enum SenderType : K='Kunde' | B='Bank';
  33. 33. blog.todo42.net
  34. 34. d.hirt@efinia.de

Aufrufe

Aufrufe insgesamt

1.150

Auf Slideshare

0

Aus Einbettungen

0

Anzahl der Einbettungen

3

Befehle

Downloads

3

Geteilt

0

Kommentare

0

Likes

0

×