References Last update: 18 April 2007 Erich Gamma, Ralph Johnson, Richard Helms, John Software Architecture Vlissides: Design Patterns, Addison-Wesley, 1994 Bertrand Meyer Jean-Marc Jezequel, Michel Train, Christine Mingins: Design Patterns and Contracts, Addison-Wesley, 1999 ETH Zurich, March-July 2007 Karine Arnout: From Patterns to Components, 2004 ETH Lecture 7: Patterns, Observer, MVC thesis, http://se.inf.ethz.ch/people/arnout/patterns/ Patterns in software development Benefits of design patterns Design pattern: ¾ Capture the knowledge of experienced developers ¾ A document that describes a general solution to a ¾ Publicly available repository design problem that recurs in many applications. ¾ Common pattern language ¾ Newcomers can learn & apply patterns Developers adapt the pattern to their specific application. ¾ Yield better software structure ¾ Facilitate discussions: programmers, managers Some design patterns A pattern is not a reusable solution Creational Behavioral Solution to a particular recurring design issue in a ¾ Chain of Responsibility ¾ Abstract Factory particular context: ¾ Builder ¾ Command (undo/redo) ¾ Interpreter ¾ Factory Method ¾ “Each pattern describes a problem that occurs over ¾ Iterator ¾ Prototype and over again in our environment, and then describes ¾ Singleton ¾ Mediator ¾ Memento the core of the solution to this problem in such a way Structural ¾ Observer that you can use this solution a million times over, ¾ Adapter ¾ State without ever doing it the same way twice.” ¾ Bridge ¾ Strategy Gamma et al. ¾ Composite ¾ Template Method ¾ Decorator ¾ Visitor ¾ Façade NOT REUSABLE ¾ Flyweight ¾ Proxy 1 A step backwards? Our first set of patterns & componentization Patterns are not reusable solutions: Observer pattern ¾ You must implement every pattern every time Model-View Controller ¾ Pedagogical tools, not components Improving on Observer: a more general & flexible approach We have done work at ETH to correct this situation: “A successful pattern cannot just be a book description: it must be a software component” Implementing the solution in C#/.NET Result: Pattern Library and Pattern Wizard Implementing the solution in Eiffel (see following lectures) Pattern componentization Karine Arnout Handling input through traditional techniques ETH PhD, 2004 Classification of design patterns: Program drives user: ¾ Fully componentizable ¾ Partially componentizable from End of input ¾ Wizard- or library-supported read_line ¾ Non-componentizable count := 0 Fully componentizable (48%) until exhausted loop count := count + 1 -- Store last_line at -- position count in Result Result [count ] := last_line read_line end Pattern componentization: references Handling input with modern GUIs Bertrand Meyer:The power of abstraction, reuse and simplicity: an User object-oriented library for event-driven design, in From Object- Orientation to Formal Methods: Essays in Memory of Ole-Johan Dahl, drives Lecture Notes in Computer Science 2635, Springer-Verlag, 2004, program: pages 236-271 se.ethz.ch/~meyer/ongoing/events.pdf “When a Karine Arnout and Bertrand Meyer: Pattern Componentization: the user Factory Example, in Innovations in Systems and Software Technology presses (a NASA Journal) (Springer-Verlag), 2006 se.ethz.ch/~meyer/publications/nasa/factory.pdf this button, Bertrand Meyer and Karine Arnout: Componentization: the Visitor execute Example, in Computer (IEEE), vol. 39, no. 7, July 2006, pages 23-30 that action se.ethz.ch/~meyer/publications/computer/visitor.pdf from my Karine Arnout’s thesis: From Patterns to Components, March 2004 program” se.inf.ethz.ch/people/arnout/patterns/ 2 Multiple observers Event-driven programming: example scenario Observers or subscribers One of your classes has a routine my_procedure Save file? Your application has a GUI object OK! Cancel OK_button Whenever the user clicks the mouse the underlying GUI or subject, library returns the mouse coordinates or publisher A = 50% You want to ensure that a mouse click at coordinates B = 30% [h, v ] calls my_procedure (h, v ) C = 20% Observed Model-View Controller Event-driven design (Trygve Reenskaug, 1979) Publishers Subscribers Routine Routine Routine Routine Confusion Event Event type Uncertain MVC references Events Overview (from .NET documentation) Reenskaug’s MVC page: Events have the following properties: heim.ifi.uio.no/~trygver/themes/mvc/mvc-index.html 1. The publisher determines when an event is raised; the subscribers determine what action is taken in response to the event. 2. An event can have multiple subscribers. A subscriber can handle His original MVC paper: multiple events from multiple publishers. heim.ifi.uio.no/~trygver/1979/mvc-2/1979-12-MVC.pdf 3. Events that have no subscribers are never called. 4. Events are commonly used to signal user actions such as button clicks or menu selections in graphical user interfaces. 5. When an event has multiple subscribers, the event handlers are invoked synchronously when an event is raised. To invoke events asynchronously, see [another section]. 6. Events can be used to synchronize threads. 7. In the .NET Framework class library, events are based on the EventHandler delegate and the EventArgs base class. 3 Architecture: avoiding glue code Attaching an observer (selective export) In class PUBLISHER : feature {SUBSCRIBER } Event producer attach (s : SUBSCRIBER) -- Register s as subscriber to current publisher. (e.g. GUI) require subscriber_exists : s /= Void do Direct Connection subscribed extend (s ) s subscription objects . end sub1 sub2 subn Model subscribers The invariant of PUBLISHER includes the clause Model View Controller (MVC) Design Pattern subscribed /= Void (subscribed is created by creation procedures of PUBLISHER) A solution: the Observer Pattern Triggering an event attach publish is detach attach * * update* * detach * update* -- Ask all observers to PUBLISHER SUBSCRIBER PUBLISHER SUBSCRIBER subscribe+ -- react to current event. subscribed subscribed: LIST […] unsubscribe+ do from (secret) PUB_3 subscribed.start + + SUB_2 SUB_4 SUB_3 PUB_1 PUB_2 until SUB_1 + update + + SUB_2 subscribed after . Dynamic binding! PUB_1 SUB_1 loop + update subscribed.item. update subscribers subscribed.forth sub * Deferred (abstract) Inherits from end sub1 sub2 n + Effective (implemented) end Client (uses) update Each descendant of SUBSCRIBER defines its own version of update Observer pattern Observer pattern Each publisher keeps a list of subscribers: (secret) feature {NONE } subscribed : LINKED_LIST [SUBSCRIBER] ¾ Subscriber may subscribe to at most one publisher To register itself, a subscriber may execute: ¾ May subscribe at most one operation subscribe (some_publisher) where subscribe is defined in SUBSCRIBER as: ¾ Publishers internally know about subscribers subscribe (p: PUBLISHER) is -- Make current object observe p. ¾ Not reusable — must be coded anew for each application require publisher_exists : p /= Void do p.attach (Current) end 4 Another approach: event-context-action table Example scenario (reminder) Set of triples One of your classes has a routine [Event type, Context, Action] my_procedure Save file? Your application has a GUI object OK! Cancel Event type: any kind of event we track known as OK_button Example: left mouse click Context: object for which these events are interesting Whenever the user clicks the mouse the underlying GUI Example: a particular button library returns the mouse coordinates Action: what we want to do when an event occurs in the context You want to ensure that a mouse click at coordinates Example: save the file [h, v] calls my_procedure (h, v ) Event-context-action table may be implemented as e.g. a hash table. Event-context-action table With .NET delegates: publisher (1) P1. Introduce new class ClickArgs inheriting from EventArgs, repeating arguments types of my_procedure: Event typeContext Action Left_click OK_button Save_file public class ClickArgs {... int x, y; …} Left_click Cancel_button Reset P2. Introduce new type ClickDelegate (delegate type) based on Left_click … … that class Right_click Display_Menu public void delegate ClickDelegate (Object sender, e) … … … P3. Declare new type Click (event type) based on the type ClickDelegate: public event ClickDelegate Click Language mechanisms With .NET delegates: publisher (2) P4. Write new procedure OnClick to wrap handling: C and C++: function pointers protected void OnClick (ClickArgs ca) {if (Click != null) {Click (this, ca.x, ca.y);}} C#: delegates P5. To publish an event of the given type, create new object (instance of ClickArgs), passing arguments to constructor: ClickArgs myClickArgs = new ClickArgs (h, v); Eiffel: agents P6. To publish an event of the given type, trigger event: OnClick (myClickArgs) 5 Event-context-action table in .NET The Event library Basically: ¾ One generic class: EVENT_TYPE ¾ Two features: publish and subscribe Click deleg1 deleg2 delegn OK_button For example: Event typeContext Action A button my_button that reacts in a way defined in my_procedure when clicked (event mouse_click) Left_click OK_button Save_file Left_click Cancel_button Reset Left_click … … Right_click Display_Menu … … … With .NET delegates: subscriber Example using the Event library D1. Declare a delegate myDelegate of type ClickDelegate. (Usually combined with following step.) The publisher (“subject”) creates an event type object: mouse_click: EVENT_TYPE [TUPLE [INTEGER, INTEGER]] is D2. Instantiate it with my_procedure as argument: -- Mouse click event type once create Result Tuple type ClickDelegate
Details
-
File Typepdf
-
Upload Time-
-
Content LanguagesEnglish
-
Upload UserAnonymous/Not logged-in
-
File Pages7 Page
-
File Size-