meillo@11: % @file meillo@28: % @brief Referat DesignPatterns `Observer' meillo@11: % @author markus schnalke meillo@11: % @since 2007-05-30 meillo@11: meillo@11: meillo@28: \documentclass[a4paper]{scrartcl} meillo@11: meillo@28: \usepackage[utf8]{inputenc} meillo@11: \usepackage{ngerman} meillo@11: \usepackage{graphicx} meillo@11: \usepackage[automark]{scrpage2} meillo@11: meillo@28: \setkomafont{sectioning}{\normalfont\normalcolor\bfseries} meillo@28: \setlength{\parindent}{0em} meillo@28: \setlength{\parskip}{1.0ex plus 1.0ex minus 0.5ex} meillo@28: \pagestyle{scrheadings} meillo@28: \setcounter{tocdepth}{2} meillo@11: meillo@11: \begin{document} meillo@11: meillo@11: meillo@11: meillo@11: meillo@11: meillo@28: %%%% Titlepage %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% meillo@28: \begin{titlepage} meillo@28: \title{Observer-Pattern} meillo@28: \author{Markus Schnalke} meillo@28: \date{2007-07-04} meillo@11: meillo@11: meillo@28: \thispagestyle{empty} meillo@11: meillo@11: meillo@28: \begin{flushright} meillo@11: meillo@28: \rule[8cm]{0cm}{0cm} meillo@28: {\Huge Design Pattern\\ \textbf{Observer}} meillo@11: meillo@28: \rule[2cm]{0cm}{0cm} meillo@28: \textsc{Markus Schnalke\\MatNr: 039131} meillo@11: meillo@28: \end{flushright} meillo@11: meillo@11: meillo@11: meillo@28: \rule[7cm]{0cm}{0cm} meillo@11: meillo@28: \textit{Dies ist meine Ausarbeitung zum Design Pattern ``Observer'' im Rahmen der Vorlesung Softwaretechnik im Studiengang Wirtschaftsinformatik an der Hochschule Ulm.} meillo@11: meillo@28: {\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: meillo@11: meillo@28: \end{titlepage} meillo@11: meillo@11: meillo@11: meillo@28: meillo@28: \tableofcontents meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: %%%% Einleitung %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% meillo@28: \newpage meillo@28: \section{Einleitung} meillo@28: meillo@28: 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: meillo@28: Mein Ziel ist es die \textit{Natürlichkeit} von Design Patterns darzustellen --- weil sie dem Vorgehen in der Realität entsprechen! meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: \section{Meine Vorgehensweise} meillo@28: meillo@28: \begin{quote} meillo@28: Design Pattern sind ``Best Practices'' (= Erfolgsrezepte), meist \textbf{nach Vorbildern in der Realität}. meillo@28: \end{quote} meillo@28: meillo@28: 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: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: \newpage meillo@28: \section{Erarbeitung des Patterns} meillo@28: meillo@28: \subsection{Ausgangssituation} meillo@28: Meine Ausgangssituation von der ich mich zu einer möglichst optimalen Lösung vorarbeiten möchte ist Folgende: meillo@28: meillo@11: \begin{itemize} meillo@28: \item Es gibt Personen die Etwas verkaufen möchten meillo@28: \item Es gibt Personen die Etwas kaufen möchten meillo@11: \item Sie wollen/sollen sich nicht kennen meillo@11: \end{itemize} meillo@11: meillo@28: 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: meillo@11: meillo@11: meillo@11: meillo@28: \subsection{Mögliche Ansätze} meillo@28: meillo@28: 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: \begin{itemize} meillo@11: \item Personen direkt ansprechen meillo@11: \item Laut in die Menge rufen meillo@11: \item Den Freunden erzählen, die es dann weitererzählen meillo@11: \end{itemize} meillo@11: meillo@28: 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: meillo@28: Dies sind unter anderem: meillo@28: meillo@11: \begin{itemize} meillo@11: \item Man weiß nicht wer Interesse hat meillo@11: \item nicht mal wieviele meillo@11: \item Manche Interessenten sind vielleicht nur zu bestimmten Zeiten da meillo@28: \item (... oder sie sind taub) meillo@11: \end{itemize} meillo@11: meillo@28: meillo@11: meillo@11: meillo@11: meillo@11: \subsection{Erarbeitung einer Lösung} meillo@11: meillo@28: \subsubsection{Eine (gute) Lösung: Pinnwand} meillo@11: meillo@28: meillo@28: meillo@28: \paragraph{Funktionsweise} meillo@11: \begin{itemize} meillo@11: \item Man kann Zettel anpinnen meillo@11: \item Hingehen und nach neuen Zetteln schauen meillo@11: \item Zettel lesen meillo@11: \item Zettel abnehmen meillo@11: \item Jeder der ein paar Fähigkeiten hat kann es meillo@11: \end{itemize} meillo@28: meillo@11: meillo@28: meillo@11: meillo@28: \paragraph{Probleme} meillo@11: \begin{itemize} meillo@11: \item Man muss hingehen, nur um festzustellen, dass nichts Neues dabei ist meillo@11: \item Man kann wichtige Zettel verpassen meillo@11: \item Zettel sollten nicht weggenommen werden können meillo@11: \end{itemize} meillo@28: meillo@11: meillo@11: meillo@11: meillo@11: meillo@11: meillo@28: \subsubsection{Verbesserung: Pinnwand-Sekretärin} meillo@11: meillo@28: \paragraph{Lösung} meillo@11: \begin{itemize} meillo@11: \item Durch Studiengebühren wird eine Sekretärin für die Pinnwand angestellt meillo@11: \item Pinnwand und Sekretärin sind fortan eine Einheit meillo@11: \item Man kann bei ihr einen Zettel in Auftrag geben (auch telefonisch) meillo@11: \item (Sie schreibt mit lesbarer Schrift) meillo@11: \item Sie verhindert, dass Zettel abgenommen werden meillo@11: \end{itemize} meillo@28: meillo@11: meillo@28: meillo@11: meillo@28: \paragraph{Bestehendes Problem} meillo@11: \begin{itemize} meillo@11: \item Man läuft immer noch oft unnötig zur Pinnwand meillo@11: \end{itemize} meillo@28: meillo@11: meillo@11: meillo@11: meillo@28: \subsubsection{2. Verbesserung: Pinnwand-Sekretärin mit Benachrichtigung} meillo@11: meillo@28: \paragraph{Lösung} meillo@11: \begin{itemize} meillo@11: \item Durch Studiengebühren wird eine längere Arbeitszeit der Sekretärin finanziert meillo@11: \item Man kann sich bei der Sekretärin nun als ``Interessierter'' registrieren meillo@11: \item Die Sekretärin trägt die Telefonnummer in eine Liste ein meillo@28: \item Zukünftig ruft sie alle Personen der Liste an, wenn sie einen neuen Zettel anpinnt meillo@11: \end{itemize} meillo@28: meillo@11: meillo@11: meillo@11: meillo@28: \subsection{Zusammenfassung des Beispiels} meillo@11: meillo@28: \paragraph{Pinnwand + Sekretärin + Benachrichtigung} meillo@11: \begin{itemize} meillo@11: \item Man kann neue Zettel anpinnen lassen meillo@11: \item Man kann sich als Interessierter anmelden (und auch abmelden) meillo@11: \item Interessierte werden bei Änderungen der Pinnwand benachrichtigt meillo@11: \item Sie können dann zur Pinnwand gehen und sie sich anschauen meillo@11: \end{itemize} meillo@28: meillo@11: meillo@28: meillo@11: meillo@28: \paragraph{Eure Meinung?} meillo@11: \begin{itemize} meillo@11: \item Ist diese Struktur zufriedenstellend? meillo@11: \item Erfüllt sie alle Anforderungen? meillo@11: \item Was fehlt? meillo@11: \end{itemize} meillo@28: meillo@11: meillo@11: meillo@11: meillo@11: meillo@11: meillo@11: meillo@11: meillo@11: meillo@11: meillo@11: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: \newpage meillo@28: \section{Das Pattern} meillo@28: meillo@28: meillo@28: \subsection{Überleitung} meillo@28: meillo@28: \paragraph{Neue Namen} meillo@11: \begin{itemize} meillo@28: \item Pinnwand-Sekretärin-Einheit $\rightarrow$ ``Subject'' meillo@28: \item Die Zettel auf der Pinnwand $\rightarrow$ ``subjectState'' meillo@28: \item Interessenten $\rightarrow$ ``Observers'' meillo@11: \end{itemize} meillo@11: meillo@28: \paragraph{Schnittstellen} meillo@28: Die Fähigkeiten der Pinnwand/Sekretärin und Interessenten sind ihre ``Interfaces''. meillo@11: meillo@28: (vgl: taub, minimale Fähigkeiten, leserliche Schrift, ...) meillo@28: meillo@11: meillo@11: meillo@11: meillo@28: \subsection{UML-Diagramme} meillo@28: \subsubsection{Struktur-Diagramm des Observers} meillo@28: meillo@28: \begin{figure}[hbt] meillo@28: \centering meillo@28: \includegraphics[width=12cm]{pics/observer_big.png} meillo@28: \caption{Struktur-Diagramm des Observers} meillo@28: \end{figure} meillo@28: meillo@28: meillo@28: meillo@28: \subsubsection{Interaktions-Diagramm des Observers} meillo@28: \begin{figure}[hbt] meillo@28: \centering meillo@28: \includegraphics[width=12cm]{pics/observer-interaction_big.png} meillo@28: \caption{Interaktions-Diagramm des Observers} meillo@28: \end{figure} meillo@28: meillo@28: meillo@11: meillo@11: meillo@11: % Daten aus der Beschreibung des Observers von GoF meillo@11: % in welche Gruppen wird er eingeordnet meillo@28: \subsubsection{Klassifizierung nach GoF} meillo@11: meillo@28: \paragraph{Klassifizierung} meillo@11: Verhaltensmuster, objektbasierend meillo@28: meillo@11: meillo@28: \paragraph{Auch bekannt als} meillo@11: Publish-Subscribe, Dependents meillo@28: meillo@11: meillo@28: \paragraph{Zweck} meillo@11: Abhängigkeiten zwischen Objekten zu erstellen, sodass sich abhängige Objekte ändern, wenn sich das Objekt selbst ändert. meillo@11: % todo: besser formulieren meillo@28: meillo@11: meillo@28: \paragraph{Kurzbeschreibung} meillo@11: Schnittstellen anlegen, um Abhängigkeiten zwischen Objekten registriert meillo@11: werden können, und um die abhängigen Objekte über Zustandsänderungen zu meillo@11: informieren. meillo@11: % todo: Formulierung überdenken meillo@28: meillo@11: meillo@11: meillo@11: meillo@28: meillo@28: \subsection{Beispiele für den Observer in der Praxis} meillo@11: % Einsatzgebiete (MVC) und RL (Mailingslisten, Ebay-Suchabo) meillo@11: % nicht aber (Blog + RSS) meillo@11: meillo@28: \paragraph{Beispiele} meillo@11: \begin{itemize} meillo@11: \item Observer ist sehr verbreitet meillo@11: \item v.a. MVC (Model = Subject; View = Observer) meillo@11: \item Mailinglisten meillo@11: \item Ebay Such-Abo meillo@11: \end{itemize} meillo@28: meillo@11: meillo@28: \paragraph{Aber} meillo@11: \begin{itemize} meillo@11: \item nicht Blog mit RSS-Feed! meillo@11: \end{itemize} meillo@28: meillo@11: meillo@11: meillo@11: meillo@11: meillo@11: meillo@11: meillo@28: %\subsection{Erweiterungen} meillo@28: %% Erweiterungen, verbleibende Probleme, Kompromisse beim Design meillo@28: \subsection{Mögliche Erweiterungen des Patterns} meillo@11: meillo@28: \paragraph{Ein Observer und mehrere Subjects} meillo@28: \begin{itemize} meillo@28: \item Der Name des Subjects muss mitgesendet werden. meillo@28: \end{itemize} meillo@28: meillo@11: meillo@28: \paragraph{Nur für bestimmte Informationen anmelden} meillo@28: \begin{itemize} meillo@28: \item Oberservers melden sich nur für bestimmte Informationen an meillo@28: \item Es werden weniger uninteressante Updates gesendet meillo@28: \end{itemize} meillo@28: meillo@28: meillo@28: \paragraph{UpdateManager} meillo@28: \begin{itemize} meillo@28: \item Bei komplexen Update-Zusammenhängen empfehlenswert meillo@28: \item vermittelt zwischen Subject und Observer meillo@28: \item (Mehr dazu in der Ausarbeitung) meillo@28: \end{itemize} meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: \paragraph{Wer ruft notify() auf?} meillo@28: meillo@28: \subparagraph{Das Subject} meillo@28: \begin{itemize} meillo@28: \item[+] notify() wird sicher bei jedem setState() aufgerufen meillo@28: \item[-] hohe Update-Kosten bei Änderungen en-block meillo@28: \end{itemize} meillo@28: meillo@28: meillo@28: \subparagraph{Der Observer} meillo@28: \begin{itemize} meillo@28: \item[+] intelligenter Zeitpunkt des notify()-Aufrufs möglich meillo@28: \item[-] der Client darf den notify()-Aufruf nicht vergessen meillo@28: \end{itemize} meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: \newpage meillo@11: \section{Zusammenfassung} meillo@28: %\textbf{Zusammenfassend} meillo@28: \paragraph{Zusammenfassung} meillo@28: \begin{itemize} meillo@28: \item Menschen denken basierend auf der Realität meillo@28: \item deshalb Design Patterns auf Realität zurückführen meillo@28: \item Patterns anwenden weil man es in der Realität auch so machen würde meillo@28: \end{itemize} meillo@28: meillo@11: meillo@11: meillo@11: meillo@11: meillo@28: Erklaerung des Vorgehens meillo@28: Frage: war es erfolgreich? meillo@28: \textbf{} meillo@11: meillo@28: \paragraph{} meillo@28: meillo@11: meillo@11: meillo@11: meillo@28: \section{Abschließend} meillo@28: \paragraph{Verwendete Software} meillo@11: \begin{itemize} meillo@11: \item Debian GNU/Linux meillo@11: \item \LaTeX-Beamer und \texttt{pdflatex} meillo@11: \item Vim meillo@11: \item qiv und ImageMagick meillo@11: \item Mercurial meillo@11: \end{itemize} meillo@28: meillo@11: meillo@28: \paragraph{} meillo@11: \vspace{3ex} meillo@11: \centerline{\textbf{Danke für eure Aufmerksamkeit}} meillo@28: meillo@11: meillo@11: meillo@11: meillo@11: meillo@11: meillo@11: meillo@11: meillo@28: \appendix meillo@11: meillo@28: \section{Code} meillo@28: \textbf{Code? --- Nein, kein Code!} meillo@28: \paragraph{Denn} meillo@28: \begin{center} meillo@28: \textbf{ Implementierungen sind Schall und Rauch,\\ meillo@28: Konzepte dagegen bleiben bestehen! } meillo@28: \end{center} meillo@28: meillo@28: meillo@28: \vspace{4ex} meillo@28: {\scriptsize meillo@28: \paragraph{} meillo@28: \textit{ Beispiel-Implementierung in der Ausarbeitung. } meillo@28: meillo@28: } meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@28: meillo@11: meillo@11: meillo@11: \end{document}