docs/DesignPatterns

annotate detailed-observer.tex @ 28:ddd8378a539e

did lot of working on detailed-observer
author meillo@marmaro.de
date Thu, 05 Jul 2007 07:53:15 +0200
parents a7ab86cddfad
children f3b4061ec3b4
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@28 151 \subsubsection{Eine (gute) Lösung: Pinnwand}
meillo@11 152
meillo@28 153
meillo@28 154
meillo@28 155 \paragraph{Funktionsweise}
meillo@11 156 \begin{itemize}
meillo@11 157 \item Man kann Zettel anpinnen
meillo@11 158 \item Hingehen und nach neuen Zetteln schauen
meillo@11 159 \item Zettel lesen
meillo@11 160 \item Zettel abnehmen
meillo@11 161 \item Jeder der ein paar Fähigkeiten hat kann es
meillo@11 162 \end{itemize}
meillo@28 163
meillo@11 164
meillo@28 165
meillo@11 166
meillo@28 167 \paragraph{Probleme}
meillo@11 168 \begin{itemize}
meillo@11 169 \item Man muss hingehen, nur um festzustellen, dass nichts Neues dabei ist
meillo@11 170 \item Man kann wichtige Zettel verpassen
meillo@11 171 \item Zettel sollten nicht weggenommen werden können
meillo@11 172 \end{itemize}
meillo@28 173
meillo@11 174
meillo@11 175
meillo@11 176
meillo@11 177
meillo@11 178
meillo@28 179 \subsubsection{Verbesserung: Pinnwand-Sekretärin}
meillo@11 180
meillo@28 181 \paragraph{Lösung}
meillo@11 182 \begin{itemize}
meillo@11 183 \item Durch Studiengebühren wird eine Sekretärin für die Pinnwand angestellt
meillo@11 184 \item Pinnwand und Sekretärin sind fortan eine Einheit
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@28 189
meillo@11 190
meillo@28 191
meillo@11 192
meillo@28 193 \paragraph{Bestehendes Problem}
meillo@11 194 \begin{itemize}
meillo@11 195 \item Man läuft immer noch oft unnötig zur Pinnwand
meillo@11 196 \end{itemize}
meillo@28 197
meillo@11 198
meillo@11 199
meillo@11 200
meillo@28 201 \subsubsection{2. Verbesserung: Pinnwand-Sekretärin mit Benachrichtigung}
meillo@11 202
meillo@28 203 \paragraph{Lösung}
meillo@11 204 \begin{itemize}
meillo@11 205 \item Durch Studiengebühren wird eine längere Arbeitszeit der Sekretärin finanziert
meillo@11 206 \item Man kann sich bei der Sekretärin nun als ``Interessierter'' registrieren
meillo@11 207 \item Die Sekretärin trägt die Telefonnummer in eine Liste ein
meillo@28 208 \item Zukünftig ruft sie alle Personen der Liste an, wenn sie einen neuen Zettel anpinnt
meillo@11 209 \end{itemize}
meillo@28 210
meillo@11 211
meillo@11 212
meillo@11 213
meillo@28 214 \subsection{Zusammenfassung des Beispiels}
meillo@11 215
meillo@28 216 \paragraph{Pinnwand + Sekretärin + Benachrichtigung}
meillo@11 217 \begin{itemize}
meillo@11 218 \item Man kann neue Zettel anpinnen lassen
meillo@11 219 \item Man kann sich als Interessierter anmelden (und auch abmelden)
meillo@11 220 \item Interessierte werden bei Änderungen der Pinnwand benachrichtigt
meillo@11 221 \item Sie können dann zur Pinnwand gehen und sie sich anschauen
meillo@11 222 \end{itemize}
meillo@28 223
meillo@11 224
meillo@28 225
meillo@11 226
meillo@28 227 \paragraph{Eure Meinung?}
meillo@11 228 \begin{itemize}
meillo@11 229 \item Ist diese Struktur zufriedenstellend?
meillo@11 230 \item Erfüllt sie alle Anforderungen?
meillo@11 231 \item Was fehlt?
meillo@11 232 \end{itemize}
meillo@28 233
meillo@11 234
meillo@11 235
meillo@11 236
meillo@11 237
meillo@11 238
meillo@11 239
meillo@11 240
meillo@11 241
meillo@11 242
meillo@11 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
meillo@28 252
meillo@28 253
meillo@28 254
meillo@28 255
meillo@28 256 \newpage
meillo@28 257 \section{Das Pattern}
meillo@28 258
meillo@28 259
meillo@28 260 \subsection{Überleitung}
meillo@28 261
meillo@28 262 \paragraph{Neue Namen}
meillo@11 263 \begin{itemize}
meillo@28 264 \item Pinnwand-Sekretärin-Einheit $\rightarrow$ ``Subject''
meillo@28 265 \item Die Zettel auf der Pinnwand $\rightarrow$ ``subjectState''
meillo@28 266 \item Interessenten $\rightarrow$ ``Observers''
meillo@11 267 \end{itemize}
meillo@11 268
meillo@28 269 \paragraph{Schnittstellen}
meillo@28 270 Die Fähigkeiten der Pinnwand/Sekretärin und Interessenten sind ihre ``Interfaces''.
meillo@11 271
meillo@28 272 (vgl: taub, minimale Fähigkeiten, leserliche Schrift, ...)
meillo@28 273
meillo@11 274
meillo@11 275
meillo@11 276
meillo@28 277 \subsection{UML-Diagramme}
meillo@28 278 \subsubsection{Struktur-Diagramm des Observers}
meillo@28 279
meillo@28 280 \begin{figure}[hbt]
meillo@28 281 \centering
meillo@28 282 \includegraphics[width=12cm]{pics/observer_big.png}
meillo@28 283 \caption{Struktur-Diagramm des Observers}
meillo@28 284 \end{figure}
meillo@28 285
meillo@28 286
meillo@28 287
meillo@28 288 \subsubsection{Interaktions-Diagramm des Observers}
meillo@28 289 \begin{figure}[hbt]
meillo@28 290 \centering
meillo@28 291 \includegraphics[width=12cm]{pics/observer-interaction_big.png}
meillo@28 292 \caption{Interaktions-Diagramm des Observers}
meillo@28 293 \end{figure}
meillo@28 294
meillo@28 295
meillo@11 296
meillo@11 297
meillo@11 298 % Daten aus der Beschreibung des Observers von GoF
meillo@11 299 % in welche Gruppen wird er eingeordnet
meillo@28 300 \subsubsection{Klassifizierung nach GoF}
meillo@11 301
meillo@28 302 \paragraph{Klassifizierung}
meillo@11 303 Verhaltensmuster, objektbasierend
meillo@28 304
meillo@11 305
meillo@28 306 \paragraph{Auch bekannt als}
meillo@11 307 Publish-Subscribe, Dependents
meillo@28 308
meillo@11 309
meillo@28 310 \paragraph{Zweck}
meillo@11 311 Abhängigkeiten zwischen Objekten zu erstellen, sodass sich abhängige Objekte ändern, wenn sich das Objekt selbst ändert.
meillo@11 312 % todo: besser formulieren
meillo@28 313
meillo@11 314
meillo@28 315 \paragraph{Kurzbeschreibung}
meillo@11 316 Schnittstellen anlegen, um Abhängigkeiten zwischen Objekten registriert
meillo@11 317 werden können, und um die abhängigen Objekte über Zustandsänderungen zu
meillo@11 318 informieren.
meillo@11 319 % todo: Formulierung überdenken
meillo@28 320
meillo@11 321
meillo@11 322
meillo@11 323
meillo@28 324
meillo@28 325 \subsection{Beispiele für den Observer in der Praxis}
meillo@11 326 % Einsatzgebiete (MVC) und RL (Mailingslisten, Ebay-Suchabo)
meillo@11 327 % nicht aber (Blog + RSS)
meillo@11 328
meillo@28 329 \paragraph{Beispiele}
meillo@11 330 \begin{itemize}
meillo@11 331 \item Observer ist sehr verbreitet
meillo@11 332 \item v.a. MVC (Model = Subject; View = Observer)
meillo@11 333 \item Mailinglisten
meillo@11 334 \item Ebay Such-Abo
meillo@11 335 \end{itemize}
meillo@28 336
meillo@11 337
meillo@28 338 \paragraph{Aber}
meillo@11 339 \begin{itemize}
meillo@11 340 \item nicht Blog mit RSS-Feed!
meillo@11 341 \end{itemize}
meillo@28 342
meillo@11 343
meillo@11 344
meillo@11 345
meillo@11 346
meillo@11 347
meillo@11 348
meillo@28 349 %\subsection{Erweiterungen}
meillo@28 350 %% Erweiterungen, verbleibende Probleme, Kompromisse beim Design
meillo@28 351 \subsection{Mögliche Erweiterungen des Patterns}
meillo@11 352
meillo@28 353 \paragraph{Ein Observer und mehrere Subjects}
meillo@28 354 \begin{itemize}
meillo@28 355 \item Der Name des Subjects muss mitgesendet werden.
meillo@28 356 \end{itemize}
meillo@28 357
meillo@11 358
meillo@28 359 \paragraph{Nur für bestimmte Informationen anmelden}
meillo@28 360 \begin{itemize}
meillo@28 361 \item Oberservers melden sich nur für bestimmte Informationen an
meillo@28 362 \item Es werden weniger uninteressante Updates gesendet
meillo@28 363 \end{itemize}
meillo@28 364
meillo@28 365
meillo@28 366 \paragraph{UpdateManager}
meillo@28 367 \begin{itemize}
meillo@28 368 \item Bei komplexen Update-Zusammenhängen empfehlenswert
meillo@28 369 \item vermittelt zwischen Subject und Observer
meillo@28 370 \item (Mehr dazu in der Ausarbeitung)
meillo@28 371 \end{itemize}
meillo@28 372
meillo@28 373
meillo@28 374
meillo@28 375
meillo@28 376 \paragraph{Wer ruft notify() auf?}
meillo@28 377
meillo@28 378 \subparagraph{Das Subject}
meillo@28 379 \begin{itemize}
meillo@28 380 \item[+] notify() wird sicher bei jedem setState() aufgerufen
meillo@28 381 \item[-] hohe Update-Kosten bei Änderungen en-block
meillo@28 382 \end{itemize}
meillo@28 383
meillo@28 384
meillo@28 385 \subparagraph{Der Observer}
meillo@28 386 \begin{itemize}
meillo@28 387 \item[+] intelligenter Zeitpunkt des notify()-Aufrufs möglich
meillo@28 388 \item[-] der Client darf den notify()-Aufruf nicht vergessen
meillo@28 389 \end{itemize}
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
meillo@28 410
meillo@28 411
meillo@28 412
meillo@28 413
meillo@28 414 \newpage
meillo@11 415 \section{Zusammenfassung}
meillo@28 416 %\textbf{Zusammenfassend}
meillo@28 417 \paragraph{Zusammenfassung}
meillo@28 418 \begin{itemize}
meillo@28 419 \item Menschen denken basierend auf der Realität
meillo@28 420 \item deshalb Design Patterns auf Realität zurückführen
meillo@28 421 \item Patterns anwenden weil man es in der Realität auch so machen würde
meillo@28 422 \end{itemize}
meillo@28 423
meillo@11 424
meillo@11 425
meillo@11 426
meillo@11 427
meillo@28 428 Erklaerung des Vorgehens
meillo@28 429 Frage: war es erfolgreich?
meillo@28 430 \textbf{}
meillo@11 431
meillo@28 432 \paragraph{}
meillo@28 433
meillo@11 434
meillo@11 435
meillo@11 436
meillo@28 437 \section{Abschließend}
meillo@28 438 \paragraph{Verwendete Software}
meillo@11 439 \begin{itemize}
meillo@11 440 \item Debian GNU/Linux
meillo@11 441 \item \LaTeX-Beamer und \texttt{pdflatex}
meillo@11 442 \item Vim
meillo@11 443 \item qiv und ImageMagick
meillo@11 444 \item Mercurial
meillo@11 445 \end{itemize}
meillo@28 446
meillo@11 447
meillo@28 448 \paragraph{}
meillo@11 449 \vspace{3ex}
meillo@11 450 \centerline{\textbf{Danke für eure Aufmerksamkeit}}
meillo@28 451
meillo@11 452
meillo@11 453
meillo@11 454
meillo@11 455
meillo@11 456
meillo@11 457
meillo@11 458
meillo@28 459 \appendix
meillo@11 460
meillo@28 461 \section{Code}
meillo@28 462 \textbf{Code? --- Nein, kein Code!}
meillo@28 463 \paragraph{Denn}
meillo@28 464 \begin{center}
meillo@28 465 \textbf{ Implementierungen sind Schall und Rauch,\\
meillo@28 466 Konzepte dagegen bleiben bestehen! }
meillo@28 467 \end{center}
meillo@28 468
meillo@28 469
meillo@28 470 \vspace{4ex}
meillo@28 471 {\scriptsize
meillo@28 472 \paragraph{}
meillo@28 473 \textit{ Beispiel-Implementierung in der Ausarbeitung. }
meillo@28 474
meillo@28 475 }
meillo@28 476
meillo@28 477
meillo@28 478
meillo@28 479
meillo@28 480
meillo@28 481
meillo@28 482
meillo@28 483
meillo@28 484
meillo@11 485
meillo@11 486
meillo@11 487 \end{document}