Patterns for Software Architectures

  Arvind S Krishna      

Information and Computer Science Department

University of California, Irvine CA

Abstract:

It is a common observation that engineering disciplines have handbooks that describe successful solutions. Patterns are an attempt to describe successful solutions to common software problems with the long-term goal of developing handbooks for software engineers. Patterns exist at different levels of abstraction starting at the architectural level and percolating down to implementation issues. Patterns thus have the potential of reducing the development life cycle of software by providing a standardized solution to recurring architectural, design and implementation issues.

The first section provides insights into Pattern Properties, Pattern Categories and systems for Pattern documentation. The main focus of the paper is to discuss patterns at the architectural level. In depth analysis of the Layers Pattern, the Broker Pattern and Model View Controller Pattern is given. Succinct overview of architectural styles and frameworks used in conjunction with patterns is provided. Finally musings on the future of pattern research is presented.

 

Keywords: software architectures, patterns, object orientation, architectural styles, frameworks, pattern systems, and pattern languages

 

1. Patterns:

Origin of Patterns can be traced to Christopher Alexander, an Architect who recorded design rationale in a structured format. In his book [ALE 79], he shows how patterns could be applied in urban planning. Ward Cunnigham and Kent Black, SmallTalk hackers, continued with this notion of Patterns and discussed in OOPLSA 87. Erich Gamma’s Ph.D. thesis and the seminal book Design Patterns by the Gang of Four [GHJV 95] ushered in widespread interest in Patterns. In its current state patterns is a hot topic in research, there is separate conference Pattern Languages of Programs (PLoP)TM .

 

1.1 What is a Pattern?

“A Pattern could be defined as a three part rule that expresses a relation between a certain context, a problem and a solution.” [Ale 79]. Context describes the situations in which the problem occurs. Problem helps in solving the concrete design issues that the pattern intends at solving and the Solution part elucidates how to solve the recurring design issue. It also describes runtime issues involved like collaboration, communication and organization of the components of the system. An Anti Pattern is a literary form that describes a commonly occurring solution to a problem that generates decidedly negative consequences. Anti Patterns are easier to figure out than patterns: It is often easier to recognize a defective situation than to implement a solution.

 

1.2 Properties of Patterns:

 

·        Patterns address recurring design problems and provide solutions for them. Patterns also serve as documentation of well proven design solutions. They are not invented or created artificially.

·        Patterns provide means of reuse. Designers while encountering similar situations need just to plug the pattern in place and need not have to “reinvent the wheel”.

·        Patterns are analogous to Best Practices applied in the organizational context. Instead of knowledge existing only in the minds of the experts, Patterns make them available generally.  Using Patterns thus produces high quality software.

·        Patterns provide a common vocabulary for understanding of design principles. Pattern names become a part of the design literature. The name of the pattern could be used for understanding the design of the system, its analysis and also its refinement.  They obviate the necessity to explain the solution to a problem in a lengthy manner.  E.g. Layered Pattern helps in understanding the system and also its constituent elements and their interactions without verbose explanations.

·        Patterns serve as a means of documenting software architectures. They help in capturing the vision of the architect and prevent the violation of this vision.  They also help in the construction of software with well-defined properties. They provide a template for the functional behavior and help in the implementation of the functionality of the application.

·        Patterns act as building blocks for the construction of more complex software systems. Combination of patterns results in Pattern Systems.

·        Patterns help in reducing development time of a software system and help managing the complexity of the software.

 

1.3 Pattern Categories

 Patterns cover various ranges and scales of abstractions. They are classified in my raid fashions. Erich Gamma [GHJV 93] categorize patterns into creational (process of object creation), behavioral (the way in which the classes and or objects collaborate and share responsibility) and structural (composition of the classes or objects) patterns. Frank Buschman et al in their book [BMRSS 95], classify patterns into finer grained criteria as adaptable systems, communication, distributed systems and organization of work. Patterns also range from Domain independent to Domain specific patterns.  In general Patterns fall into three broad categories:

 

·        Architectural Patterns: They are templates for concrete software architecture. They lay down the structural specification of the system and also determine the architecture of the sub systems and specify their responsibilities.

·        Design Patterns: Are medium scale patterns. They provide the schema for refining the sub systems or the components of the software system. They are smaller in scale than the architectural patterns but tend to be independent of the programming language used.

