developing enterprise applications with dsl's

20
(IT affine) Fachexperten sollen zusammen ein System entwickeln, dass sich langfristig anpassen lässt und ständig Potentiale neuer IT- Technik erschließt. 1 2 3 4 Wo wollen wir hin? Konkret: Wirtschaftsinformatik-Studenten von Sowi rekrutieren

Upload: danielfuture

Post on 27-Jun-2015

2.762 views

Category:

Documents


5 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Developing enterprise applications with dsl's

(IT affine) Fachexperten sollen zusammen ein System entwickeln, dass sich langfristig anpassen lässt und ständig Potentiale neuer IT-Technik erschließt.

1

2

3

4

Wo wollen wir hin?

Konkret: Wirtschaftsinformatik-Studenten von Sowi rekrutieren

Page 2: Developing enterprise applications with dsl's

Fachexperten Gemeinsames Verständnis & Nachvollziehbarkeit

Prozess/Workflow zu einem Objekt (derAblauf)

Eine Wizzard

Eine Ansicht (Tabelle, Form, Tab)

Undo/Redo – ein Kommando

Nachvollziehbarkeit von SystemElementen & Abläufen = Dokumentation

= EINE SPRACHE für beteiligte Personen

Page 3: Developing enterprise applications with dsl's

Applikation + Bausteine

Command

Undo / Redo(Vorgang?)

Datenstrukturen

Rechnung, RechnungsPositionLieferschein, LieferscheinPositionVertragBestandsKonto

Prozess

Prozess als Akt?

Conclusion „Auswählen“Conclusion „Abbruch“Exception occured

Applikation besteht aus

Condition WertSumme=LieferSumme

Condition WertSumme=LieferSumme

Condition WertSumme=LieferSumme

Page 4: Developing enterprise applications with dsl's

DatenStruktur + Commands

(1) Verändert Datenstruktur

Command

Undo / Redo(Vorgang?)

Datenstrukturen

Rechnung, RechnungsPositionLieferschein, LieferscheinPositionVertragBestandsKonto

Conclusion OKConclusion CANCELConclusion Exception

(2) Evtl. Datenstruktur speicherncheckIn()addToSaveQueue()

(1) Verändert DatenstrukturCommand = Tätigkeit?

Page 5: Developing enterprise applications with dsl's

All or nothing!

Command

Page1

Page2

Kommando erfolgreich(FINAL_OK_CONCLUSION)

Kommando abgebrochen(FINAL_CANCEL_CONCLUSION)

Kommando technische Ausnahme(FINAL_EXCEPTION_CONCLUSION)

Kommando kann mehrere Seiten haben, wird aber in definiertem Zustand beendet: Undo/Redo - Möglichkeit

Page 6: Developing enterprise applications with dsl's

Applikation + Bausteine

Datenstrukturen

Rechnung, RechnungsPositionLieferschein, LieferscheinPositionVertragBestandsKonto

Prozess

Prozess als Akt! Zustand des Prozesses im Akt vermerkt!

Condition WertSumme=LieferSumme

Condition WertSumme=LieferSumme

Condition WertSumme=LieferSumme

(1) Conditions prüfen Datenstruktur

(2) Conditions schaltet Prozess + enable/disable Commands + prüfen Rollen + Validieren Zustand

Condition WertSumme=LieferSumme

Condition WertSumme=LieferSumme

Page 7: Developing enterprise applications with dsl's

Prozess + Conditions

Command: Rechnung Hinzufügen

State1

State3

Erfolgreich ? Abbruch?Ausnahme?

Rechnung HinzufügenFormular

Conditions beschreiben, wie weiter im Prozess zu verfahren ist.

Conditions beschreiben, ob Commands zu Verfügung stehen, oder nicht.

Condition

State2

Prozess Engine

(1) isEnabled?

Condition

Condition

Page 8: Developing enterprise applications with dsl's

Datenstrukturen

Entity 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 direkt

SORTED / UNSORTED / CONTAINMENT / OPPOSITE / DEPRECATED / SIZE / READONLY? / KEY / INDEX / NOTNULL? / NULLINIT / AUTOGEN_KEY by insert?

Page 9: Developing enterprise applications with dsl's

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)

Page 10: Developing enterprise applications with dsl's

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>>

}

