Top Banner
(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
20

Developing enterprise applications with dsl's

Jun 27, 2015

Download

Documents

danielfuture

An introduction in german how dsl's can be used to develop enterprise applications ..
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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)