·        Idioms: Are the lowest level of patterns. They describe how to implement the particular aspects of the components. Idioms address both the design and the implementation issues of the components.

It is common to find other terms like Architectural Styles and Frameworks used in juxtaposition with Patterns.

 

Architectural Styles: The notion of architectural styles was first coined by Perry and Wolf in their paper, [PEW 92] and may be defined as a family of software systems defined in terms of its structural organization. “An Architectural style expresses components and relationships between them, with the constraints on their application and the associated design rules for their construction” [BMRSS 95].  In general a style represents a particular structure of the system together with the methods the specify how to construct the system.  The exact difference between an architectural style and a Pattern is hazy and for all practical purposes architectural styles are equivalent to architectural patterns. But Buschmann et al in their book [BMRSS 95] bring out some differences between styles and patterns.

·        Styles only describe the overall structural framework for applications. Patterns exist at various levels of abstractions from the architectural level to idioms at the application level.

·        Architectural styles are independent of each other, while patterns depend on smaller patterns that they encompass.

·        Patterns are more practical in that they have documented solutions, problem types they solve and the underlying logic behind their usage.

 

David Garlan, in the paper [DAV 95] describes some of the properties of Architectural Styles

·        Provide a vocabulary for component and connector types such as pipes, filters, clients, servers etc.

·        Define a set of topological constraints that determine the compositional rules of the elements.

·        Define semantics of the applications that adds meaning to it.

·        Performance analysis of systems built in that style. E.g. Deadlock Detection for applications built adhering to a particular style.

 

Some of the benefits of Styles include [DRA 97]:

·        Design reuse: the routine solutions that are applied in problems can be reused repeatedly.

·        Code Reuse: shared implementation is possible. E.g. Unix Pipe and filter style may reuse Unix operating system primitives.

·        Ease of understanding if the structure of the system were to be conventionalized.

·        The use of standard styles may also promote interoperability. E.g. the OSI protocol stack and CORBA object oriented architecture.

·        Style specific analysis is possible.

 

 

Framework is a partially completed software system that is ready for instantiation. It provides the architecture for the family of sub system and provides building blocks to create them. A framework for applications in a specific domain is called an application framework. This viewed from the perspective of patterns is a pattern for a complete software system in a given application domain.


1.4 Pattern Descriptions

 

Patterns need to be represented in a clear and intuitive fashion if one has to understand and discuss them. A good description enables the reader to grasp the essence of the pattern and cull the necessary details for the implementation of the pattern. Patterns also need to be described uniformly as this helps in comparing patterns and also in their analysis. Patterns literature today comes with well-defined ways of tabulating patterns.  In their book [GHJV 95] document Patterns as

 

·        Pattern Name and Classification

·        Intent: the rationale behind the patterns

·        Motivation: Scenarios that illustrate the use of the patterns.

·        Applicability: where does the pattern apply?

·        Collaboration: how the components interact and provide some sample code.

 

[BMRSS 95] in their book on Pattern Oriented Software Architecture, tabulate patterns as

 

·        Pattern Name

·        Example: Problem statement of the example and also diagrammatic representation.

·        Context: condition of applicability

·        Structure: CRC diagram (Class, Responsibilities and Collaborators)

·        Implementation and Example: heuristics for the solution provided

·        Known Uses and Consequences: benefits and drawbacks

 

Mary Shaw [Shaw 96] tabulates them into

 

·        Name and Problem

·        Context and Solution: system model, types of components, type of connectors, control structure.

·        Significant Variants:

·        Examples and References to use patterns.

 

 

2.0 Architectural Patterns

 

Architectural Patterns express fundamental structural organization schemas for software systems and also provide a set of predefined sub systems.  They represent the highest level patterns in a pattern system. There at present does not exists a very exhaustive list of architectural patterns. The categorization of existing patterns has been driven by the general properties of the application of systems. It is also an accepted fact that software systems may not be structured according to a single architectural pattern, as they need to support different system requirements. A single architectural pattern or a system of patterns is not complete software architecture in itself. It remains as structural framework that has to be refined further. Patterns are only the first step in specifying the architecture. Mary Shaw in her paper [Shaw 95] asserts that patterns differ according to the intuition behind the pattern, kind of components that are used to construct the system, interaction between the components and their execution.  Several patterns address issues at the architectural level of systems. As seen earlier patterns may be categorized into several boxes with different nomenclatures. The paper analyses patterns by describing:

