Testfragen

3 (6 Punkte) Geben Sie für die nebenstehenden Aktivitätsdiagramme jeweils die Menge aller möglichen Aktivitätsfolgen an.
[width=0.8]fork.eps

Geben Sie jeweils ein Diagramm D an (das möglicherweise aus mehreren Aktivitäten besteht), für das die beiden nebenstehenden Diagramme
a) äquivalent sind,     b) nicht äquivalent sind.
Begründen Sie Ihre Aussage durch Angabe der Mengen der möglichen Aktivitätsfolgen.
[width=0.9]equiv.eps

2 (4 Punkte) Welches dieser Diagramme gibt die Assoziation zwischen Studenten und Sitzplätzen (in diesem Raum) korrekt wieder? Begründen Sie, warum das andere falsch ist.

a) $ \fbox{\textrm{Student}}
\begin{array}[b]{c p{1cm} c}
0..1 & & 1 \\  \hline
\end{array}\fbox{\textrm{Sitzplatz}}
$      b) $ \fbox{\textrm{Student}}
\begin{array}[b]{c p{1cm} c}
1..* & & 1..* \\  \hline
\end{array}\fbox{\textrm{Sitzplatz}}
$

Modellieren Sie in einem Klassendiagramm diesen Zusammenhang zwischen Klassen A, B, C: jedes A-Objekt ist entweder assoziiert mit genau einem B-Objekt oder assoziiert mit genau einem C-Objekt. Benutzen Sie dazu eine zusätzliche (abstrakte) Klasse S, die in passender Beziehung zu A, B, C steht.

Welche Bestandteile gehören zum Entwurfmuster Beobachter, welche Methoden haben diese?











Skizzieren Sie eine typische Benutzung dieses Musters (Reihenfolge der Methodenaufrufe).











Die Methode setChanged() beeinflußt die Wirkung einer anderen Methode. Welcher? Wie? Warum (zwei Gründe)?




























(Bearbeiten Sie zunächst die Aufgabe auf Seite 3, dann diese hier!) Wie bestimmt man mit Hilfe eines Besuchers die Summe aller Schlüsselwerte eines Baumes?

Welche Bestandteile hat eine sinnvolle Fehlermeldung, wozu dienen diese jeweils (was passiert, wenn sie fehlen)?

Welche Beziehungen sind zwischen den Methoden einer Klasse wünschenswert?

Wie kann man abmessen oder ausrechnen, ob das zutrifft?





Wie kann man ein Programm ändern, um diese Beziehungen herzustellen oder zu verbessern?

Zeigen Sie an einem Beispiel, daß die von Ihnen vorgeschlagene Änderung tatsächlich die von Ihnen genannten Kennzahlen verbessert.

Die folgende Datenstruktur Baum mit Typparameter K soll durch das Entwurfsmuster Kompositum abgebildet werden.

Geben Sie die dazu nötigen Interfaces und Klassen sowie ihre Beziehungen an.

Nennen Sie die Aufgaben eines Quelltextverwaltungssystemes (wie CVS oder SVN).
















Was sind die wesentlichen Aufgaben eines Quelltextverwaltungssystems wie z. B. CVS?

In CVS wird zwischen Binär- und Textdateien unterschieden. Welche Leistungen sind nur für Textdateien verfügbar? Warum ist das so? Warum fällt die fehlende Unterstützung von Binärdateien selten ins Gewicht? Betrachten Sie folgende Klasse:

public class Zeichenobjekt {
    int startx, starty, endx, endy; int breite, hoehe; ...
}

Wir bemerken die Code Smells primitive obsession und Datenklumpen.

Geben Sie jeweils die Symptome an sowie mögliche Auswirkungen und einen Verbesserungsvorschlag

primitive Obsession:









Datenklumpen:









Definieren Sie den Begriff Entwurfsmuster.







Eine Klasse enthält Funktionen, die Summe und Produkt eines Arrays von Zahlen bestimmen.

static int sum (int [] a) {
  int result = 0;
  for (int i = 0; i<a.length; i++) { result = result + a[i]; }
  return result;
}
static int product (int [] a) {
  int result = 1;
  for (int i = 0; i<a.length; i++) { result = result * a[i]; }
  return result;
}
Sie sollen diesen Code durch Benutzung des Strategie-Musters verbessern. Ergänzen Sie:
interface Folder {
  ...


}
static int fold (Folder f, int [] a) {
  int result = ... 
  for (int i = 0; i<a.length; i++) {
    result = ...
  }
  return result;
}
class Sum_Folder ...                 {
  ...


}
static int sum (int [] a) { return fold ( ...            , a ); }
class Product_Folder ...               {
  ...


}
static int product (int [] a) { return fold ( ...           , a ); }

Definieren Sie die Code-Metrik nach Halstead. (Geben Sie die Formel an und definieren Sie die darin benutzen Bezeichner o, a, A.)