Page 11: Developing enterprise applications with dsl's

Process Startprocess 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

}

Interface as contract?

Spezifikationen?

Page 12: Developing enterprise applications with dsl's

Vorgehensweise

(1) Datenstrukturen + Prozess + Commands anlegenÜberblick – nichts ausprogrammieren

(2) Spezifikation (UseCase) anlegen und ausbauenLernen -> 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

Page 13: Developing enterprise applications with dsl's

Prozess

Spezifikation: UseCase Akt fuer10.000 Euro

Command

RekoAkt

Command

Command

Command

Command n + 1

Command

Command

Command

Command

Command

Command

Command

Command

Command

Command

Command

Command

Command

Command

Command n

Command 3

Command 1

Command 2

// Hier werden Input-Objekte durch Kommandos mit Fake-UserInterfaces erstellt, nicht durch object-Builder

RekoAkt rekoAkt = call RechnungsKontrolle.erstelle Akt( )

call RechnungsKontrolle.rechnung hinzufuegen(rekoAkt)

with page {

conclusion „Save“ {

Rechnung rechnung = getSelected(Rechnung.class)

rechnung.lieferant = … // rechnung.betrag = …

return new arraylist{rechnung}

})

call RechnungsKontrolle.proforma wählen(rekoAkt)

with page {

conclusion „Select“ {

return repo.findProformasById(…)

})

assert rekoAkt in RechnungsKontrolle is status Abgeschlossen

Condition

Page 14: Developing enterprise applications with dsl's

Prozess

Spezifikation: UseCase Akt fuer10.000 Euro

Command

RekoAkt

Command

Command

Command

Command n + 1

Command

Command

Command

Command

Command

Command

Command

Command

Command

Command

Command

Command

Command

Command

Command n

Command 3

Command 1

Command 2

Condition

RekoAkt „von Hand erstellt“ im MPS

?

Page 15: Developing enterprise applications with dsl's

Commands: Rechnung editieren

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) {

}

Objekt ? Was ? Objekt?

Aufruf mit UI, TestUI, ohne UI

Page 16: Developing enterprise applications with dsl's

ModelRepository

ModelRepository Reko

ModelRepository Stammdaten

checkIn

delete

checkOut

scope / listView

book

Delete + Update Queue ?

Delete + Update Queue ?

do

it +

tra

nsa

ctio

n

Page 17: Developing enterprise applications with dsl's

Inhalt eines Model

(3) Views für Artikel, Lieferanten

-Tabellen-Formulare

(1) Datenstrukturen

ArtikelLieferant

StammDaten Package = MODEL + VIRTUAL FOLDERS

(2) Repository + Mapping

AbfragenMapping

(4) Ablauf + Commands

- Commands- Workflow- Berechtigung- DOKU + SPECIFICATION

Page 18: Developing enterprise applications with dsl's

Daten & Datenstrukturen: Datentypen Value Objects / Entity ModelRepository, Queries und Mappings Cache

Logik & Programmfluss: Session Commands Prozess & Condition

Anzeige und Steuerung Application, Views und Links Batchjob Testing

Page 19: Developing enterprise applications with dsl's

UIViews + action links

BusinessLogic

Objects and FieldsProcesses / WorkflowsCommandsValidation

Persistance-Layer

Repository + Methods inside Repositorymit myBatis + rawSQL ?

Simple Java Interfaces Simple Java Interfaces

Forms

morepo

ObjectFlow

(dependency gegen * JodaTime, * BaseLang,* Collections)

ModelRepository

checkin ObjectNetworkscheckout ObjectNetworks (RW / RO)update Accounts fast

OBJECTFLOW 2012

OBJECTFLOW 2015

3 DSLs – 2 Plain-Java Schnittstellen

Page 20: Developing enterprise applications with dsl's

3 DSLs in 2013

F4_interfaces (plain java)

F4_runtime ( Vaadin/JavaFX 2 commons ??)

Language: Forms4UI Views

Language: Objectflowprocess, command, condition, entity, …

Language: ManMapPersistance + Query

MM_interfaces (plain java)

MM_runtime

OF_runtime (JDBC/CDO commons ?)

Use as RIA (serialization) ??

FatForms4 (Gen)

FatObjectflow (Gen)

SpringMiniMap (Gen)