b2aat6n
b2aat6n
b2aat6n
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