Man möchte den Metrik-Wert für ein Programm dadurch verbessern, daß man Änderungen ausführt, die sich nur auf den Parameter a auswirken.

Geben Sie dafür ein Beispiel an. In welche Richtung ändert sich a, in welche Richtung ändert sich die Metrik?
















Die Halstead-Metrik ist nur auf Anweisungsfolgen (z. B. Implementierungen einzelner Methoden) anwendbar. Durch welches (objektorientierte) Refactoring kann man Metrik-Werte verbessern? (Welcher Parameter wird dabei wie geändert?) Für die eben definieren Baumstruktur soll das Entwurfsmuster Iterator angeboten werden.

Geben Sie die dazu nötigen Interfaces/Klassen und ihre Beziehungen an. (Die Methoden sollen vollständig deklariert, aber nicht implementiert werden.)

Beschreiben Sie, wie man mit Hilfe eines Iterators die Summe aller Schlüsselwerte eines Baumes bestimmt.

1 (6 Punkte) Ein Softwareprojekt hat einen Umfang von 140 Personen-Stunden. 7 Entwickler arbeiten an diesem Projekt. Jeder Entwickler arbeitet 8 Stunden pro Tag. Die Entwickler sollen ihre Arbeit täglich einmal abstimmen. Jeder Kommunikationsvorgang (zwischen zwei Entwicklern) dauert 1 Stunde.

Wieviele Tage benötigt das Projekt unter diesen Szenarien:

  1. Das Projekt ist nicht strukturiert (jeder Entwickler muß mit jedem kommunizieren).

  2. Das Projekt ist streng hierarchisch strukturiert (als vollständiger binärer Baum: 1 großer Chef, 2 kleine Chefs, 4 Entwickler. Jeder kommuniziert nur mit seinem direkten Vorgesetzten, die Chefs entwickeln nichts)

Welche allgemeinen Folgerungen kann man für das Projektmanagement ableiten?

Inwieweit ist es zutreffend oder gerechtfertigt, daß die Chefs „nichts tun``?

Was ist der Vertrag eines Unterprogramms (einer Methode)? Zwischen welchen Parteien besteht das Vertragsverhältnis?




Was ist die Invariante einer Klasse?







Wodurch kann man es erreichen (oder erleichtern), daß die Klasseninvariante tatsächlich erhalten bleibt?









Wir bezeichnen die Teilfolge-Relation mit , Beispiel: abcaabbcc; und die Längenfunktion mit |⋅|, Beispiel: | abc| = 3.

Definieren Sie die Kohäsionsmetrik nach Henderson-Sellers und erläutern Sie die Bedeutung der dabei vorkommenden Parameter.
















Welches sind der kleinste und der größte mögliche Wert dieser Metrik?
Welcher ist anzustreben bzw. zu vermeiden und warum? Skizzieren Sie jeweils ein Beispielprogramm, das diesen Wert erreicht.

Was ist der Vertrag eines Unterprogramms?












Was ist die Invariante einer Klasse?









Welche Nutzen hat die Verwendung solcher Verträge in der Software-Entwicklung?









Wie kann man sich von der Einhaltung solcher Verträge überzeugen? (Zwei Möglichkeiten -- vergleichen Sie beide!)









Wieviele Testfälle werden mindestens für eine Pfadüberdeckung benötigt? (Gefragt ist nur nach der Anzahl.)

Finden Sie für das Programm P jeweils eine möglichst kleine Menge von Testfällen für eine

Bei der Planung eines Softwareprojektes sollte man Meilensteine vorsehen. Nennen Sie drei wichtige Forderungen an Meilensteine.

Vervollständigen Sie: Ein Netzplan ist ein Graph mit

Definieren Sie die Begriffe

Warum sind die kritischen Pfade so benannt?





Was ist primitive obsession, welche negativen Auswirkungen hat sie, was kann man dagegen tun? Woran erkennt man den code smell primitive obsession?

Wie kann man ihn beheben?

Wieso erhöht sich dadurch die statische Sicherheit des Programmes?

Im nebenstehenden Programm P sind a, b, c, d Variablen für ganze Zahlen und swap vertauscht die Inhalte der Argumente.
if (a < b) { swap (a, b); }
if (c < d) { swap (c, d); }
if (b < c) { swap (b, c); }

5 (4 Punkte) Stellen Sie sich vor, ein Web-Browser (ähnlich Mozilla usw.) wäre neu zu entwickeln. Geben Sie je ein Beispiel für den Funktionsumfang eines

Prototypen. Welche (Teile von) Anwendungsfällen können mit Ihren Prototypen durchgeführt werden?

Zur Qualitätssicherung werden Teilprodukte der Software-Entwicklung

Definieren Sie die beiden Begriffe.

Geben Sie zwei Beispiele für die Qualitätssicherung von Teilprodukten an, die selbst keine Programme sind.

