View
2.754
Download
5
Category
Tags:
Preview:
DESCRIPTION
An introduction in german how dsl's can be used to develop enterprise applications ..
Citation preview
(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)
Recommended