Button, Button, Whose got the Button?



Similar documents
How To Design Software

How To Draw A Cell Phone Into A Cellphone In Unminimal Diagram (Uml)

OO Design Quality Metrics

The Dependency Inversion Principle

Evaluating OO-CASE tools: OO research meets practice

Introduction. What is RAID? The Array and RAID Controller Concept. Click here to print this article. Re-Printed From SLCentral

Automating Rich Internet Application Development for Enterprise Web 2.0 and SOA

Structuring Product-lines: A Layered Architectural Style

UML Tutorial: Part 1 -- Class Diagrams.

Designing Real-Time and Embedded Systems with the COMET/UML method

Verification and Validation of Software Components and Component Based Software Systems

PART IV Performance oriented design, Performance testing, Performance tuning & Performance solutions. Outline. Performance oriented design

Rackspace Cloud Databases and Container-based Virtualization

How To Develop A Web Dialog For An Org Database With A Database On A Computer (Oracle)

Domain Driven Design and Model Driven Software Development

How To Understand The Dependency Inversion Principle (Dip)

The Challenge of Productivity Measurement

Composing Concerns with a Framework Approach

Characteristics of Java (Optional) Y. Daniel Liang Supplement for Introduction to Java Programming

UML SUPPORTED SOFTWARE DESIGN

The Case for a FOO-technology Web-based Application Development Service

Software Development: An Introduction

WJEC GCSE in Computer Science Computer Science Microsoft IT Academy Mapping

Object-oriented design methodologies

Real-Time Systems Prof. Dr. Rajib Mall Department of Computer Science and Engineering Indian Institute of Technology, Kharagpur

Business Modeling with UML

IRA 423/08. Designing the SRT control software: Notes to the UML schemes. Andrea Orlati 1 Simona Righini 2

Quotes from Object-Oriented Software Construction

B.Com(Computers) II Year RELATIONAL DATABASE MANAGEMENT SYSTEM Unit- I

Object Oriented Analysis and Design and Software Development Process Phases

Foundations for Systems Development

Development/Maintenance/Reuse: Software Evolution in Product Lines

Computer Information Systems (CIS)

Chapter 3 Chapter 3 Service-Oriented Computing and SOA Lecture Note

Object Oriented Database Management System for Decision Support System.

Making a Business Case for Single Sourcing

Software Life-Cycle Management

Quality Ensuring Development of Software Processes

Chapter 1 - Web Server Management and Cluster Topology

SIMULATION OF LOAD BALANCING ALGORITHMS: A Comparative Study

Applying Use Cases to Microcontroller Code Development. Chris Gilbert Cypress Semiconductor

Software Requirements Specification of A University Class Scheduler

Objectives. The software process. Basic software process Models. Waterfall model. Software Processes

2. Analysis, Design and Implementation

Keywords Aspect-Oriented Modeling, Rule-based graph transformations, Aspect, pointcuts, crosscutting concerns.

Quality Management. Managing the quality of the software process and products

Management Information System Prof. Biswajit Mahanty Department of Industrial Engineering & Management Indian Institute of Technology, Kharagpur

Real-Time Scheduling 1 / 39

Algorithms, Flowcharts & Program Design. ComPro

Let the Catalog Drive Lead-to -Service Efficiency

Chapter 2. Data Model. Database Systems: Design, Implementation, and Management, Sixth Edition, Rob and Coronel

Topics. Introduction. Java History CS 146. Introduction to Programming and Algorithms Module 1. Module Objectives

IC-AI SA Patterns as a Means for Intelligent Software Engineering

SEVENTH FRAMEWORK PROGRAMME THEME ICT Digital libraries and technology-enhanced learning

Chapter 6: Programming Languages

Dealing with Roles. Martin Fowler.

Tool Support for Software Variability Management and Product Derivation in Software Product Lines

Managing Software Evolution through Reuse Contracts

(Refer Slide Time: 02:17)

Object Oriented Databases. OOAD Fall 2012 Arjun Gopalakrishna Bhavya Udayashankar

Data Modeling Basics

Domain Analysis for the Reuse of Software Development Experiences 1

Introduction. 1.1 Motivation. Chapter 1

IS YOUR DATA WAREHOUSE SUCCESSFUL? Developing a Data Warehouse Process that responds to the needs of the Enterprise.

Rational Software White Paper

The Classical Architecture. Storage 1 / 36

CS311 Lecture: Sequential Circuits

How To Develop Software

CS 451 Software Engineering Winter 2009

Keywords Class level metrics, Complexity, SDLC, Hybrid Model, Testability

PARALLEL PROCESSING AND THE DATA WAREHOUSE