·        Example: where the pattern could be useful

·        Problem and Context:

·        Solution: the system model captured by the pattern.

·        Heuristics for implementation: steps that need to be followed for the implementation of the pattern

·        Known uses and Benefits: where is the pattern put to use and some of the advantages of using the pattern.

 

 The Layers pattern, Broker pattern and the Model View Controller pattern are analyzed in accordance with the above-mentioned scheme.

 

 

 

 

 

3.0 Layers Pattern

 

This pattern is suitable for applications that could be broken down into groups of sub tasks where each group is at a different level of abstraction.

 

Figure 3.1: TCP/IP Protocol Stack along with the Data Segments in Different Layers.

 

·        Example: Networking protocols are the probably the best examples of the Layers patterns. Fig 3.1 provides hierarchy of the TCP/IP protocol stack.  Each layer deals with a different aspect of communication and uses the functionality of the adjoining lower layer. The layers communicate with each other through well-defined interfaces.

 

·        Context and Problem: A large system that requires decomposition. This kind of a pattern is most applicable in situations where there is a mix of lower and higher level issues and the higher level operations rely on the lower level ones.  The pattern of communication could be top down or bottom up.  For example requests could move from the top to bottom layers and responses could move from bottom to the top layers. Another issue is the portability of the systems in different environments, usually the higher layers tend not be that portable.

 

·        Solution: from a higher level viewpoint the solution is very simple to identify the number of layers that the system requires and to place them one top of the other.  The order in which the layers are to be designed are not specified in the literature. Other issues include whether layer J could be a complex layer that could be subdivided further. One of the essential constraints is that within each layer the constituent components need to work at the same level of abstraction.  The structure of the individual layer may be specified as follow using CRC(Class, Responsibilities and Collaborators) cards

 

 

 

Figure 3.2 CRC Card for Layer J

It is seen that Layer J+1 only uses the services of Layer J.  These services are usually provided through well-defined interfaces. There does not exist any further dependency between the layers. System may also be developed where a layer J could access services provided by any of the layers below it. Here the lower layers are not opaque to the higher layers.

 

Heuristics for Implementation: The implementation the system maybe done in a bottom up or a top down fashion. The following gives a top down solution for the problem.

 

·        Define criterion for grouping tasks into layers. This is conceptual in nature.

·        Determine the number of levels using the abstraction criterion. Each abstraction level corresponds to one layer of the pattern. Consider issues like placement of function in different layers and the composition of every layer.

·        Give a suitable name for the layers and assign tasks to them. While designing the tasks consideration needs to be given for the placement of the tasks in layers and also arrangement in a hierarchy.

·        Decide on the services that the layers are going to offer to the higher layers. The layers have to be strictly separate from each other.  The return types of the functions and also the parameters that the functions take are to be hammered out. Usually the services that are used frequently are located in the lower layers. Also as you go down the hierarchy the functions tend to be system specific like OS system calls etc.

·        Specification of the interfaces provided with every layer.  Lower layers act as a black box to the higher layers. In a white box approach the functionality of the lower layers is visible to the higher layers.

·        Communication between the layers:

- Push Mechanism: the higher layer pushes the information on to the lower layers when required.

- Pull Mechanism: the lower layers fetch information from higher layers at their own discretion.

·        Design of a proper error handling strategy.  An error may be handled in the layer where it occurs or could be passed on to a higher layer. In this the case the error description needs to be transformed into a format that is understood by the higher layer.  It is advantageous to have general error format that may be propagated in all the layers and it is easier to handle errors in the lower layers than at a higher level.

 

Advantages and Liabilities: Some of the scenarios where this pattern is useful are [BAM 91] [FRI 85] [LAS 79] and [PAU 85]. Virtual Machines fall seamlessly in this category. The virtual machine at every layer insulates higher layers from low-level details or varying hardware. Application Programming interfaces are usually hierarchical in nature.  Business domain has a two-layer architecture. The bottom layer being the Database and many layers work concurrently on top of the Database.

 

