developing enterprise applications with dsl's

Post on 27-Jun-2015

2.762 Views

Category:

Documents

5 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

(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

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

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

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?

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

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

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

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?

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)

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

}

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?

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

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

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

?

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

ModelRepository

ModelRepository Reko

ModelRepository Stammdaten

checkIn

delete

checkOut

scope / listView

book

Delete + Update Queue ?

Delete + Update Queue ?

do

it +

tra

nsa

ctio

n

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

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

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

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)

top related