Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

Domänenspezifische Sprachen: Sprich domänisch!

Domänenspezifische Sprachen: Sprich domänisch!

Domänenspezifische Sprachen (kurz DSLs) sind Sprachen, welche den Entwickleralltag erheblich erleichtern. etwa im Routing den Posteingangs, in der Generierung von Persistenzschichten, der Abbildung von Versicherungsmathematik, dem Verfassen von Einkaufslisten oder der Steuerung des eigenen Hauses. Bei der Definition der Domäne sind keine Grenzen gesetzt. Durch die Nutzung von DSLs konzentriert sich der Entwickler auf das Wesentliche, d.h. die Domäne und die Frage nach dem "Was soll getan werden" und belastet Anwender nicht mit langweiligen Boilerplatecode und den technischen Details der Frage "Wie soll es getan werden". Am Anfang steht eine kleine Grammatik, am Ende ergibt sich eine lauffähige Entwicklungsumgebung mit Codevervollständigung, Refactoring u.v.a.m.

In diesem Vortrag werden sowohl die relevanten Schritte vorgeführt als auch konkrete Beispiele aus der Praxis gezeigt.

Markus Amshove

March 28, 2016
Tweet

More Decks by Markus Amshove

Other Decks in Programming

Transcript

  1. h1 { text-align: center; color: red; } h2 { text-align:

    center; color: red; } p { text-align: center; color: red; }
  2. if (beschlagwortung.DokumentenKlasse.Equals("ABRECH") && beschlagwortung.DokumentnTyp.Equals("RECHNUNG")) { foreach (var gruppe in this.gruppen)

    { if (HatPamSperreBeiGruppe(vorgang.Status, gruppe)) { zuweisung = new ZuweisungGruppe(gruppe)) } } } if (vorgang.BasisKennzeichen.Equals(Versis.KENNZEICHEN_BASISTARIF)) { zuweisung = new ZuweisungBenutzer("AMSHOVE"); } if (vorgang.BasisKennzeichen.Equals(Versis.KENNZEICHEN_STANDARDTARIF)) { var name = vorgang.Name; if (NameIstImBereich(name, 'A', 'M')) { zuweisung = new ZuweisungBenutzer("MUSTERMANN"); } if (Name.IstImBereich(name, 'N', 'Z')) { zuweisung = new ZuweisungBenutzer("MUSTERFRAU"); } } zuweisung = null;
  3. Klammer "Kennzeichen Standardtarif" { BasisKennzeichen = "S" Regel "Name A

    bis M" => Benutzer "MUSTERMANN" { Name zwischen "A" und "M" } Regel "Name N bis Z" => Benutzer "MUSTERFRAU" { Name zwischen "N" und "Z" } }
  4. % Kommentare % Durchschnittliche Kommentare Methoden pro Klasse Maximale Komplexität

    Maximale Tiefe Durchschnittliche Tiefe Durchschnittliche Komplexität 35 7 2 3
  5. Compiled from "Main.java" public class Main { public Main(); Code:

    0: aload_0 1: invokespecial #1 4: return public static void main(java.lang Code: 0: getstatic #2 3: ldc #3 5: invokevirtual #4 8: return } public class Main { public static void main(String[] args) { System.out.println("Hello World"); } } =>
  6. public void methodeEins() { int a = 5; } public

    void methodeZwei() { a = 10; }
  7. public void methodeEins() { int a = 5; } public

    void methodeZwei() { a = 10; }
  8. Person Markus ist Maennlich public interface Person extends EObject {

    String getName(); Geschlecht getGeschlecht(); }
  9. Modell: elemente+=AbstraktesModellElement*; AbstraktesModellElement: Person | Gruss; Person: 'Person' name=ID 'ist'

    geschlecht=Geschlecht; enum Geschlecht: Maennlich | Weiblich; Gruss: 'Hallo' person=[Person] '!';
  10. Modell: elemente+=AbstraktesModellElement*; AbstraktesModellElement: Person | Gruss; Person: 'Person' name=ID 'ist'

    geschlecht=Geschlecht; enum Geschlecht: Maennlich | Weiblich; Gruss: 'Hallo' person=[Person] '!';
  11. acceptor.accept(issue, 'Schreibe groß', 'Schreibt den Namen groß.', 'image.png') [ val

    dokument = it.xtextDocument val ersterBuchstabe = dokument.get(issue.offset, 1) dokument.replace(issue.offset, 1, ersterBuchstabe.toUpperCase) ]
  12. acceptor.accept(issue, 'Schreibe groß', 'Schreibt den Namen groß.', 'image.png') [ val

    dokument = it.xtextDocument val ersterBuchstabe = dokument.get(issue.offset, 1) dokument.replace(issue.offset, 1, ersterBuchstabe.toUpperCase) ] Identifier
  13. def dispatch void format(Person person, extension IFormattableDocument document) { person.append[newLine]

    } def dispatch void format(Gruss gruss, extension IFormattableDocument document) { gruss.append[newLine] }
  14. private def generiereGruss(Gruss gruss) { return ''' Hallo «generiereGeschlecht(gruss.person.geschlecht)» «gruss.person.name»!

    ''' } private def generiereGeschlecht(Geschlecht geschlecht) { return switch (geschlecht) { case MAENNLICH: "Herr" case WEIBLICH: "Frau" } }
  15. Person Markus ist Maennlich Person Tina ist Weiblich Hallo Tina!

    Hallo Markus! => Hallo Herr Markus! Hallo Frau Tina!