Advantages of using the Layers pattern is that the lower layers can be potentially reused. The layers have well defined interfaces and may be reused in multiple contexts.  This could reduce the effort involved in developing systems as concurrent teams may work on each of the layers. This also allows for standardization of the tasks and the interfaces of the layers. Thus different vendors could provide solutions for the different interfaces. The standardized interfaces enable local changes without regard to higher layers. Algorithms may be changed without regard to the higher layers.

 

This pattern is not without is share of liabilities. It is seen that this pattern is usually not very efficient as volumes of data has to be exchanged between the layers and passed down from one layer to the other. This is also true for the error messages that need to be propagated up in the hierarchy. There exists lot of duplication of functionality. Several layers perform the same function. As in the TCP/IP error checking is done by more than one layer, leading to redundancy. 

The decision of assigning the granularity of the layers and assignment of tasks to the layers is very difficult to make but is essential to the success of the architecture.

 

4.0 Pipe and Filter Pattern:

 

The pattern provides a structure for systems processing streams of data. Each of the processing steps is encapsulated in a filter component.  Pipes enable the transfer of data between the adjacent components.

 

Figure 4.1 Pipe and Filter Pattern

 

·        Example: The best example of the pipe and filter pattern is the Unix pipe and filter, where an output of a command is fed as the input of another. Frequent tasks like program compilation and document creation are usually done using pipes in Unix. CMS pipelines are extensions that help in supporting pipes in IBM Mainframes. CMS pipelines provide reuse and integration platform in the same way as Unix.  LASSP[SET 95] Tools is a tool set that mainly contains filter programs that also use Unix Pipes.

 

·        Context and Problem: This pattern is applicable in a setting where there are processing data streams that the system needs to transform. The system task decomposes naturally into several stages and requirements likely to change.  The pattern is most suitable for applications that require a defined series of independent computations to be performed on data.  The computations are performed incrementally on the data stream and in principle proceed in parallel. This reduces the latency of the system.

 

·        Solution: Divide the tasks into several sequential processing steps. The output of one step is connected as the input of the other. The individual steps are implemented using the filter components.

To achieve low latency and real parallel processing the filter consumes and delivers data incrementally. Outputs may flow into a data sink, a file, a terminal, animation program etc. Pipes connect the data source, filters and the sink and the sequence of filters combined with pipes is called a pipeline. The structure of the pipes and filters may be defined using CRC cards.

 

 

Figure 4.2 CRC diagram for the Filter and Pipe Class

 

 

Figure 4.3 CRC diagram for the Data Source and Sink Class

 

Heuristics for Implementation:

The implementation of the pipe and filter architecture is straightforward. Message queues or Unix like pipes may be used. The implementation of the Data Source and Sink follow that of the pipe and filter.

 

·        Divide the system’s task into a sequence of processing stages. Each stage depends only on the output of its predecessor. The stages are connected by data flow.

·        Data format to be passed along each of the pipes needs to be decided. Deciding on a uniform format helps in flexibility because it makes recombination of the filters easy.  Usually it is seen that one data format stymies the flexibility of the messages. For e.g. choosing ASCII text as the format may lead to improper conversion of the float data type from and to strings. To solve the problem it is better to create filters to convert from one format to another.

·        Decide on the implementation of the each pipe connection. This also determines if the filters are active or passive components and whether the pipes act in the push or the pull mode.  Using direct calls between filters for data transfer is a simple solution. Synchronization could also be done for adjacent active layers.

·        Designing the filter. The design depends on the tasks that it performs and also on the adjacent pipes. Passive filters may be implemented as function for pull or a procedure for push.  Active filters may be implemented as threads or as processes. Control over the behavior of the filters promotes reuse of the filters. Filters could also allow parameters to be passed to them.

·        Design for Error handling: This becomes hard, as there is no global state. It is very difficult to provide for a generalized error-handling pattern for the pipe and filter architecture. One of the mechanisms suggested is the use of buffering in case of crashing of filters.

 

Advantages and Liabilities:

One of the significant advantages is that there are no intermediate files that are necessary but may be present. Results could be computed using separate programs by storing intermediate results in a pipe. Filters tend to have a simple interface. The reusability of the filter components allows the creation of new processing pipelines by rearranging the filters. This recombination promotes reuse of the components. This also leads in rapid prototyping of the system from existing filters. Parallel processing leads to achieving efficiency.

