1. Wo wollen wir hin?
1
(IT affine) Fachexperten sollen
2
zusammen ein System entwickeln, dass
3
sich langfristig anpassen lässt
4
und ständig Potentiale neuer IT-
Technik erschließt.
Konkret: Wirtschaftsinformatik-Studenten von Sowi rekrutieren
2. 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
3. Applikation + Bausteine
Applikation 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
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)
7. Prozess + Conditions
Prozess 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. 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?
9. Condition + Dokumentation
process 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. Process = Spezifikation
process 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. 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. 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. Spezifikation: UseCase Akt fuer10.000 Euro
Prozess
// 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. Spezifikation: UseCase Akt fuer10.000 Euro
Prozess
Command 1
Command
Condition
Command 2
Command
Command
Command 3
Command n
Command n + 1
RekoAkt ? RekoAkt „von Hand erstellt“ im
MPS
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. ModelRepository
ModelRepository Reko
checkIn
book
delete
checkOut
Delete + Update Queue ? scope / listView
ModelRepository Stammdaten
doit + transaction
Delete + Update Queue ?
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