Name of pattern types 1 Process control patterns 2 Logic architectural patterns 3 Organizational patterns 4 Analytic patterns 5 Design patterns 6

GenericServ, a Generic Server for Web Application Development

Component Based Software Engineering: A Broad Based Model is Needed

Unit I Page No. 1 System Development Object Basics Development Life Cycle Methodologies Patterns Frameworks Unified Approach UML

Object-Oriented Design Guidelines

Building Systems Using Analysis Patterns Eduardo B. Fernandez Florida Atlantic University Boca Raton, FL

Alternatives for Rule-based Application Development

Management Information System Prof. Biswajit Mahanty Department of Industrial Engineering & Management Indian Institute of Technology, Kharagpur

Quality Management. Objectives

Quality Management. Ian Sommerville 2004 Software Engineering, 7th edition. Chapter 27 Slide 1

Unit Testing with Monkeys Karl-Mikael Björklid University of Jyväskylä Department of Mathematical Information Technology

Applying Agile Methods in Rapidly Changing Environments

A Practical Guide to Test Case Types in Java

Software: Systems and Application Software

REST Client Pattern. [Draft] Bhim P. Upadhyaya ABSTRACT

Programming Languages

Database Management System Prof. D. Janakiram Department of Computer Science & Engineering Indian Institute of Technology, Madras Lecture No.

Process-Driven SOA Development

How to Outsource Without Being a Ninnyhammer

The Rules 1. One level of indentation per method 2. Don t use the ELSE keyword 3. Wrap all primitives and Strings

Data Center Energy Consumption

Object Oriented Hybrid Software Engineering Process (SEP) model for Small Scale Software Development Firms

Last Class: OS and Computer Architecture. Last Class: OS and Computer Architecture

Integrating Databases, Objects and the World-Wide Web for Collaboration in Architectural Design

UML other structural. diagrams. (Implementation Diagrams UML 1.5) Università di Padova. Facoltà di Scienze MM.FF.NN. Informatica - anno

Objectives. Distributed Databases and Client/Server Architecture. Distributed Database. Data Fragmentation

Quality Management. Objectives. Topics covered. Process and product quality Quality assurance and standards Quality planning Quality control

co Characterizing and Tracing Packet Floods Using Cisco R

COMP61532 Pattern-based Software Development Liping Zhao John Sargeant Comments. Please see the attached.

Transcription:

,, Whose got the?,, Whose got the? (Patterns for breaking client/server relationships) By Robert C. Martin Introduction How many design patterns does it take to turn on a table lamp? This question was explored in some depth on the net recently. Someone proposed a simple application based upon a table lamp and then provided a design that he felt was reusable. There followed many critiques and counter designs and arguments. Many people submitted their own notions of how the design should look, and many others quarreled over the fundamentals of object oriented modeling. This article represents my interpretation of that fluid and dynamic conversation. I will not mention any names, nor attempt to chronicle the actual net articles. 1 Instead I will try to present the issues and design patterns in a way that is instructive and entertaining. The Application Description The application that we are discussing really is just a table lamp. The lamp has a button and a lightbulb. When the user pushes the button on the lamp to the on position, the lightbulb goes on. When the user pushes the button to the off position, the lightbulb goes off. The software we are designing is the software that resides within the table lamp itself. Somehow the fact that the user has pressed the button is communicated to the software. The software must then send the appropriate signal to the lightbulb. The goal is to design this software so that it is constructed from reusable components. At first glance, it is hard to believe that we could have a meaningful discussion about such a simple problem. Yet this problem, simple as it is, is a classic client-server scenario. Much of power of OOD is manifested in managing the dependencies between clients and servers. Thus, while the algorithms employed in solving this problem are utterly trivial, the patterns of dependency are worthy of study. Managing Client and Dependencies The table lamp problem is an extremely simple example of a Client/ relationship. A Client/ relationship exists between two objects if one sends a message to the other, expecting that other to perform some kind of service operation. The Client is the object that sends the message, and the is the object that receives the message and preforms the service. In traditional procedural programming, clients had to depend upon servers. s were often implemented as functions that the clients had to link with and make calls to. Thus, the clients had direct knowledge of the server, and the source code of the client had specific knowledge of the source code of the server. 1. Those interested should procure the thread named Do OO People Really Understand Software Reuse from an archive of the comp.object newsgroup for Jan/Feb 95. ROAD Guest Column Robert Martin 1

