Wo wollen wir hin?1(IT affine) Fachexperten sollen            2zusammen ein System entwickeln, dass     3sich langfristig ...
FachexpertenGemeinsames Verständnis & NachvollziehbarkeitProzess/Workflow                 zu einem    Objekt              ...
Applikation + BausteineApplikation besteht aus Datenstrukturen                      Command                  Prozess      ...
DatenStruktur + Commands                                     Command                                     Undo / Redo      ...
All or nothing!  Command          Kommando kann mehrere Seiten haben, wird aber in                   definiertem Zustand b...
Applikation + Bausteine                                          Prozess                                          Prozess ...
Prozess + ConditionsProzess Engine                                                                                 Rechnun...
DatenstrukturenEntity Rechnung {    decimal rechnungsSumme;              //    datetime createdAt;    date rechnungsDatum;...
Condition + Dokumentationprocess RechnungsKontrolle with RekoAkt rekoAkt on status rekoAkt.status {<< process definition h...
Process = Spezifikationprocess RechnungsKontrolle with RekoAkt rekoAkt on status rekoAkt.status {    Angelegt [ validation...
Interface as contract?    Process Start                                                                                   ...
Vorgehensweise(1)   Datenstrukturen + Prozess + Commands anlegen      Überblick – nichts ausprogrammieren(2)   Spezifikati...
Spezifikation:                UseCase Akt fuer10.000 EuroProzess                                      // Hier werden Input...
Spezifikation:                UseCase Akt fuer10.000 EuroProzess               Command 1               Command            ...
Commands: Rechnung editieren                                                                                              ...
ModelRepository                      ModelRepository Reko                                                               ch...
Inhalt eines ModelStammDaten Package = MODEL + VIRTUAL FOLDERS (1) Datenstrukturen                           (2) Repositor...
Daten & Datenstrukturen:   Datentypen   Value Objects / Entity   ModelRepository, Queries und Mappings   CacheLogik & ...
3 DSLs – 2 Plain-Java Schnittstellen                                                                                      ...
3 DSLs in 2013Language: Forms4                                                      Language: ManMapUI Views              ...
Nächste SlideShare
Wird geladen in …5
×

Developing enterprise applications with dsl's

3.122 Aufrufe

Veröffentlicht am

An introduction in german how dsl's can be used to develop enterprise applications ..

0 Kommentare
1 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

Keine Downloads
Aufrufe
Aufrufe insgesamt
3.122
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
2.737
Aktionen
Geteilt
0
Downloads
3
Kommentare
0
Gefällt mir
1
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie
  • Wirtschaftsinformatiker ? Problem Programmierer zu bekommen ?
  • Was haben wir bisher erreicht? Was fehlt noch? Integrieren haben wir gut Teilweise Umgesetzt / sehr gut Forms3, Objectflow auch ok (beides braucht Erweiterungen und refactoring, wir wissen jetzt wo) Domäne fehlt Zusammenarbeiten fehlt
  • Developing enterprise applications with dsl's

    1. 1. Wo wollen wir hin?1(IT affine) Fachexperten sollen 2zusammen ein System entwickeln, dass 3sich langfristig anpassen lässt 4und ständig Potentiale neuer IT-Technik erschließt. Konkret: Wirtschaftsinformatik-Studenten von Sowi rekrutieren
    2. 2. FachexpertenGemeinsames Verständnis & NachvollziehbarkeitProzess/Workflow zu einem Objekt (derAblauf) Eine WizzardEine Ansicht (Tabelle, Form, Tab)Undo/Redo – ein Kommando Nachvollziehbarkeit von SystemElementen & Abläufen = Dokumentation = EINE SPRACHE für beteiligte Personen
    3. 3. Applikation + BausteineApplikation besteht aus Datenstrukturen Command Prozess Undo / Redo Prozess als Akt? Rechnung, RechnungsPosition (Vorgang?) Lieferschein, LieferscheinPosition Condition WertSumme=LieferSumme Vertrag Conclusion „Auswählen“ BestandsKonto Conclusion „Abbruch“ Condition WertSumme=LieferSumme Exception occured Condition WertSumme=LieferSumme
    4. 4. DatenStruktur + Commands Command Undo / Redo (Vorgang?) Conclusion OK Conclusion CANCEL Conclusion ExceptionDatenstrukturenRechnung, RechnungsPositionLieferschein, LieferscheinPosition Command = (1) Verändert DatenstrukturVertragBestandsKonto Tätigkeit? (2) Evtl. Datenstruktur speichern checkIn() addToSaveQueue()
    5. 5. All or nothing! Command Kommando kann mehrere Seiten haben, wird aber in definiertem Zustand beendet: Undo/Redo - Möglichkeit Page1 Kommando erfolgreich (FINAL_OK_CONCLUSION) Page2 Kommando abgebrochen (FINAL_CANCEL_CONCLUSION) Kommando technische Ausnahme (FINAL_EXCEPTION_CONCLUSION)
    6. 6. Applikation + Bausteine Prozess Prozess als Akt! Zustand des Prozesses im Akt vermerkt! (2) Conditions schaltet Prozess + enable/disable Commands + prüfen Rollen Datenstrukturen + Validieren Zustand Rechnung, RechnungsPosition Lieferschein, LieferscheinPosition Condition WertSumme=LieferSumme Vertrag BestandsKonto Condition WertSumme=LieferSumme Condition WertSumme=LieferSumme (1) Conditions prüfen Datenstruktur
    7. 7. Prozess + ConditionsProzess Engine Rechnung Hinzufügen Command: Rechnung Hinzufügen Formular Condition (1) isEnabled? Erfolgreich ? Abbruch? State Ausnahme? 1 Condition State2 Conditions beschreiben, wie weiter im Prozess zu verfahren ist. Conditions beschreiben, ob Commands zu Verfügung stehen, oder nicht. Condition State3
    8. 8. DatenstrukturenEntity Rechnung { decimal rechnungsSumme; // datetime createdAt; date rechnungsDatum; string bemerkung; status rechnungsStatus; Lieferant lieferant; // reference list<Positionen> positionen; // kann owning sein oder reference // als option angeben}rechnungsStatus = [ Angelegt, Abgeschlossen, Korrigiert, Archiviert ]// prozess status als option -> keine lese/schreibrechte direktSORTED / UNSORTED / CONTAINMENT / OPPOSITE / DEPRECATED / SIZE / READONLY? / KEY / INDEX / NOTNULL? / NULLINIT / AUTOGEN_KEY by insert?
    9. 9. Condition + Dokumentationprocess RechnungsKontrolle with RekoAkt rekoAkt on status rekoAkt.status {<< process definition here >>condition RechnungsWertSumme=ProformaWertSumme „Die RechnungsSumme muss der ProformaWertSumme entsprechen um den Akt abschliessen zu können“ LM.testEqual(rekoAkt.rechnungWarenWert, rekoAkt.proformaWarenWert, rekoAkt.originalRechnung.aufbau.tolAbsolut) „Editieren sie den RechnungsPositionen / ProformaPositionen“condition Administrator „Sie benötigen AdministratorRechte“ IMpreisService.hasRole(„REKO“, „ADMIN“) „Kontaktieren Sie ihren Vorgesetzen (Solveig?)“condition kann ueberschreiben „Der Akt muss abgeschlossen sein und Sie benötigen Administrator-Rechte“ rekoAkt in RechnungsKontrolle is status Abgeschlossen && rekoAkt in RechnungsKontrolle is Administrator „?“• checkt auf rekoAkt == null -> false• rekoAkt „VariableReference“ vom Prozess• is / is status als SprachErweiterung• Verschiedene Ansichten des Prozesses möglich (RollenAnsicht)
    10. 10. Process = Spezifikationprocess RechnungsKontrolle with RekoAkt rekoAkt on status rekoAkt.status { Angelegt [ validationConditions ]: <<options>> on trigger [condition] Rechnung editieren on trigger [condition] Proforma editieren // -> auto [RechnungsWertSumme=ProformaWertSumme] -> Abgeschlossen Abgeschlossen [RechnungsWertSumme=ProformaWertSumme]: <<options>> on entry: [condition] Rechnung abschliessen // wenn command abbricht-> zustand nicht betreten <<command>> <<conclusion>> -> <<state>> on exit: // wenn command abbricht-> zustand nicht verlassen Korrigiert [ ]: END <<command>>}
    11. 11. Interface as contract? Process Start Spezifikationen?process RechnungsKontrolle with RekoAkt rekoAkt on status rekoAkt.status { creators and read only views: on trigger [condition] RekoAkt aus Rechnung erzeugen on trigger [condition] RekoAkt leer erzeugen on trigger [condition] RekoAkte anzeigen Angelegt [ validationConditions ]: on trigger [condition] Rechnung editieren on trigger [condition] Proforma editieren auto [RechnungsWertSumme=ProformaWertSumme] -> Abgeschlossen Abgeschlossen [RechnungsWertSumme=ProformaWertSumme]: on entry: [condition] Rechnung abschliessen // wenn command abbricht-> zustand nicht betreten <<command>> <<conclusion>> -> <<state>> on exit: // wenn command abbricht-> zustand nicht verlassen}
    12. 12. Vorgehensweise(1) Datenstrukturen + Prozess + Commands anlegen Überblick – nichts ausprogrammieren(2) Spezifikation (UseCase) anlegen und ausbauen Lernen -> Datenstrukturen ausbauen, Prozess verfeinern, abstimmen mir prozess owner? Input Objekte -> Ziel Objekte(3) Validierungsregeln fuer Objekte anlegen (TestKriterien) Lernen?(4) Mit Programmierer Kommandos implementieren(5) Mit Programmierer UserInterface implementiern(6) Spezifikation ausführen und mit Regeln prüfen (Ständig, auch bei Änderungen! )(7) Mit Validierungsregeln Spezifikation testen, evtl. Regeln in Prozess übernehmen
    13. 13. Spezifikation: UseCase Akt fuer10.000 EuroProzess // Hier werden Input-Objekte durch Kommandos mit Fake-UserInterfaces erstellt, nicht durch object-Builder Command 1 Command RekoAkt rekoAkt = call RechnungsKontrolle.erstelle Akt( ) call RechnungsKontrolle.rechnung hinzufuegen(rekoAkt) Command 2 Command with page { conclusion „Save“ { Rechnung rechnung = getSelected(Rechnung.class) Command Command 3 rechnung.lieferant = … // rechnung.betrag = … return new arraylist{rechnung} }) Command n call RechnungsKontrolle.proforma wählen(rekoAkt) with page { conclusion „Select“ { Command n + 1 return repo.findProformasById(…) }) assert rekoAkt in RechnungsKontrolle is status Abgeschlossen RekoAkt Condition
    14. 14. Spezifikation: UseCase Akt fuer10.000 EuroProzess Command 1 Command Condition Command 2 Command Command Command 3 Command n Command n + 1 RekoAkt ? RekoAkt „von Hand erstellt“ im MPS
    15. 15. Commands: Rechnung editieren Aufruf mit UI, TestUI, ohne UI Objekt ? Was ? Objekt?command Rechnung editieren (Rechnung rech) (new session, as tab) { // default, no new session, prompt << command fields >> command init: <statementlist> page „Rechnung editieren“ userinterface RechnungsKopfEditor form: // bound Object: list<Rechnung> page init: <statementlist> set scopes: <statementList> // set necessary scopes -> get them from ModelRepository conclusion: „Save“ (OK_CONCLUSION): flag „message here“ when (condition) abort „message here“ when (condition) // beendet dieses command mit conclusion exception done page 2 „Cancel“ (CANCEL_CONCLUSION): … … … catch(IOException) {}
    16. 16. ModelRepository ModelRepository Reko checkIn book delete checkOut Delete + Update Queue ? scope / listView ModelRepository Stammdatendoit + transaction Delete + Update Queue ?
    17. 17. Inhalt eines ModelStammDaten Package = MODEL + VIRTUAL FOLDERS (1) Datenstrukturen (2) Repository + Mapping Artikel Abfragen Lieferant Mapping (3) Views für Artikel, (4) Ablauf + Commands Lieferanten - Commands -Tabellen - Workflow -Formulare - Berechtigung - DOKU + SPECIFICATION
    18. 18. Daten & Datenstrukturen: Datentypen Value Objects / Entity ModelRepository, Queries und Mappings CacheLogik & Programmfluss: Session Commands Prozess & ConditionAnzeige und Steuerung Application, Views und Links Batchjob Testing
    19. 19. 3 DSLs – 2 Plain-Java Schnittstellen OBJECTFLOW 2012 morepo Forms Persistance-LayerUI Repository + Methods inside Repository mit myBatis + rawSQL ?Views + action links OBJECTFLOW 2015Simple Java Interfaces Simple Java Interfaces ObjectFlow ModelRepository BusinessLogic (dependency gegen * JodaTime, * BaseLang, checkin ObjectNetworks Objects and Fields * Collections) checkout ObjectNetworks (RW / RO) update Accounts fast Processes / Workflows Commands Validation
    20. 20. 3 DSLs in 2013Language: Forms4 Language: ManMapUI Views Persistance + QueryFatForms4 (Gen) SpringMiniMap (Gen) F4_runtime ( Vaadin/JavaFX 2 commons ??) MM_runtime F4_interfaces (plain java) MM_interfaces (plain java) Use as RIA (serialization) ?? Language: Objectflow process, command, condition, entity, … FatObjectflow (Gen) OF_runtime (JDBC/CDO commons ?)

    ×