Some of the liabilities of this pattern are, if a large amount of global data needs to be shared then application of this pattern proves to be inefficient. Efficiency gains due to parallel processing are often unrealistic. Synchronization of filters via pipes may stop and start pipes often, esp. if the buffer in the pipe is very small. Finally the implementation of a single error handling mechanism is close to impossible in the pattern.

 

5.0 Broker Pattern:

 

This pattern is used to model the interaction between distributed systems with de coupled components that interact using remote service location. A broker component coordinates the requests, responses, error and results between the components.  Platforms such as Microsoft’s OLE  (Object Linking and Embedding) [BRO 94] and OMG’s CORBA [OMG 92], IBM’s SOM and DSOM [CAM 94] are based on this pattern. The groups of users who could benefit from this pattern are those working with existing broker systems and interested in understanding the system, those who want to build lean system out of the existing systems or those who want to build a full fledged Broker system.

 

 

Figure 5.1 Highest Level Abstraction of the Broker in CORBA

·        Example: This form of an application is suited for communication between distributed systems seamlessly. The application is unaware of the location of the service or the physical location of the host providing the services. The hosts may also speak different languages. A host invokes a function call on the remote host as if it were a local procedural call. The Broker is responsible for passing the requests from the client to the host in another environment and invoking the appropriate function in that host and returning the execution status of the invocation. All the while the client is unaware of the Server’s location.

 

·        Context and Problem: The context is an environment that is distributed and possibly heterogeneous and has independent cooperating components. The main task is to design the application as sets of inter operating components than as a monolithic application. To make the application distributed the functionality is split between the components. This also makes the application flexible and scalable. However some form of inter process communication is required and the implementation of the broker is language specific in nature.  Services for adding locating and removing components also need to be considered.  The application should only see the interface of the object. It should not know anything about the implementation details of the object or its physical location. Components should be able to access services provided by other components through domain transparent remote location services.

 

·        Solution: Broker component is introduced for better de coupling of the components. Servers register themselves with the clients and make their services available to the clients through interfaces.  There are six types of participating component clients, servers, brokers, bridges, client side and server side proxies.  A Server implements the services and exposes the functions through interfaces. These interfaces are defined using IDLs Interface Definition Languages or through binaries.  Clients are applications that access the services of at lest one of the servers. Clients forward requests to the broker and receive exceptions or responses from the broker. The CRC cards for the Clients are servers are given below

 

 

Figure 4.2 CRC of Client and the Server Class

A broker is a messenger that is responsible for the transmission of requests from the clients to the servers and the responses or the error message back to the client. The broker must have some means of locating the receiver of a request based on unique system identification. It offers APIs to the Client and the Server for the above operations.

 

Figure 4.3 CRC of Broker Class

The client side proxies represent a layer between clients and the broker. This additional layer is used for the transparency purposes. Proxies help in hiding implementation details form the clients like inter process communication messages. Marshalling of parameters and results. Proxies are also responsible for translation of the pattern specified in the broker into object model used in the programming language in the client.  Server side proxies are responsible for receiving requests and unpacking them and invoking the appropriate services.

 

Figure 4.5 CRC of the Proxies on the Client and the Server

Heuristics for Implementation:

·        Define an object model. This should include information like names, requests, values, exceptions, type extensions and interfaces and operations. Semantic issues also need to be considered.

·        The kind of component interoperability that the system should offer. This could be dome using the interface definition language or using binaries. The binary approach needs programming language support e.g. use of binary method tables in Microsoft’s OLE.

·        Specify the API’s that the broker component provides for spelling out the collaboration between the client and the server. Use of Proxy objects to hide the implementation of the client and the servers.

·        Development of the wire level protocols for the interaction between the client and the server side proxies.

·        When a client invokes a procedure call of the server then the Broker system is responsible for returning all the error messages and the results to the client. It needs to remember which client accessed which server.

These are some of the very high level issues that need to be incorporated in the broker pattern.

 

Advantages and Liabilities:

The pattern offers location transparency to the clients. Clients do not have any information about the location of the servers. The functionality of the servers could change, as long as the interfaces remain the same. The use of proxies and bridges increase the reusability of the components. Portability, the broker hides the operating system and network details from the clients and the servers. This enables the clients and the server components to be ported to different components. Different broker system can communicate if they all understand the same protocol.

