docs/DesignPatterns

annotate detailed-observer.tex @ 29:f3b4061ec3b4

added new content
author meillo@marmaro.de
date Sun, 08 Jul 2007 20:49:06 +0200
parents ddd8378a539e
children 8bdd4e54885e
rev   line source
meillo@11 1 % @file
meillo@28 2 % @brief Referat DesignPatterns `Observer'
meillo@11 3 % @author markus schnalke <meillo@marmaro.de>
meillo@11 4 % @since 2007-05-30
meillo@11 5
meillo@11 6
meillo@28 7 \documentclass[a4paper]{scrartcl}
meillo@11 8
meillo@28 9 \usepackage[utf8]{inputenc}
meillo@11 10 \usepackage{ngerman}
meillo@11 11 \usepackage{graphicx}
meillo@11 12 \usepackage[automark]{scrpage2}
meillo@11 13
meillo@28 14 \setkomafont{sectioning}{\normalfont\normalcolor\bfseries}
meillo@28 15 \setlength{\parindent}{0em}
meillo@28 16 \setlength{\parskip}{1.0ex plus 1.0ex minus 0.5ex}
meillo@28 17 \pagestyle{scrheadings}
meillo@28 18 \setcounter{tocdepth}{2}
meillo@11 19
meillo@11 20 \begin{document}
meillo@11 21
meillo@11 22
meillo@11 23
meillo@11 24
meillo@11 25
meillo@28 26 %%%% Titlepage %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
meillo@28 27 \begin{titlepage}
meillo@28 28 \title{Observer-Pattern}
meillo@28 29 \author{Markus Schnalke}
meillo@28 30 \date{2007-07-04}
meillo@11 31
meillo@11 32
meillo@28 33 \thispagestyle{empty}
meillo@11 34
meillo@11 35
meillo@28 36 \begin{flushright}
meillo@11 37
meillo@28 38 \rule[8cm]{0cm}{0cm}
meillo@28 39 {\Huge Design Pattern\\ \textbf{Observer}}
meillo@11 40
meillo@28 41 \rule[2cm]{0cm}{0cm}
meillo@28 42 \textsc{Markus Schnalke\\MatNr: 039131}
meillo@11 43
meillo@28 44 \end{flushright}
meillo@11 45
meillo@11 46
meillo@11 47
meillo@28 48 \rule[7cm]{0cm}{0cm}
meillo@11 49
meillo@28 50 \textit{Dies ist meine Ausarbeitung zum Design Pattern ``Observer'' im Rahmen der Vorlesung Softwaretechnik im Studiengang Wirtschaftsinformatik an der Hochschule Ulm.}
meillo@11 51
meillo@28 52 {\tiny Dieses Dokument darf gerne zitiert, kopiert und weitergegeben werden. Ich bitte nur darum meinen Namen und einen Verweis auf meine Website (http://marmaro.de) zu erwähnen --- danke! }
meillo@11 53
meillo@11 54
meillo@28 55 \end{titlepage}
meillo@11 56
meillo@11 57
meillo@11 58
meillo@28 59
meillo@28 60 \tableofcontents
meillo@28 61
meillo@28 62
meillo@28 63
meillo@28 64
meillo@28 65
meillo@28 66
meillo@28 67
meillo@28 68
meillo@28 69
meillo@28 70
meillo@28 71
meillo@28 72
meillo@28 73
meillo@28 74
meillo@28 75 %%%% Einleitung %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
meillo@28 76 \newpage
meillo@28 77 \section{Einleitung}
meillo@28 78
meillo@28 79 Ich möchte im Folgenden einen Ansatz zum Verstehen von Design Patterns aufzeigen. Dazu nehme ich das Design Pattern ``Observer'', das ich Stück für Stück aus einer Situation der realen Welt herleiten werde. Es geht mir dabei nicht primär darum euch dieses Pattern zu erklären, vielmehr soll das Erfassen des Zusammenhangs zwischen Realität und Design Patterns gefördert werden.
meillo@28 80
meillo@28 81 Mein Ziel ist es die \textit{Natürlichkeit} von Design Patterns darzustellen --- weil sie dem Vorgehen in der Realität entsprechen!
meillo@28 82
meillo@28 83
meillo@28 84
meillo@28 85
meillo@28 86 \section{Meine Vorgehensweise}
meillo@28 87
meillo@28 88 \begin{quote}
meillo@28 89 Design Pattern sind ``Best Practices'' (= Erfolgsrezepte), meist \textbf{nach Vorbildern in der Realität}.
meillo@28 90 \end{quote}
meillo@28 91
meillo@28 92 Aus diesem Grund möchte ich nun anhand eines Beispiels aus dem täglichen Leben zeigen, dass das Design Pattern \textbf{Observer} ein absolut natürliches Vorgehen ist, das bei ähnlichen Situationen in Programmen deshalb ebenso verwendet werden sollte. Dass ich hier gerade das Pattern \textbf{Observer} verwende, hat keinen besonderen Grund; es kann wohl (fast) jedes Pattern auf diese Weise verständlich und logisch gemacht werden.
meillo@28 93
meillo@28 94
meillo@28 95
meillo@28 96
meillo@28 97
meillo@28 98
meillo@28 99
meillo@28 100
meillo@28 101
meillo@28 102
meillo@28 103
meillo@28 104
meillo@28 105
meillo@28 106
meillo@28 107
meillo@28 108 \newpage
meillo@28 109 \section{Erarbeitung des Patterns}
meillo@28 110
meillo@28 111 \subsection{Ausgangssituation}
meillo@28 112 Meine Ausgangssituation von der ich mich zu einer möglichst optimalen Lösung vorarbeiten möchte ist Folgende:
meillo@28 113
meillo@11 114 \begin{itemize}
meillo@28 115 \item Es gibt Personen die Etwas verkaufen möchten
meillo@28 116 \item Es gibt Personen die Etwas kaufen möchten
meillo@11 117 \item Sie wollen/sollen sich nicht kennen
meillo@11 118 \end{itemize}
meillo@11 119
meillo@28 120 Gesucht ist natürlich ein möglichst effektives Vorgehen. Eben das ist der Grund, weshalb wir Patterns verwenden möchten: Wir suchen eine effektive Standardlösung für regelmäßig auftretende Problemstellungen.
meillo@28 121
meillo@11 122
meillo@11 123
meillo@11 124
meillo@28 125 \subsection{Mögliche Ansätze}
meillo@28 126
meillo@28 127 Um systematisch vorzugehen, überlegen wir uns zunächst, welche primitiven Lösungen für unser Problem in Frage kommen. Dies wären zum Beispiel:
meillo@11 128 \begin{itemize}
meillo@11 129 \item Personen direkt ansprechen
meillo@11 130 \item Laut in die Menge rufen
meillo@11 131 \item Den Freunden erzählen, die es dann weitererzählen
meillo@11 132 \end{itemize}
meillo@11 133
meillo@28 134 Vermutlich wäre der Eine oder Andere (unbewusst) gleich höher eingestiegen, dennoch zeigen auch (oder gerade) diese simplen Vorgehensweisen Probleme auf, die sonst kaum explizit wahrgenommen werden.
meillo@28 135
meillo@28 136 Dies sind unter anderem:
meillo@28 137
meillo@11 138 \begin{itemize}
meillo@11 139 \item Man weiß nicht wer Interesse hat
meillo@11 140 \item nicht mal wieviele
meillo@11 141 \item Manche Interessenten sind vielleicht nur zu bestimmten Zeiten da
meillo@28 142 \item (... oder sie sind taub)
meillo@11 143 \end{itemize}
meillo@11 144
meillo@28 145
meillo@11 146
meillo@11 147
meillo@11 148
meillo@11 149 \subsection{Erarbeitung einer Lösung}
meillo@11 150
meillo@29 151 Im Folgenden möchte ich nun eine Lösung Schritt für Schritt erarbeiten und verbessern, bis sie das unsere Situation auf eine gute Weise löst.
meillo@29 152
meillo@29 153 Meine Lösung, die ich nun präsentieren möchte, ist eine Pinnwand. Pinnwände werden in der Realität normalerweise verwendet um derartige Problem zu lösen --- kein Wunder, wie wir gleich sehen werden. Die Pinnwand bietet von sich aus schon eine gute Lösung für unsere Problemsituation.
meillo@29 154
meillo@29 155
meillo@28 156 \subsubsection{Eine (gute) Lösung: Pinnwand}
meillo@11 157
meillo@29 158 Die Funktionen die eine Pinnwand anbietet sind:
meillo@28 159
meillo@11 160 \begin{itemize}
meillo@11 161 \item Man kann Zettel anpinnen
meillo@11 162 \item Hingehen und nach neuen Zetteln schauen
meillo@11 163 \item Zettel lesen
meillo@11 164 \item Zettel abnehmen
meillo@11 165 \end{itemize}
meillo@11 166
meillo@29 167 Nun sind zwar einige unserer Probleme (wie z.B. dass sich die Personen nicht kennen müssen) gelöst, doch es gibt auch welche die weiterhin bestehen. Dies sind vor allem:
meillo@11 168
meillo@11 169 \begin{itemize}
meillo@11 170 \item Man muss hingehen, nur um festzustellen, dass nichts Neues dabei ist
meillo@11 171 \item Man kann wichtige Zettel verpassen
meillo@11 172 \item Zettel sollten nicht weggenommen werden können
meillo@11 173 \end{itemize}
meillo@11 174
meillo@29 175 Diese Unzulänglichkeiten der jetzigen Lösung gilt es nun Schritt für Schritt zu eliminieren.
meillo@11 176
meillo@11 177
meillo@28 178 \subsubsection{Verbesserung: Pinnwand-Sekretärin}
meillo@11 179
meillo@29 180 Mit diesem Semester wurden bei uns Studiengebühren eingeführt. Die häufigen Diskussionen deswegen waren es wohl, die mich auf die Idee gebracht haben, das Geld doch sinnvoll(er) zu investieren. Und so erweitern wir unsere Pinnwand um eine Sekretärin die die Pinnwand verwaltet \dots natürlich mit Studiengebühren finanziert ;-)
meillo@29 181
meillo@29 182 Nachfolgend möchten wir die Sekretärin und die Pinnwand als Einheit betrachten. Die neuen Features dieser Pinnwand-Sekretärin-Einheit sind folgende:
meillo@29 183
meillo@11 184 \begin{itemize}
meillo@11 185 \item Man kann bei ihr einen Zettel in Auftrag geben (auch telefonisch)
meillo@11 186 \item (Sie schreibt mit lesbarer Schrift)
meillo@11 187 \item Sie verhindert, dass Zettel abgenommen werden
meillo@11 188 \end{itemize}
meillo@11 189
meillo@29 190 \dots und wir sind der optimalen Lösung unserer Problemsituation wieder einen Schritt näher. Jedoch nur einen Schritt, denn nicht alle Probleme sind gelöst.
meillo@29 191 Bestehen bleibt, dass man immer noch oft unnötig zur Pinnwand läuft.
meillo@28 192
meillo@11 193
meillo@11 194
meillo@11 195
meillo@28 196 \subsubsection{2. Verbesserung: Pinnwand-Sekretärin mit Benachrichtigung}
meillo@11 197
meillo@29 198 Die Studiengebühren sollen uns an dieser Stelle noch nicht ausgedient haben ---immerhin sind es 500 Euro--- und so ist noch genug übrig um userer Sekretärin verlängerte Arbeitszeiten finanzieren zu können. In dieser zusätzlichen Zeit kann sie nun natürlich weitere Aufgaben übernehmen. Dies sind:
meillo@29 199
meillo@11 200 \begin{itemize}
meillo@11 201 \item Man kann sich bei der Sekretärin nun als ``Interessierter'' registrieren
meillo@11 202 \item Die Sekretärin trägt die Telefonnummer in eine Liste ein
meillo@28 203 \item Zukünftig ruft sie alle Personen der Liste an, wenn sie einen neuen Zettel anpinnt
meillo@11 204 \end{itemize}
meillo@28 205
meillo@11 206
meillo@11 207
meillo@11 208
meillo@28 209 \subsection{Zusammenfassung des Beispiels}
meillo@11 210
meillo@28 211 \paragraph{Pinnwand + Sekretärin + Benachrichtigung}
meillo@11 212 \begin{itemize}
meillo@11 213 \item Man kann neue Zettel anpinnen lassen
meillo@11 214 \item Man kann sich als Interessierter anmelden (und auch abmelden)
meillo@11 215 \item Interessierte werden bei Änderungen der Pinnwand benachrichtigt
meillo@11 216 \item Sie können dann zur Pinnwand gehen und sie sich anschauen
meillo@11 217 \end{itemize}
meillo@28 218
meillo@11 219
meillo@28 220
meillo@11 221
meillo@28 222 \paragraph{Eure Meinung?}
meillo@11 223 \begin{itemize}
meillo@11 224 \item Ist diese Struktur zufriedenstellend?
meillo@11 225 \item Erfüllt sie alle Anforderungen?
meillo@11 226 \item Was fehlt?
meillo@11 227 \end{itemize}
meillo@28 228
meillo@11 229
meillo@11 230
meillo@11 231
meillo@11 232
meillo@11 233
meillo@11 234
meillo@11 235
meillo@11 236
meillo@11 237
meillo@11 238
meillo@28 239
meillo@28 240
meillo@28 241
meillo@28 242
meillo@28 243
meillo@28 244
meillo@28 245
meillo@28 246
meillo@28 247
meillo@28 248
meillo@28 249
meillo@28 250
meillo@28 251 \newpage
meillo@28 252 \section{Das Pattern}
meillo@28 253
meillo@28 254
meillo@28 255 \subsection{Überleitung}
meillo@28 256
meillo@28 257 \paragraph{Neue Namen}
meillo@11 258 \begin{itemize}
meillo@28 259 \item Pinnwand-Sekretärin-Einheit $\rightarrow$ ``Subject''
meillo@28 260 \item Die Zettel auf der Pinnwand $\rightarrow$ ``subjectState''
meillo@28 261 \item Interessenten $\rightarrow$ ``Observers''
meillo@11 262 \end{itemize}
meillo@11 263
meillo@28 264 \paragraph{Schnittstellen}
meillo@28 265 Die Fähigkeiten der Pinnwand/Sekretärin und Interessenten sind ihre ``Interfaces''.
meillo@11 266
meillo@28 267 (vgl: taub, minimale Fähigkeiten, leserliche Schrift, ...)
meillo@28 268
meillo@11 269
meillo@11 270
meillo@11 271
meillo@28 272 \subsection{UML-Diagramme}
meillo@28 273 \subsubsection{Struktur-Diagramm des Observers}
meillo@28 274
meillo@28 275 \begin{figure}[hbt]
meillo@28 276 \centering
meillo@28 277 \includegraphics[width=12cm]{pics/observer_big.png}
meillo@28 278 \caption{Struktur-Diagramm des Observers}
meillo@28 279 \end{figure}
meillo@28 280
meillo@28 281
meillo@28 282
meillo@28 283 \subsubsection{Interaktions-Diagramm des Observers}
meillo@28 284 \begin{figure}[hbt]
meillo@28 285 \centering
meillo@28 286 \includegraphics[width=12cm]{pics/observer-interaction_big.png}
meillo@28 287 \caption{Interaktions-Diagramm des Observers}
meillo@28 288 \end{figure}
meillo@28 289
meillo@28 290
meillo@11 291
meillo@11 292
meillo@11 293 % Daten aus der Beschreibung des Observers von GoF
meillo@11 294 % in welche Gruppen wird er eingeordnet
meillo@28 295 \subsubsection{Klassifizierung nach GoF}
meillo@11 296
meillo@28 297 \paragraph{Klassifizierung}
meillo@11 298 Verhaltensmuster, objektbasierend
meillo@28 299
meillo@11 300
meillo@28 301 \paragraph{Auch bekannt als}
meillo@11 302 Publish-Subscribe, Dependents
meillo@28 303
meillo@11 304
meillo@28 305 \paragraph{Zweck}
meillo@11 306 Abhängigkeiten zwischen Objekten zu erstellen, sodass sich abhängige Objekte ändern, wenn sich das Objekt selbst ändert.
meillo@11 307 % todo: besser formulieren
meillo@28 308
meillo@11 309
meillo@28 310 \paragraph{Kurzbeschreibung}
meillo@11 311 Schnittstellen anlegen, um Abhängigkeiten zwischen Objekten registriert
meillo@11 312 werden können, und um die abhängigen Objekte über Zustandsänderungen zu
meillo@11 313 informieren.
meillo@11 314 % todo: Formulierung überdenken
meillo@28 315
meillo@11 316
meillo@11 317
meillo@11 318
meillo@28 319
meillo@28 320 \subsection{Beispiele für den Observer in der Praxis}
meillo@11 321 % Einsatzgebiete (MVC) und RL (Mailingslisten, Ebay-Suchabo)
meillo@11 322 % nicht aber (Blog + RSS)
meillo@11 323
meillo@28 324 \paragraph{Beispiele}
meillo@11 325 \begin{itemize}
meillo@11 326 \item Observer ist sehr verbreitet
meillo@11 327 \item v.a. MVC (Model = Subject; View = Observer)
meillo@11 328 \item Mailinglisten
meillo@11 329 \item Ebay Such-Abo
meillo@11 330 \end{itemize}
meillo@28 331
meillo@11 332
meillo@28 333 \paragraph{Aber}
meillo@11 334 \begin{itemize}
meillo@11 335 \item nicht Blog mit RSS-Feed!
meillo@11 336 \end{itemize}
meillo@28 337
meillo@11 338
meillo@11 339
meillo@11 340
meillo@11 341
meillo@11 342
meillo@11 343
meillo@28 344 %\subsection{Erweiterungen}
meillo@28 345 %% Erweiterungen, verbleibende Probleme, Kompromisse beim Design
meillo@28 346 \subsection{Mögliche Erweiterungen des Patterns}
meillo@11 347
meillo@28 348 \paragraph{Ein Observer und mehrere Subjects}
meillo@28 349 \begin{itemize}
meillo@28 350 \item Der Name des Subjects muss mitgesendet werden.
meillo@28 351 \end{itemize}
meillo@28 352
meillo@11 353
meillo@28 354 \paragraph{Nur für bestimmte Informationen anmelden}
meillo@28 355 \begin{itemize}
meillo@28 356 \item Oberservers melden sich nur für bestimmte Informationen an
meillo@28 357 \item Es werden weniger uninteressante Updates gesendet
meillo@28 358 \end{itemize}
meillo@28 359
meillo@28 360
meillo@28 361 \paragraph{UpdateManager}
meillo@28 362 \begin{itemize}
meillo@28 363 \item Bei komplexen Update-Zusammenhängen empfehlenswert
meillo@28 364 \item vermittelt zwischen Subject und Observer
meillo@28 365 \item (Mehr dazu in der Ausarbeitung)
meillo@28 366 \end{itemize}
meillo@28 367
meillo@28 368
meillo@28 369
meillo@28 370
meillo@28 371 \paragraph{Wer ruft notify() auf?}
meillo@28 372
meillo@28 373 \subparagraph{Das Subject}
meillo@28 374 \begin{itemize}
meillo@28 375 \item[+] notify() wird sicher bei jedem setState() aufgerufen
meillo@28 376 \item[-] hohe Update-Kosten bei Änderungen en-block
meillo@28 377 \end{itemize}
meillo@28 378
meillo@28 379
meillo@28 380 \subparagraph{Der Observer}
meillo@28 381 \begin{itemize}
meillo@28 382 \item[+] intelligenter Zeitpunkt des notify()-Aufrufs möglich
meillo@28 383 \item[-] der Client darf den notify()-Aufruf nicht vergessen
meillo@28 384 \end{itemize}
meillo@28 385
meillo@28 386
meillo@28 387
meillo@28 388
meillo@28 389
meillo@28 390
meillo@28 391
meillo@28 392
meillo@28 393
meillo@28 394
meillo@28 395
meillo@28 396
meillo@28 397
meillo@28 398
meillo@28 399
meillo@28 400
meillo@28 401
meillo@28 402
meillo@28 403
meillo@28 404
meillo@28 405
meillo@28 406
meillo@28 407
meillo@28 408
meillo@28 409 \newpage
meillo@11 410 \section{Zusammenfassung}
meillo@28 411 %\textbf{Zusammenfassend}
meillo@28 412 \paragraph{Zusammenfassung}
meillo@28 413 \begin{itemize}
meillo@28 414 \item Menschen denken basierend auf der Realität
meillo@28 415 \item deshalb Design Patterns auf Realität zurückführen
meillo@28 416 \item Patterns anwenden weil man es in der Realität auch so machen würde
meillo@28 417 \end{itemize}
meillo@28 418
meillo@11 419
meillo@11 420
meillo@11 421
meillo@11 422
meillo@28 423 Erklaerung des Vorgehens
meillo@28 424 Frage: war es erfolgreich?
meillo@28 425 \textbf{}
meillo@11 426
meillo@28 427 \paragraph{}
meillo@28 428
meillo@11 429
meillo@11 430
meillo@11 431
meillo@28 432 \section{Abschließend}
meillo@28 433 \paragraph{Verwendete Software}
meillo@11 434 \begin{itemize}
meillo@11 435 \item Debian GNU/Linux
meillo@11 436 \item \LaTeX-Beamer und \texttt{pdflatex}
meillo@11 437 \item Vim
meillo@11 438 \item qiv und ImageMagick
meillo@11 439 \item Mercurial
meillo@11 440 \end{itemize}
meillo@28 441
meillo@11 442
meillo@28 443 \paragraph{}
meillo@11 444 \vspace{3ex}
meillo@11 445 \centerline{\textbf{Danke für eure Aufmerksamkeit}}
meillo@28 446
meillo@11 447
meillo@11 448
meillo@11 449
meillo@11 450
meillo@11 451
meillo@11 452
meillo@11 453
meillo@28 454 \appendix
meillo@11 455
meillo@28 456 \section{Code}
meillo@28 457 \textbf{Code? --- Nein, kein Code!}
meillo@28 458 \paragraph{Denn}
meillo@28 459 \begin{center}
meillo@28 460 \textbf{ Implementierungen sind Schall und Rauch,\\
meillo@28 461 Konzepte dagegen bleiben bestehen! }
meillo@28 462 \end{center}
meillo@28 463
meillo@28 464
meillo@28 465 \vspace{4ex}
meillo@28 466 {\scriptsize
meillo@28 467 \paragraph{}
meillo@28 468 \textit{ Beispiel-Implementierung in der Ausarbeitung. }
meillo@28 469
meillo@28 470 }
meillo@28 471
meillo@28 472
meillo@28 473
meillo@28 474
meillo@28 475
meillo@28 476
meillo@28 477
meillo@28 478
meillo@28 479
meillo@11 480
meillo@11 481
meillo@11 482 \end{document}