Was ist Refactoring?

Welcher Zusammenhang besteht zwischen Testen und Refactoring? Was ist Refactoring?





Vervollständigen Sie diese Tabelle. Fügen Sie noch einen Code Smell Ihrer Wahl hinzu.

Code Smell Auswirkung Reparatur
duplizierter Code









primitive
obsession









Kommentar

















Welche Code Smells stellen Sie im gegebenen Quelltext fest? Nennen Sie jeweils den Namen, die Symptome, die Auswirkungen (warum ist der Smell gefährlich?) und schlagen Sie eine Verbesserung vor.

Teilprodukte müssen während der Entwicklung verwaltet werden. Welchen Status kann ein Teilprodukt haben? Ergänzen und definieren Sie:

Welche Status-Änderungen sind außer dem Normalablauf (von oben nach unten) möglich? Eine Klasse beginnt so:

class Zeichenobjekt { ...
    int typ;    ...                                     
    static final int LINIE=1;
    static final int RECHTECK=2;
    static final int ELLIPSE=3;    ...
}

Welcher Code Smell wird auftreten, wenn man Objekte dieser Klasse benutzt?









Was sollte stattdessen verwendet werden? Skizzieren Sie eine bessere Lösung.














Warum ist der Code dann besser erweiterbar? Definieren Sie die Begriffe

Erklären Sie den Unterschied zwischen Testen und Verifizieren.

Was ist test driven development?

Was ist Refactoring?

Welcher Zusammenhang besteht zwischen Testen und Refactoring?

Welcher Zusammenhang besteht zwischen Entwurfsmustern und Refactoring?

7 (4 Punkte) Für x∈{a, b, c, d} und n∈{1, 2, 3, 4} bezeichnen wir mit xn den Wert der Variablen x direkt nach Ausführung der Zeile n des Programms P, sowie mit x0 den Wert vor der ersten Zeile.

Es gilt immer: a2b2c2d2. Begründen Sie: a3b3a3c3a3d3.

Lösungsweg: Unterscheiden Sie zwei Fälle. Drücken Sie für jeden Fall die Zusammenhänge zwischen a2, b2, c2, d2 und a3, b3, c3, d3 durch Gleichungen und Ungleichungen aus. (Beispiel: d2 = d3.)

Gilt immer a4b4c4d4? (Beweis oder Gegenbeispiel.)

Für die Baumstruktur soll zusätzlich das Entwurfsmuster Besucher implementiert
werden, wobei der Resultattyp R des Besuchers ein weitere Typparameter ist.

Benutzen Sie dieses Muster zum Bestimmen des größten Schlüssels eines Baumes.

Bei der Benutzung von Quelltextarchiven (z. B. CVS) kann es zu Konflikten kommen. Woran und wann (bei welcher Aktion) erkennt wer (Server oder Client), daß ein solcher Konflikt vorliegt?









Welche Arbeitsschritte sind (von wem?) zur Lösung eines solchen Konfliktes auszuführen?







In welchen Fällen läßt sich das automatisieren? Welche Rechnung stellt wer (Server/Client) dabei an?









Welche Rolle spielt dabei das Bestimmen einer längsten gemeinsamen Teilfolge?

Warum erschwert der Code Smell „lange Methode`` den Unit-Test?

public class Zeichenobjekt {
    // Merkmale eines Zeichenobjektes 
    int startx, starty, endx, endy;
    int breite, hoehe; int typ;    ...
    static final int LINIE=1; static final int RECHTECK=2;
    static final int ELLIPSE=3;    ...
}

public class Zeichenflaeche {
  public Vector objekte = new Vector();
  public Zeichenobjekt zo; ...
  public void paint(Graphics g) {
      Graphics2D g2 = (Graphics2D) g;
      for (int i = 0; i < objekte.size(); i++) {
          zo = (Zeichenobjekt) objekte.elementAt(i);
          if (zo.fuellen == false) {
              switch (zo.getTyp()) {
              case Zeichenobjekt.RECHTECK:
                  int xr1 = zo.getStartx();
                  int xr2 = zo.getEndx();
                  int yr1 = zo.getStarty();
                  int yr2 = zo.getEndey();
                  if (xr1 < xr2) {
                      if (yr1 < yr2) {
                          g2.setColor(zo.getC());
                          //von links oben nach rechts unten
                          g2.draw(new Rectangle2D.Float
                                  (xr1, yr1, xr2 - xr1, yr2 - yr1)); 
                      } else {
                          g2.setColor(zo.getC());
                          //von links unten nach rechts oben
                          g2.draw(new Rectangle2D.Float
                                  (xr1, yr2, xr2 - xr1, yr1 - yr2)); 
                      }
                  } else ...
              case Zeichenobjekt.ELLIPSE: ...

Johannes Waldmann 2011-07-07