This pattern is not without its liabilities. It is usually seen that applications using brokers are slower than application distributions that are static and known. Most of the bindings are implementation specific in nature. A broker-based system also offers a lower fault tolerance when compared to a non distributed software system.

 

5.0 Model View Controller Pattern:

Figure 5.1 MVC Interaction Diagram

 

This pattern divides the interactive application into three parts. The model contains the core functionality and the data. View displays information to the user and controllers handle user the inputs. Views and the controller together provide the user interface.

 

Context and Problem: Useful for interactive applications with a flexible human- computer interface. User interfaces are prone to change. Different users place conflicting requirements on the interfaces. Thus building the system tightly interwoven with the interface makes the system inflexible and inextensible. This would entail developing different systems for each of the user interface implementations.  

 

Solution: MVC was first introduced in SmallTalk –80 programming environment [LP 91] [KPP88]. The Document View Variant of MVC is incorporated in MFC in VC++ environment [KRU 96]. MVC divides the applications into three areas the processing, input and output. The model component contains the functional core of the application. It encapsulates the appropriate data, provides for the necessary export and import functions to perform program specific processing. The model also notifies all the views when the data changes. The change propagation mechanism maintains a registry of dependent components within the module. This acts as the only link between the model and the views and the controllers. The View component presents information to the user. Different views present information of the models in different ways. Each view has an update procedure that is called and is activated by the change propagation mechanism. During initialization all views are associated with the model and have a suitable controller.  Views also offer functionality that the controller can use to modify the display. The Controller component accept user inputs as events. How these are delivered to the controller depends on the user interface platforms. If the behavior of a controller depends on the state of the model then the controller registers itself with the change propagation mechanism and implements an update procedure.  The CRC representation of the View and the Container components are given below.

 

 

Figure 5.2 CRC of the View and the Controller Class

 

Heuristics for Implementation:

·        Separate human computer interaction from the core functionality. Model the model component to encapsulate both the data and the functionality needs of the core. Add an interface to the parts that are to be exposed to the controller.

·        Implementation of the change propagation mechanism: Following the publisher subscriber pattern [GHJV 95] for this is recommended and assignment of the roles of the publisher model. Providing services for the views and controllers to subscribe and unsubscribe to the change propagation mechanism.  Call notify functions for reporting change in the state of the model.

·        Design and implementation of views: Usually a draw procedure is specified for the rendering the views differently on different platforms and based on user specification.  Implement update procedures to reflect changes to the model.

·        Design and implementation of controllers: for every view there needs to be specifications of how the user actions are going to be handled by the system.  The controller interprets these events using a dedicated procedure. Depends on the state of the model.

·        Design and implementation of the view and controller relationships: A view typically creates its associated controller during its initialization.  It is better to build a hierarchy of views and controllers. It is better to use the factory method pattern. [GHJV 95]

·        Implement the set up of MVC: the set up model first initializes the model and then creates and initializes the views.

 

Advantages and Liabilities:

MVC strictly separates the model from the user interface components. Hence multiple views may be implemented in the single model. Also views may be opened and closed dynamically. The change propagation mechanism of the model ensures that all attached observers are notified when the model changes at the same time. This leads to synchrony in the system. The user interfaces objects may be changed at runtime seamlessly as the view and the controller objects may be interchanged.  There are also portability advantages, as the interfaces are separated from the model the system ca potentially run on many of the platforms.

Liabilities: It is commonly seen that the MVC approach increases the complexity of the system and does not gain that much in functionality.  If a single user action leads to many updates then the model should skip the unnecessary updates. The controller and the view are closely related that prevents reuse of them individually.  The use of the high level toolkits or user interfaces builders usually makes the use of MVC almost impossible.

 

6.0 Patterns Future:

Some of the most important issues related to patterns are Where are patterns going? There are multitudes of issues that are important. In the ensuing paragraphs I have highlighted some of the areas that gain importance.

 

Ø      Pattern Management:

As new patterns are added into the literature, a main issue in the future will be that of mining new patterns. Patterns generally rest at the architectural level, developers still need to rack their brains on issues at the algorithmic level. Only a combination of algorithms and Design patterns will help in solving the problems of the developers. Design patterns would support the instantiation of algorithms. For this there is a requirement that existing algorithms be described in a patterns form. Future research would use the same scheme used in patterns for describing the algorithms. As new developments in software transpire some patterns become obsolete and need to be replaced by other patterns. Some of the future work will also be to maintain patterns history, revisions and variants. These involve configuration management issues for Pattern management.

 

