15.02.2013 Aufrufe

b2aat6n

b2aat6n

b2aat6n

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

Listing 15<br />

Die öffentliche Schnittstelle<br />

verwenden.<br />

[Test]<br />

public void FIFO_verschachtelt() {<br />

sut.Enqueue(1);<br />

Assert.That(sut.Dequeue(),<br />

Is.EqualTo(1));<br />

sut.Enqueue(2);<br />

Assert.That(sut.Dequeue(),<br />

Is.EqualTo(2));<br />

sut.Enqueue(3);<br />

sut.Enqueue(4);<br />

Assert.That(sut.Dequeue(),<br />

Is.EqualTo(3));<br />

Assert.That(sut.Dequeue(),<br />

Is.EqualTo(4));<br />

}<br />

von automatisierten Tests. Die Skizze einer<br />

Warteschlange im Vorher-Nachher-Vergleich<br />

war schnell erstellt, siehe Abbildung 4.<br />

Doch bis das Umdrehen der Zeiger korrekt<br />

lief, mussten die Tests einige Male<br />

durchlaufen. Ich habe wirklich keine Ahnung,<br />

wie man so etwas ohne automatisierte<br />

Tests hinkriegen will. Na ja, ich habe<br />

irgendwann auch mal ohne automatisierte<br />

Tests entwickelt. Aber das ist glücklicherweise<br />

schon lange her. Listing 17 zeigt den<br />

Test für die Umkehr der Reihenfolge.<br />

Bei der Implementierung habe ich mit<br />

zwei Zeigern gearbeitet, die jeweils auf das<br />

aktuelle in Arbeit befindliche Element (current)<br />

sowie das nächste Element (next) verweisen.<br />

Da die Elemente jeweils mit Prev<br />

auf ihren Vorgänger verweisen, wird die<br />

Warteschlange von hinten nach vorne abgearbeitet.<br />

Daher ist jeweils das Element, welches<br />

im zurückliegenden Schleifendurch-<br />

[Abb. 4] Die Reihenfolge der<br />

Elemente umkehren.<br />

Listing 16<br />

lauf bearbeitet wurde, das nächste Element<br />

im Sinne der normalenVorwärts-Reihenfolge.<br />

Am Ende sind noch enqueue und dequeue<br />

zu vertauschen, siehe Listing 18.<br />

Die Methode habe ich über die öffentliche<br />

Schnittstelle getestet. Man hätte sicherlich<br />

auch hier die interne Repräsentation<br />

heranziehen können, ich glaube aber, dass<br />

die Tests dadurch schlecht lesbar geworden<br />

wären. Daher wird die Beispielwarteschlange<br />

mit enqueue aufgebaut, anschließend<br />

[Abb. 3] Prev-Zeiger bei der Queue.<br />

Die Queue implementieren.<br />

public class Queue<br />

{<br />

internal Element enqueue;<br />

internal Element dequeue;<br />

public void Enqueue(TElement element) {<br />

var newElement = new<br />

Element {Data = element};<br />

if (enqueue != null) {<br />

enqueue.Prev = newElement;<br />

}<br />

enqueue = newElement;<br />

if (dequeue == null) {<br />

dequeue = newElement;<br />

}<br />

}<br />

public TElement Dequeue() {<br />

if (dequeue == null) {<br />

throw new<br />

InvalidOperationException();<br />

}<br />

var result = dequeue.Data;<br />

dequeue = dequeue.Prev;<br />

if (dequeue == null) {<br />

enqueue = null;<br />

}<br />

return result;<br />

}<br />

}<br />

Listing 17<br />

umgedreht und dann mit dequeue überprüft,<br />

ob die Elemente in der richtigen, umgekehrten<br />

Reihenfolge geliefert werden.<br />

Fazit<br />

LÖSUNG<br />

Die Umkehr der Reihenfolge<br />

testen.<br />

[TestFixture]<br />

public class ReverseTests {<br />

private Queue sut;<br />

[SetUp]<br />

public void Setup() {<br />

sut = new Queue();<br />

}<br />

[Test]<br />

public void<br />

Eine_Queue_mit_drei_Elementen_kann<br />

_umgekehrt_werden() {<br />

sut.Enqueue(1);<br />

sut.Enqueue(2);<br />

sut.Enqueue(3);<br />

sut.Reverse();<br />

Assert.That(sut.Dequeue(),<br />

Is.EqualTo(3));<br />

Assert.That(sut.Dequeue(),<br />

Is.EqualTo(2));<br />

Assert.That(sut.Dequeue(),<br />

Is.EqualTo(1));<br />

}<br />

}<br />

Listing 18<br />

Die Reihenfolge umkehren.<br />

public void Reverse() {<br />

var current = dequeue;<br />

Element next = null;<br />

while(current != null) {<br />

var prev = current.Prev;<br />

current.Prev = next;<br />

next = current;<br />

current = prev;<br />

}<br />

var dummy = enqueue;<br />

enqueue = dequeue;<br />

dequeue = dummy;<br />

}<br />

Bei der testgetriebenen Entwicklung hat<br />

sich für mich bestätigt, wie nützlich die<br />

Planung auf Papier ist. Mir ist deutlich geworden,<br />

dass die Auswahl der Reihenfolge<br />

der Tests bei TDD wichtig ist. Daher sollte<br />

man in schwierigeren Szenarien immer<br />

erst Testfälle sammeln und diese dann in<br />

eine sinnvolle Reihenfolge bringen, bevor<br />

man mit dem ersten Test beginnt. [ml]<br />

www.dotnetpro.de dotnetpro.dojos.2011 43

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!