,, Whose got the? In OOD we often find it desirable to break the dependency of the client upon the server. This allows the client to be used with many different servers, so long as they all conform to the same interface. It also isolates the client from the server such that if the source code of the server is changed, the client does not need to be changed or recompiled in turn. This prevents changes from propagating up to clients from servers. Solving the Problem We can begin to solve the table lamp problem by examining the two use cases. When the user pushes the button to the on position, the system turns the lightbulb on. When the user pushes the button to the off position, the system turns the lightbulb off. These use cases translate nicely into the simple object diagrams in Figure 1 and Figure 2. In each case, the object receives some stimulus from the outside world 1:TurnOn "On" FIGURE 1. button on 1:TurnOff "Off" FIGURE 2. User Pushes Off and then sends the appropriate message to the object. These two objects were chosen in order to separate the software that detects the state of the button, from the software that controls the state of the lightbulb. I felt that this separation was important because these two concepts could be reused in very different contexts. That is, buttons could be used to control devices other than lightbulbs, and lightbulbs could be controlled by objects other than buttons. ROAD Guest Column Robert Martin 2

,, Whose got the? This rather simple dynamic model is supported by the static model that is shown in Figure 3. The class contains the class This contains relationship results from the fact that instances of must know what object to send the TurnOn and TurnOff messages to. The most common mechanism for satisfying this need is for to contain in an instance variable. FIGURE 3. contains The use of the Contains relationship as shown in Figure 3 spawned a lot of controversy. Several people felt that the object model should reflect the real world relationships between a button and a lightbulb. Since, in the real world, a button does not contain a lightbulb, these people felt that the relationship was somehow incorrect. However, containment in OOD is not the same as physical containment in the real world. Aggregation of objects may represent real world physical containment; but more often it represents some other kind of physical connection. As Booch says:...aggregation need not require physical containment... 1 In Figure 3 I am using aggregation to represent the fact that there is a permanent cause/ effect relationship between a particular button and a particular lightbulb. If one insists upon a real-world counterpart for this relationship, then I suppose the wire that connects a physical button to a physical lightbulb can serve. However, in my opinion, far too much effort is expended in trying to find real-world justifications for classes and relationships. As Jacobson says: We do not believe that the best (most stable) systems are built by only using objects that correspond to real-life entities... 2 Making the Reusable The disadvantage of the solution in Figure 3 should be clear. While the class is nicely reusable, the class is not. Were this design to be implemented, then the source code of would depend upon the source code of, and so could not be reused without dragging along. This dependence of the client () upon the server () is the hallmark of procedural design, rather than object-oriented design. In procedural design, clients depend upon their servers, and the servers are independent. In object-oriented design, abstract polymorphic interfaces are used to break the dependence of the server upon the client. 1. Object Oriented Analysis and Design with Applications, 2d. ed. Grady Booch, Benjamin Cummings, 1994, p. 129 2. Object Oriented Software Engineering, Ivar Jacobson, Addison Wesley, 1992, p. 133 ROAD Guest Column Robert Martin 3

,, Whose got the? Obviously, is the kind of class that we would like to reuse. We would like to be able to control devices other than s with a. Thus, somehow, we have to break the dependency between and. There are several ways to do this, each employing a different design pattern. We will look at two popular mechanisms. The Intelligent Children Pattern The first solution is one which employs a pattern that I call INTELLIGENT CHILDREN. The static model for this pattern can be seen in Figure 4. The idea is that is an abstract class that knows nothing about. A special derivative of, called knows about. Thus, can be reused in other applications to control other devices, by deriving classes from that know about those devices. A Pump Pump FIGURE 4. Intelligent Children Pattern - Static Model How does this pattern operate? The dynamic model is shown in Figure 5. The class is an abstract base that knows how to detect when a user has pushed the button. It then sends itself a message, either TurnOnDevice or TurnOffDevice. Since is abstract, it must have a derivative. If the derivative is a, then upon receipt of TurnOnDevice it sends the TurnOn message to the contained. Likewise, upon reception of the TurnOffDevice message, it sends the TurnOff message to the contained. Note that the class is now reusable, and that new kinds of objects that reuse can be created at any time. is reusable because it no longer depends upon. We have broken that dependency by converting into an abstract class, and supplying it with polymorphic interfaces. This management of client server dependencies, using abstract polymorphic interfaces, is the hallmark of a good object-oriented design. It should be clear that much of the challenge in object-oriented design lies in the identification and specification of these interfaces, and ensuring that they can operate polymorphically. Generally, this information is not found by studying a model of the real-world. Instead, it is found by examining the dependencies that form as the software design evolves and then finding ways to use abstraction to break those dependencies. ROAD Guest Column Robert Martin 4