Ø      Pattern Languages:

Much of the existing literature on patterns is organized as design pattern catalogs [BMRSS 95, GHJV 95]. These catalogs present a collection of relatively independent solutions to common design problems. As more experience is gained using these patterns, developers and authors will need to integrate groups of related patterns to form pattern languages. These pattern languages will encompass a family of related patterns that cover particular domains and disciplines. E.g. concurrency, distribution, organizational design, software reuse, real-time systems, business and electronic commerce, and human interface design etc.

Just as frameworks support larger-scale reuse of design and code than do stand-alone functions and class libraries, pattern languages will support larger-scale reuse of software architecture and design than individual patterns. Developing comprehensive pattern languages prove to be challenging and time consuming, also as patterns develop more efficient patterns would emerge and work better with existing patterns. Challenges would be to categorize and tabulate them.

 

Ø      Integration of design patterns and frameworks:

Some of the most useful patterns describe frameworks. Such patterns can be viewed as abstract descriptions of frameworks that facilitate widespread reuse of software architecture [SCH 95]. Similarly, frameworks can be viewed as concrete realizations of patterns that facilitate direct reuse of design and code. One difference between patterns and frameworks is that patterns are described in language-independent manner, whereas frameworks are generally implemented in a particular language. However, patterns and frameworks are highly cohesive in nature. The next generation of object-oriented frameworks will explicitly embody many patterns and patterns will be widely used to document the form and contents of frameworks

 

Ø      Formalizing Patterns:

In principle, one must demonstrate that patterns can indeed be formalized [MEG 99]. In [AHE 98] Eden provides an analysis of the specification of the solutions of design patterns in the GoF book [GHJV 95]. Eden divides the specifications into six categories according to their generality and precision, four of which are precise, one is semi precise, and one is very difficult to formalize. Additionally, evidence appears to indicate that, due to the effort by the GoF, the majority of the specifications in the book belong to the first 5 categories. Patterns help to alleviate software complexity at several phases in the software lifecycle. Although patterns are not a software development method or process, they complement existing methods and processes. Formalisms in pattern would lay down structure in pattern descriptions, as most of the description of patterns today is informal in nature.  Formalization of structure, dynamics and semantics of the patterns are possible. These would in turn support the development of pattern tools better than the informal patterns of today. However it also becomes harder to match formalized pattern to a design as the designs are not formalized. A formalized solution may also narrow down the applicability of the pattern. In future these aspects need to be analyzed in detail and the trade off considered.

 

Ø      Automatic Code Generation:

Patterns could also be used for automatic code generation. Idioms captures implementation level patterns and thus could aid in auto code generations. For e.g. if C1 and C2 were to be two classes and we are interested in making C1 the observer of C2, then we could use the Observer Pattern and the “tool” would generate code for making C1 an observer of C2. Also we could do the reverse given a source code and the OO language used and a precise specification of a pattern, discern whether the code is an instance of the pattern (Validation). We could also find out if a subset of the code is an implementation of some pattern and could extend this to the entire application and if possible arrive at the architectural pattern of the system (Recognition). We could also check if some elements in a language form valid patterns (Discovery). In future patterns will focus on using Patterns to help code generation.

 

Ø      Domain Specific Design Pattern:

Are collections of components and objects that represent, in software, a well-defined (encapsulated, clear boundary, highly cohesive) partitions of a particular system domain.  The main goal of the approach is to clearly describe a flexible architecture in terms of well defined, highly encapsulated, manageable parts that are in alignment with the natural constraints of the domain. The main advantages of the approach are the development of well-defined components that may be easily reusable. One of the advantages of Domain Specific patterns could be the generation of code automatically from them. As the formalism in patterns increase generators could be used to generate automatic code[FJM]. Performance analysis techniques may also be applied on the patterns to arrive at the optimal solution.

 

 

 

 

 

 

6.0 Conclusions:

 

