Diese Präsentation wurde erfolgreich gemeldet.
Die SlideShare-Präsentation wird heruntergeladen. ×

Agiles Modellieren mit Domain Specific Languages

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Nächste SlideShare
Dojo Und Notes
Dojo Und Notes
Wird geladen in …3
×

Hier ansehen

1 von 40 Anzeige
Anzeige

Weitere Verwandte Inhalte

Ähnlich wie Agiles Modellieren mit Domain Specific Languages (20)

Anzeige

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

Hinweis der Redaktion

  • - Vor dem Start: alle Programme schliessen ausser keynote &amp; 2x Eclipse\n\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • wir haben unser B&amp;#xFC;ro in Leipzig\n
  • das ist zwar in Sachsen\n
  • aber zu Sachsen-Anhalt\n
  • und insbesondere zu Halle und zur Martin-Luther-Universit&amp;#xE4;t habe ich ein enges Verh&amp;#xE4;ltniss, da ich hier von 1992-1999 studiert habe.\n
  • Bevor ich fortfahre ... wer hat schon mit Domain Spec. Lang. gearbeitet ?\n
  • \n
  • \n
  • - die F&amp;#xE4;higkeit f&amp;#xFC;r interne DSL&amp;#x2018;s als Erfolgsgrund f&amp;#xFC;r Frameworks wie RoR, Grails\n- wor&amp;#xFC;ber ich heute aber nicht sprechen m&amp;#xF6;chte ist...\n
  • - agil klappt nicht mit UML ... das ist meine pers&amp;#xF6;nliche meinung\n jahrelang versucht, mit einer UML Spec. irgendwas anzufangen, weiterzuverarbeiten ... ohne Erfolg\n
  • - Schnittstellenbeschreibung wichtig f&amp;#xFC;r: \nTechnik\nOrganisation\nzwischenmenschlich\n
  • \n
  • \n
  • - MetaModell beschreibt Modell mit abstrakter Syntax\n- Modell beschreibt die Dom&amp;#xE4;ne mit konkreter Syntax\n- abstrakte Syntax wichtig f&amp;#xFC;r Verarbeitung der Modelle (konkrete Syntax) hingegen nicht\n\n
  • - als Grundlage f&amp;#xFC;r DSL&amp;#x2018;s dienen ,sprachbasierte Metamodelle&amp;#x2018;\n
  • - ggf. in Eclipse zeigen\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • XML Header sind nicht etwa &amp;#xFC;berfl&amp;#xFC;ssig, diese werden f&amp;#xFC;r/von den Editoren ben&amp;#xF6;tigt\n
  • \n
  • \n
  • \n
  • \n
  • - roundtrip live demo\n
  • - roundtrip live demo\n- CMD-H und danach das Dock-Icon anklicken\n\n
  • \n
  • - ca. 1000 Seiten Spec\n
  • \n
  • \n

×