Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Agiles Modellieren mit             Domain Specific Languages -                 Eine DSL für eine              generische We...
Agiles Modellieren mit             Domain Specific Languages -                 Eine DSL‘s für eine              generische ...
Dominik Hirt
http://www.efinia.de
Personal Finance Management
Das Modellieren mitDomain Specific Languagesvereinfacht den Entwicklungs-prozess und erhöht dieQualität unserer Software.
^[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 CustomerWHERE Account.CustID = Customer.IDWHERE Customer.Name LIKE ‘D%’
SELECT COUNT(*)FROM Account JOIN CustomerWHERE Account.CustID = Customer.IDWHERE Customer.Name LIKE ‘D%’
1.e2-e4 e7-e52.Lf1-c4 Sb8-c63.Dd1-f3 Lf8-c54.Df3xf7#
1.e2-e4 e7-e52.Lf1-c4 Sb8-c63.Dd1-f3 Lf8-c54.Df3xf7#
Unified ModelingLanguage
Das ProblemBrowser   Desktop      Mobile   Tablet                                   API           Server / Plattform
Die UrsachenRedundanz     Abstraktion   Wiederverwendung
Mythos Wiederverwendbarkeit‣   Klassen‣   Services‣   Komponenten‣   Modelle‣   Prozesse
Model Driven Software DevelopmentDomäne          Modell        MetaModell
Ein [...] Metamodell stellt die Elementeeiner Modellierungssprache und ihreBeziehungen in einem Modell dar.               ...
grammar de.efinia.webapp.WebAPI with org.eclipse.xtext.xbase.Xbasegenerate webAPI "http://www.efinia.de/webapp/WebAPI"WebA...
function createAccount {	    request {	    	    url : "/konto"	    	    method : PUT        param name String        param...
function createAccount {	    request {	    	    url : "/konto"	    	    method : PUT                       RESTful Archite...
grammar de.efinia.dsl.MessagesDsl with org.eclipse.xtext.common.Terminalsgenerate messagesDsl "http://www.efinia.de/dsl/Me...
Vorher                                  Nachher<?xml version="1.0" encoding="UTF-8"?>    message impressum.pageTitle {<mes...
Vorher                                  Nachher<?xml version="1.0" encoding="UTF-8"?>    message impressum.pageTitle {<mes...
grammar de.efinia.categories.Categories with org.eclipse.xtext.common.Terminalsgenerate categories "http://www.efinia.de/C...
// Hauptkategoriencategory "Haus/Wohnung"category "PKW"category "Ernährung"// Unterkategoriencategory "Telefon" --> "Haus/...
Model Driven Software DevelopmentMetaModell                                                       lauffähige  Modell      ...
RedundanzSingle Source
MetaModell          Modell             Test
<Demo>powered by
‣   Routine Implementierungen‣   Boilerplate Code‣   Java Bean Hölle
EFinTLModel:     useCases+=UseCase*     dialogs+=Dialog*                                                   Top Secr     me...
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
Upcoming SlideShare
Loading in …5
×

Agiles Modellieren mit Domain Specific Languages

745 views

Published on

  • Be the first to comment

  • Be the first to like this

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, Leipzig20. 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, Leipzig20. 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 mitDomain Specific Languagesvereinfacht den Entwicklungs-prozess und erhöht dieQualitä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 CustomerWHERE Account.CustID = Customer.IDWHERE Customer.Name LIKE ‘D%’
  10. 10. SELECT COUNT(*)FROM Account JOIN CustomerWHERE Account.CustID = Customer.IDWHERE Customer.Name LIKE ‘D%’
  11. 11. 1.e2-e4 e7-e52.Lf1-c4 Sb8-c63.Dd1-f3 Lf8-c54.Df3xf7#
  12. 12. 1.e2-e4 e7-e52.Lf1-c4 Sb8-c63.Dd1-f3 Lf8-c54.Df3xf7#
  13. 13. Unified ModelingLanguage
  14. 14. Das ProblemBrowser Desktop Mobile Tablet API Server / Plattform
  15. 15. Die UrsachenRedundanz Abstraktion Wiederverwendung
  16. 16. Mythos Wiederverwendbarkeit‣ Klassen‣ Services‣ Komponenten‣ Modelle‣ Prozesse
  17. 17. Model Driven Software DevelopmentDomäne Modell MetaModell
  18. 18. Ein [...] Metamodell stellt die Elementeeiner Modellierungssprache und ihreBeziehungen in einem Modell dar. [Wikipedia]
  19. 19. grammar de.efinia.webapp.WebAPI with org.eclipse.xtext.xbase.Xbasegenerate 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.Terminalsgenerate 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.Terminalsgenerate 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. // Hauptkategoriencategory "Haus/Wohnung"category "PKW"category "Ernährung"// Unterkategoriencategory "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örternkeyword "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 DevelopmentMetaModell lauffähige Modell Generator Artefakte Software java sql html Templates / js Transformationsregeln
  28. 28. RedundanzSingle 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

×