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.

Event-Based Components<br />

So trennt man Feu-er-wehr<br />

Einen Textumbruch mit Silbentrennung<br />

zu implementieren,<br />

hört sich schwierig an. Und das<br />

ist es auch, wenn man an eine<br />

Textverarbeitung wie Word denkt. Allerdings<br />

gab die Aufgabenstellung mit dem<br />

Hinweis auf NHunspell [1] einen Tipp für<br />

das Problem der Silbentrennung.<br />

Als Erstes sind die Anforderungen zu klären.<br />

Im Falle des Textumbruchs können die<br />

Anforderungen sehr gut anhand von Beispielen<br />

dargestellt werden. Der folgende<br />

Satz soll etwa auf eine Breite von zehn Zeichen<br />

umbrochen werden:<br />

Bauer Klaus erntet Kartoffeln.<br />

Dann soll das Ergebnis folgendermaßen<br />

aussehen:<br />

Bauer<br />

Klaus erntetKartoffeln.<br />

Das Beispiel enthält keine besonderen<br />

Schwierigkeiten oder Spezialfälle. Aber genau<br />

die gilt es natürlich ebenfalls in den<br />

Blick zu nehmen. So stellt sich beispielsweise<br />

die Frage, wie mit Zeilenumbrüchen<br />

verfahren werden soll, die im Eingangstext<br />

schon vorhanden sein können:<br />

Bauer Klaus<br />

erntet<br />

Kartoffeln.<br />

Das Ergebnis soll das gleiche sein wie<br />

oben. Bereits vorhandene Zeilenumbrüche<br />

werden also ignoriert. Das soll auch für<br />

mehrere hintereinander stehende Zeilenumbrüche<br />

gelten. Auch Absätze werden<br />

damit ignoriert. Diese Vereinfachung ist<br />

der Tatsache geschuldet, dass es hier nur<br />

um eine Übung geht.<br />

Als Nächstes ist Leerraum zu betrachten.<br />

Wenn im Satz zusätzliche Leerzeichen stehen,<br />

sollen diese erhalten bleiben, es soll<br />

also keine Normalisierung stattfinden. Allerdings<br />

sollen Leerzeichen am Anfang einer<br />

Zeile entfernt werden, weil das Ergebnis<br />

sonst doch sehr fragwürdig aussieht.<br />

Dazu ein Beispiel, in dem die Leerzeichen<br />

durch einen Punkt ersetzt sind, damit sie<br />

besser zu erkennen sind:<br />

Bauer•••••••Klaus••erntet•Kartoffeln.<br />

Wenn dieser Satz auf eine Breite von<br />

zehn Zeichen unter Beibehaltung der Leerzeichen<br />

umbrochen wird, ergibt sich zunächst<br />

folgendes Ergebnis:<br />

Bauer•••••<br />

••Klaus••<br />

erntet•<br />

Kartoffeln.<br />

Dabei sind die Leerzeichen in der zweiten<br />

Zeile vor dem Wort „Klaus“ jedoch störend.<br />

Folglich sollen sie entfernt werden,<br />

mit folgendem Ergebnis:<br />

Bauer•••••<br />

Klaus••erntet•Kartoffeln.<br />

Leerzeichen am Zeilenanfang werden also<br />

entfernt, innerhalb des Satzes oder auch<br />

am Ende bleiben sie erhalten. Um die Anforderungen<br />

für die Übung möglichst einfach<br />

zu halten, lassen wir es dabei zunächst<br />

bewenden.<br />

Algorithmus<br />

Nachdem die Anforderungen präzisiert<br />

sind, müssen Sie eine Idee für einen Algorithmus<br />

entwickeln. Dabei steht die Frage<br />

im Vordergrund, wie das Problem algorithmisch<br />

gelöst werden kann. Es geht noch<br />

nicht darum, wie der Algorithmus konkret<br />

zu implementieren ist und welche Funktionseinheiten<br />

dabei eine Rolle spielen.<br />

Die erste Idee für den Textumbruch sah<br />

bei mir folgendermaßen aus:<br />

❚ Zerlege den Text in Wörter.<br />

❚ Zerlege die Wörter in Silben.<br />

❚ Fasse die Silben neu zu Zeilen zusammen.<br />

Dabei bemerkte ich schnell, dass die<br />

Zerlegung des Textes in „Wörter“ nicht<br />

wirklich präzise beschreibt, was zu tun ist.<br />

Denn zwischen den Wörtern steht Leerraum,<br />

der erhalten bleiben muss. Als Oberbegriff<br />

für Wort und Leerraum habe ich<br />

Zeichenfolge gewählt. Der Text wird also<br />

zunächst in Zeichenfolgen zerlegt. Das<br />

lässt auch Spielraum für mögliche Erweiterungen.<br />

Schließlich können im Text auch<br />

Zahlen als Zeichenfolgen auftreten, die<br />

möglicherweise besonders behandelt werden<br />

müssen. Ein weiteres Beispiel sind<br />

Interpunktionszeichen, auch diese kann<br />

man unter den Überbegriff Zeichenfolgen<br />

stellen.<br />

Nachdem Zeichenfolgen in Silben zerlegt<br />

sind, müssen die Silben so zu Zeilen zusammengefasst<br />

werden, dass die einzelnen<br />

Zeilen höchstens die maximale Länge haben.<br />

Dabei stehen die einzelnen Silben natürlich<br />

nicht für sich. Denn Silben können<br />

nur innerhalb der Zeile einfach so aneinandergereiht<br />

werden. Am Zeilenende muss<br />

ein Trennstrich ergänzt werden, wenn die<br />

letzte Silbe der Zeile zum selben Wort gehört<br />

wie die erste Silbe der Folgezeile. Daher<br />

muss der Zusammenhang zwischen Silben<br />

und Wörtern erhalten bleiben. Offensichtlich<br />

genügt es daher nicht, das Zusammenfassen<br />

zu Zeilen auf Basis eines Stroms<br />

von Silben zu implementieren.<br />

Entwurf<br />

LÖSUNG<br />

Das Konzept der Event-Based Components einzuüben – das war das Ziel dieses dojos. Die konkrete Aufgabe bestand<br />

darin, eine Komponente für den Textumbruch mit Silbentrennung zu entwickeln. Zum Glück hat Stefan Lieser ein eigenes<br />

Test-GUI entwickelt, denn damit konnte er viele Fehler entdecken und beseitigen.<br />

Aus diesenVorüberlegungen entstand mein<br />

Entwurf für eine EBC-Architektur (Event-<br />

Based Components). Abbildung 1 zeigt die<br />

folgenden vier Aktionen:<br />

❚ Zerlegen in Zeichenfolgen,<br />

❚ Zeichenfolgen in Silben trennen,<br />

❚ Zusammenfassen zu Zeilen,<br />

❚ Zusammenfassen zu Text.<br />

Diese vier Aktionen sind zu einer EBC-<br />

Aktivität zusammengefasst, welche die Aktionen<br />

umschließt. Aufgabe der Aktivität ist<br />

es, die Input- und Outputpins der beteiligten<br />

Aktionen zu verbinden. Die Aktivität<br />

selbst verfügt über je einen Input- und Outputpin<br />

und verbirgt die internen Details der<br />

Realisierung. Sollten später Aktionen hin-<br />

www.dotnetpro.de dotnetpro.dojos.2011 51

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!