,, Whose got the? 1:TurnOnDevice 1:TurnOffDevice "On" "Off" 1:TurnOnDevice 2:TurnOn 1:TurnOffDevice 2:TurnOff FIGURE 5. Intelligent Children Pattern - Dynamic Model The INTELLIGENT CHILDREN pattern is most useful when you want to reuse a class (like ) with other classes that already exist (like ). New derivatives of can be created at any time and adapted to other classes. The Abstract Pattern Another pattern that is useful for breaking dependencies, is one that is related to a pattern that Gamma 1 calls STRATEGY. I call this particular variant ABSTRACT SERVER. Figure 6 shows the static structure of this pattern. is a concrete class that contains a reference to the abstract base class. Figure 7 and Figure 8 show that when receives stimuli from the outside world, it translates that stimuli into TurnOn and TurnOff messages that it sends to the. A FIGURE 6. Abstract static model Figure 9 shows how the ABSTRACTSERVER pattern can be integrated with the class. is made to derive from. Clearly this plan is only useful if the class does not already exist. 1. Design Patterns: Elements of Reusable Object-Oriented Software, Gamma, et. al, Addison Wesley, 1995 ROAD Guest Column Robert Martin 5

,, Whose got the? 1:TurnOff "Off" FIGURE 7. Abstract Turns Off 1:TurnOn "On" FIGURE 8. Although this technique is very common, it has some disadvantages. Notice that it forces the class to have a dependency on something that is related to. In Booch s method, and would almost certainly belong to the same class category 1. And so would depend upon the category that contained. This dependency is probably not desirable since it means that cannot be reused in a context that is free of the concept of. A FIGURE 9. as subclass of The Adapted Pattern We can correct this situation by employing another one of Gamma s patterns. This one is called ADAPTER. As shown in Figure 10, can be adapted to by deriving from and having it contain the. 1. A class category is a logical grouping of classes which, in Booch s method, is the granule of release, and the granule of reuse. ROAD Guest Column Robert Martin 6

,, Whose got the? A FIGURE 10. Adapted to. The conjoined use of ADAPTER and ABSTRACTSERVER is so common, that it is a pattern in its own right. I call it: ADAPTEDSERVER. This design completely separates from. Either may be reused without having to drag the other along. Comparative Analysis of the Solutions Which of these two solutions is better? The INTELLIGENTCHILDREN approach requires somewhat less code, and fewer classes and objects. There are only two objects, the derivative of, and the. Whereas the ADAPTEDSERVER requires three objects, the, the and the. Moreover, INTEL- LIGENTCHILDREN uses fewer CPU cycles than ADAPTEDSERVER because fewer messages need to be passed. So from the point of view of run time efficiency, memory efficiency and development time efficiency, the INTELLIGENTCHILDREN pattern is the winner. However, ADAPTEDSERVER is a more flexible solution. When this pattern is used, any object can be used to control any derivative of. Thus, while the INTELLIGENTCHILDREN solution locks the relationship between a particular object and the object it controls, the ADAPTEDSERVER solution allows many different objects to be controlled by the same at different times. Thus, the choice of pattern to use involves an engineering trade off. Since the speed and complexity overhead of ADAPTEDSERVER is not very high, it will normally be worth the benefit of the extra flexibility. But where memory, CPU and programmer resources are exceedingly tight, it may be best to sacrifice flexibility and use the INTELLIGENTCHILDREN pattern. Regarding Pragmatism I think it is important to notice that the most straightforward solution of all was the one represented in Figure 3, the one which I faulted as being most like a procedural design. Pragmatism would seem to dictate that we opt for this solution because it is the simplest. However, simplicity of design does not necessarily relate to simplicity of maintenance, or to simplicity of reuse. Rather, in order to create a design that is maintainable and reusable, some conceptual effort must be applied. ROAD Guest Column Robert Martin 7

,, Whose got the? The reason that software applications become unmaintainable and/or unreusable, is that they become cross-linked. There are too many dependencies traversing the design tying one part of the design to another. The net result is the tangled web that so many of us have come to expect from a well evolved software design. If we are to manage the complexity of these cross-links, then we must provide the infrastructure in the design that will afford that management. The most straightforward design, the design that concentrates only upon functionality, and does not consider maintainability and reusability, will not provide those affordances. Thus, pragmatism must be moderated to some extent. There is a cost to applying object-oriented design. An good object-oriented design will generally be more complex than a procedural design for the same application. This extra complexity represents the infrastructure needed to manage the dependencies within the software. We should not begrudge this extra complexity. Rather, we should appreciate that it will make the job of maintaining and reusing the software simpler. Conclusion This article has shown two methods for separating clients from servers. The INTELLI- GENTCHILDREN pattern employs abstract polymorphic interfaces in the client and expects the server to be manipulated by a derivative of the client. The ADAPTEDSERVER pattern places abstract polymorphic interfaces in an abstract class that is contained by the client, and a derivative of which contains the server. In both cases, the key to breaking the dependency between the Client and the is in the employment of abstract polymorphic interfaces. ROAD Guest Column Robert Martin 8