The paper provides a basic overview of patterns their domain of applicability and their characteristics.  Similarities between patterns with frameworks and styles are also briefly analyzed. Architectural patterns are analyzed in detail. The domain of applicability, their characteristics, heuristics for their implementation and some trade off involved in using the pattern are also delved on. The structure of each of the components in the classes is described using CRC cards. The patterns described include the Layers, Pipe and Filter, Broker and the Model View Controller Patterns. Finally some of areas for future research is discusses. These include pattern mining, appropriate pattern documentation, Pattern Languages, Automatic Code generation from patterns and finally domain specific patterns for an industry e.g. Telecommunications or for a business.

 

 

References:

 


[ALE 79]

C.Alexander, The Timeless way of Building, Oxford University Press,1979.

[AHE 98]

A. H. Eden (1998d). "Giving 'The Quality' a Name". Journal of Object Oriented Programming, guest column, Vol. 11 No. 3, pp. 5-11, June 1998. New York: SIGS Publications.

[BAM 91]

D. Batory and S. O’Malley. “The Design and Implementation of Hierarchical Software Systems Using  Reusable Components”. TR 91-22, Dept. of Computer Science, University of Texas, Austin, June 1991.

[BMRSS 95]

Patterns Oriented Software Architecture, Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerland, Micheal Stal, Siemens Germany, Addison Wesley. 1995.

[BRO 94]

K Brockschmidt: Inside OLE2, Micro Soft Press 1994.

[CAM 94]

F.R Campagnoni: IBM’s system Object Model, Dr Doobs Journal, Special Report, #225 Winter 1994/95, pp 24-28.

[DAV 95]

David Garlan, What is Style? Proceedings of Dagshtul workshop on Software Architecture, Feb 1995.

[DRA 97]

David Garlan, Robert T Monroe, andrew Kompanek, Ralph Menton, et al, “Architectural styles Design Patterns and Objects” IEE Software 1997.

[FJM]

Pattern-Based Code Generation for Well-Defined Application Domains, Frank Heister, Jan Peter Riegel, Martin Schuetze, Stefan Schulz, Gerhard.

[FRI 85]

Marek Fridrich and William Older. “Helix: The Architecture of the XMS Distributed File System”. IEEE Software, vol 2, no 3, May 1985 (pp. 21-29).

[GHJV 95]

E. Gamma, R. Helm, R Johnson, J Vissides: Design PatternsElements of Reusable Object Oriented Software, Addison Wesley, 1995.

[GHJV 93]

E. Gamma, R. Helm, R Johnson, J Vissides, Design Patterns: Abstractions and Reuse of Object Oriented Design, Proceedings of 7th European Conference, Germany.

[KPP]

G E Krasner, S.T. Pope: A cookbook for using the Model View Controller user interface paradigm in Small Talk, Journal of Object Oriented Programming, August 1988, SIGS Publications.

[KRU 96]

D Kruglinsky, Inside Visual C++, Microsoft Press.

[LAS 79]

Hugh C. Lauer and Ed. H. Satterthwaite. “Impact of MESA on System Design. Proc Third Int’l Conf. on Software Engineering”, May 1979.

[LP 91]

WR LaLonde, JR Pugh: Inside SmallTalk, Volume II, Prentice Hall, 1991.

[MEG 99]

M. Ersson, A Gustavsson (1999). "Formalizing the Intent of Design Patterns." Technical report 1999-004, Institute of Information Technology, Uppsala University.

[OMG 92]

Object Management Group, The Common Object Broker Request: Architecture and Specification,  OMG Document Number 91.12.1 Revision 1.1.1992.

[Paulk 85]

Mark C. Paulk. The ARC Network: A Case Study. IEEE Software, Vol 2 no 3, May 1985, pp. 62-69

[PEW 92]

Pery and Wolf, “Foundations for the study of Software Architecture”, ACM Sig Soft Volume 17, Oct 1992.

[SCH 95]

Schmidt, Douglas, Using Design Patterns to Develop Reusable Object-Oriented Communication Software, CACM, (Special Issue on Object-Oriented Experiences, Mohamed Fayad and W.T. Tsai Eds.), 38, 10, October 1995.

[Shaw 95]

Mary Shaw. “Patterns for Software Architectures”. In Coplien & Schmidt (eds),Pattern Languages of Program Design, Addison-Wesley 1995, pp. 453-462.

[Shaw 96]

Mary Shaw, “Some Patterns for Software Architectures” 1996.

[SET 95]

J.Sethna: LASSP Tools: Graphical and Numerical Extensions to Unix, http://www.lassp.cornell.edu.