Software Engineering II 2012

Aufgabe 1 [Design-Patterns] (10 Punkte)

Wählen sie aus den nachfolgend aufgelisteten Design-Patterns zwei aus und erläutern sie diese näher:

  • Strategy (Strategie)
  • Facade (Fassade)
  • Composite (Kompositum)
  • Singleton (Einzelstück)
  • Mediator (Vermittler)
  • Factory Method (Fabrikmethode)

Aufgabe 2 [Observer-Pattern] (5 Punkte)

Das Observer-Pattern ist durch folgendes Klassendiagramm gegeben:

(… Bild muss noch portiert werden …)

Nehmen sie an, KonkreterObserver sei bereits als Beobachter von KonkretesSubjekt registriert. Nun soll KonkretesSubjekt den Beobachter über den aktuellen Wert eines seiner Attribute benachrichtigen. Dieser Wert wird von der Methode getStatus() zurückgegeben.

Notieren sie die komplette Reihenfolge der Methodenaufrufe, um eine solche Benachrichtigung im Sinne des Observer-Patterns zu realisieren. Vermerken sie dabei auch, von wem die jeweilige Methode aufgerufen wird.

BONUS: Notieren sie diese Interaktion mit Hilfe eines UML-Sequenzdiagramms.

Aufgabe 3 [SIB-Implementierung] (15 Punkte)

Bis auf import-Anweisungen sei ein SIB folgendermaßen definiert:

@SIBClass("se2/klausur/WhatSIB")
public class WhatSIB implements Executable {
  public static final String[] BRANCHES = {SIB.ERROR, SIB.DEFAULT};
  public ContextExpression value = new ContextExpression("${input}", Integer.class, false);
  public ContextKey result = new ContextKey("result", Scope.LOCAL, true);
  
  public String trace(ExecutionEnvironment env) {
    try {
      Integer inc = (Integer) value.evaluate(env);
      inc++;
      env.put(result, inc);
      return SIB.DEFAULT;
    } catch (Exception e) {
      return SIB.ERROR;
    }
  }
}
  1. Welche Rolle spielt die Annotation in Zeile 1?
  2. Welche Branches und welche Parameter sind im SIB-Inspektor-Fenster des jABC-Tools sichtbar, wenn im SLG-Editor (Hauptfenster) ein Exemplar des WhatSIB durch Anklicken aktiviert ist?
  3. Wodurch wird die trace-Methode aufgerufen?
  4. Auf welcher Datenstruktur basiert der Ausführungskontext env?
  5. Welche Ausführungssemantik hat der Methodenaufruf value.evaluate(env)?
  6. Welche Ausführungssemantik hat der Methodenaufruf env.put(result, inc)?
  7. Welche Bedeutung hat der Rückgabewert vom Typ String der trace-Methode?
  8. Welche Funktionalität realisiert der WhatSIB? (Eine verbale Erklärung genügt. Benutzen sie aber die korrekten Termini zur Bezeichnung der Eingabe- und Ausgabewerte.)

Aufabe 4 [Testen] (15 Punkte)

  1. Erläutern Sie die Begriffe Black-Box- und White-Box-Testen.
  2. Wenn ein Test mit optimal gewählten Testfällen (bei 100% Abdeckung) keine Fehler offenbart, ist dann die getestete Software sicher fehlerfrei? Begründen sie!
  3. Schreiben sie für die Klasse in Abbildung 2 einen Zweigüberdeckungstest (C1) mit JUnit.
public class Coverage {
  public int x = 0;
  public int y = 0;
  public int z = 0;
  
  public void methode01(int a, int b) {
    if (a < b) {
      x = b;
      z = 1;
    }
    
    if (a + b < 10) {
      y = x + z;
    }
    else {
      y = x + a;
    }
  }
}

Aufgabe 5 [Enterprise Applications] (15 Punkte)

  1. Was verstehen sie unter dem Begriff Inconsistent Read?
  2. Definieren sie den Begriff der Transition im Sinne der Architektur von Enterprise Applications. Erläutern sie die Bedeutung aller definierenden Eigenschaften.

Aufgabe 6 [Das statische Typsystem] (20 Punkte)

Die Sprache JAUS+ ist folgendermaßen definiert.

Syntax in erweiterter BNF:

  • n ::= 0 | [1-9][0-9]*
  • x ::= m | p
  • b ::= true | false
  • e ::= n | b | x | (e+e) | (e*e) | !e

Typsprache in BNF:

  • t ::= int | boolean

Typregeln:

$ \texttt{[INT]}\frac{}{A~\vdash~n:~\texttt{int}} $
$ \texttt{[BOOL]}\frac{}{A~\vdash~b:~\texttt{boolean}} $
$ \texttt{[VAR]}\frac{x:~t\in A}{A~\vdash~x:~t} $
$ \texttt{[ADD]}\frac{A~\vdash~e_1:~\texttt{int}~~~~~A~\vdash~e_1:~\texttt{int}}{A~\vdash~(e_1+e_2):~\texttt{int}} $
$ \texttt{[MULT]}\frac{A~\vdash~e_1:~\texttt{int}~~~~~A~\vdash~e_1:~\texttt{int}}{A\vdash~(e_1*e_2):~\texttt{int}} $
$ \texttt{[NOT]}\frac{A~\vdash~e:~\texttt{boolean}}{A~\vdash~!e:~\texttt{boolean}} $
$ \texttt{[DIS]}\frac{A~\vdash~e_1:~\texttt{boolean}~~~~~A~\vdash~e_1:~\texttt{boolean}}{A~\vdash~(e_1+e_2):~\texttt{boolean}} $
$ \texttt{[KON]}\frac{A~\vdash~e_1:~\texttt{boolean}~~~~~A~\vdash~e_1:~\texttt{boolean}}{A~\vdash~(e_1*e_2):~\texttt{boolean}} $

Berechnungsregeln:

$ \texttt{[B-ADD]}\frac{}{(n_1+n_2)\rightarrow m}~~\texttt{mit}~~\lsem m\rsem_N=\lsem n_1\rsem_N+\lsem n_2\rsem_N $
$ \texttt{[B-MULT]}\frac{}{(n_1*n_2)\rightarrow m}~~\texttt{mit}~~\lsem m\rsem_N=\lsem n_1\rsem_N+\lsem n_2\rsem_N $
$ \texttt{[B-TRUE]}\frac{}{\texttt{!true}~\rightarrow~\texttt{false}}$
$ \texttt{[B-FALSE]}\frac{}{\texttt{!false}~\rightarrow~\texttt{true}}$
$ \texttt{[B-DIS-TT]}\frac{}{(\texttt{true}+\texttt{true})~\rightarrow~\texttt{true}}$
$ \texttt{[B-DIS-TF]}\frac{}{(\texttt{true}+\texttt{false})~\rightarrow~\texttt{true}}$
$ \texttt{[B-DIS-FT]}\frac{}{(\texttt{false}+\texttt{true})~\rightarrow~\texttt{true}}$
$ \texttt{[B-DIS-FF]}\frac{}{(\texttt{false}+\texttt{false})~\rightarrow~\texttt{false}}$
$ \texttt{[B-KON-TT]}\frac{}{(\texttt{true}*\texttt{true})~\rightarrow~\texttt{true}}$
$ \texttt{[B-KON-TF]}\frac{}{(\texttt{true}*\texttt{false})~\rightarrow~\texttt{false}}$
$ \texttt{[B-KON-FT]}\frac{}{(\texttt{false}*\texttt{true})~\rightarrow~\texttt{false}}$
$ \texttt{[B-KON-FF]}\frac{}{(\texttt{false}*\texttt{false})~\rightarrow~\texttt{false}}$
$ \texttt{[B-NOT]}\frac{e~\rightarrow~e'}{!e~\rightarrow~!e'}$
$ \texttt{[B+L]}\frac{e_1~\rightarrow~e'_1}{(e_1+e_2)~\rightarrow~(e'_1+e_2)}$
$ \texttt{[B*L]}\frac{e_1~\rightarrow~e'_1}{(e_1*e_2)~\rightarrow~(e'_1*e_2)}$
$ \texttt{[B+R]}\frac{e~\rightarrow~e'_1}{(v+e)~\rightarrow~(v+e')}$
$ \texttt{[B*R]}\frac{e~\rightarrow~e'_1}{(v*e)~\rightarrow~(v*e')}$
  1. Welche der folgenden Ausdrücke sind in JAUS+ syntaktisch korrekt? (Ankreuzen!)
    • (m+p)
    • (17+(m*2))
    • (p!+(p*false))
    • (p+!(p*false))
  2. Es seien die Variablen m und p wie folgt definiert und initialisiert:
    int m = 6;
    boolean p = true;

    Notieren sie die dadurch definierte Typumgebung!
  3. Weisen sie die Typkorrektheit des Ausdrucks e=!(!p+(true*p)) mit Hilfe eines Herleitungsbaums nach.
  4. Wird die Information der Typkorrektheit zur Compile-Zeit oder zur Laufzeit gewonnen? Welche Fehler sind dadurch zu welchem Zeitpunkt ausgeschlossen?
  5. Werten sie diesen Ausdruck e mit Hilfe der Berechnungsregeln aus und rechtfertigen sie den ersten Berechnungsschritt mit einem Herleitungsbaum.