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