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.

[Abb. 4] Der Flow<br />

für die Vorgehens-<br />

weise nach Mine.<br />

[Abb. 5] Die bewährte Projektstruktur.<br />

muss. Ich erstelle die Verzeichnisse, lege<br />

Projekte an, setze Referenzen, ändere Ausgabepfade,<br />

alles ist immer gleich. Wenn Sie<br />

jetzt denken, dass das eine Wiederholung<br />

ist, welche gegen das Prinzip Don't Repeat<br />

Yourself (DRY) verstößt, dann haben Sie<br />

mich erwischt. Eigentlich sollte ich diese<br />

immer wiederkehrenden Handgriffe automatisieren.<br />

Ein Vorteil der immer gleichen Struktur<br />

ist, dass ich mich in allen Projekten sofort<br />

zurechtfinde. Alles liegt immer am gleichen<br />

Platz. Um eine solche Konvention zu etablieren,<br />

muss sie sich allerdings zunächst in<br />

der Praxis bewähren. Denn wenn das nicht<br />

der Fall ist, nützt die schönste Konvention<br />

nichts.Wenn ich regelmäßig Projektstrukturen<br />

anlege und verwende, zeigt sich, ob im<br />

Detail noch Verbesserungen möglich sind.<br />

Die in Abbildung 5 gezeigte Struktur hat<br />

sich in vielen Projekten, Übungen und Seminaren<br />

bewährt. Die Pfeile zeigen, welche<br />

Projekte referenziert werden. Beim Mogelzettel<br />

habe ich mich für zwei Implementierungsprojekte<br />

sowie ein Testprojekt entschieden.<br />

Bei der Implementierung unterscheide<br />

ich zwischen der Logik und dem<br />

Host. Im Host wird lediglich die Konsolenschnittstelle<br />

zur Verfügung gestellt. Die beiden<br />

Parameter der Kommandozeile werden<br />

als Dateinamen interpretiert. Durch<br />

die Abtrennung des Hosts lässt sich die Logik<br />

des Mogelzettels auch einmal in einem<br />

GUI-Host verwenden.<br />

Diesmal habe ich keine komponentenorientierte<br />

Architektur gewählt, da ich mich<br />

auf das Problem der Indizes konzentrieren<br />

wollte. Dennoch sind in der Solution mehrere<br />

Projekte mit klar definierten Aufgaben<br />

vorhanden. Für eine komponentenorientierte<br />

Lösung kämen die Kontrakte hinzu,<br />

Listing 4<br />

Den Rand beim Rand-Trick entfernen.<br />

internal static int[,] RandEntfernen(int[,] array) {<br />

var result = new int[array.GetLength(0) - 2,array.GetLength(1) - 2];<br />

for (var i = 1; i < array.GetLength(0) - 1; i++) {<br />

for (var j = 1; j < array.GetLength(1) - 1; j++) {<br />

result[i - 1, j - 1] = array[i, j];<br />

}<br />

}<br />

return result;<br />

}<br />

Listing 5<br />

Erst Indizes bestimmen, dann prüfen.<br />

LÖSUNG<br />

und die einzelnen Komponenten würden je<br />

eine eigene Solution erhalten.<br />

internal static int[,] MogelzettelBerechnen(Size groesse, IEnumerable minenKoordinaten) {<br />

var result = new int[groesse.Height,groesse.Width];<br />

foreach (var mine in minenKoordinaten) {<br />

var indizes = new[] {<br />

new Point(mine.X - 1, mine.Y - 1),<br />

new Point(mine.X - 1, mine.Y),<br />

new Point(mine.X - 1, mine.Y + 1),<br />

new Point(mine.X, mine.Y - 1),<br />

new Point(mine.X, mine.Y + 1),<br />

new Point(mine.X + 1, mine.Y - 1),<br />

new Point(mine.X + 1, mine.Y),<br />

new Point(mine.X + 1, mine.Y +1),<br />

};<br />

foreach (var index in indizes) {<br />

if ((index.X >= 0) && (index.X < groesse.Width) && (index.Y >= 0) &&<br />

(index.Y < groesse.Height)) {<br />

result[index.Y, index.X]++;<br />

}<br />

}<br />

}<br />

return result;<br />

}<br />

www.dotnetpro.de dotnetpro.dojos.2011 25<br />

Fazit<br />

Der Minesweeper-Mogelzettel ist eine zeitlich<br />

überschaubare Übung. Der Umgang<br />

mit den Indizes bietet ein reichhaltiges Betätigungsfeld.<br />

Falls Sie es also bislang noch<br />

nicht selbst versucht haben: Mogeln Sie<br />

mal wieder beim Minesweeper, aber nicht<br />

beim Übungspensum! [ml]<br />

[1] Stefan Lieser: Mogeln mit EVA, Daten umformen,<br />

dotnetpro 6/2010, Seite 116ff.<br />

www.dotnetpro.de/A1006dojo<br />

[2] Golo Roden: yield return, yield break, yield...<br />

Golos scharfes C, dotnetpro 5/2010, S. 122f.<br />

www.dotnetpro.de/A1005ScharfesC<br />

[3] Stefan Lieser: Kettenreaktion, INotifyProperty-<br />

Changed-Logik automatisiert testen,<br />

dotnetpro 5/2010, S. 108ff.<br />

www.dotnetpro.de/A1005dojo

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!