Software Reuse • Main text: • Ian Sommerville, Software Engineering, 8th edition, chapter 18 Additional readings: • Prieto Diaz, "Status Report: Software Reusability," IEEE Software, 10(3):61-66, May, 1993. • Bruce H. Barnes, Terry B. Bollinger, "Making Reuse Cost-Effective", IEEE Software, vol. 8, no. 1, pp. 13-24, January/February, 1991
Software reuse • In most engineering disciplines, systems are designed by composing existing components that have been used in other systems. • Software engineering has been more focused on original development but it is now recognised that to achieve better software, more quickly and at lower cost, we need to adopt a design process that is based on systematic software reuse. • Systematic software reuse vs ad-hoc reuse: • Human nature is inherently lazy => developers are happy to find ready-made solutions • Problem: ad-hoc (or copy-paste) reuse may be harmful !
Reuse Taxonomy – what, how, where to reuse ? From [Prieto-Diaz91]
Reuse – by substance • Classification of reuse according to the essence of items to be reused: • Ideas, concepts: • Reuse of abstract concepts – sharing “wisedom” • General solutions to a class of problems: algorithms • Artifacts, components • Reuse of software parts • Processes, procedures, skills • Reusable processes – needs more formalization of software development procedures • Procedure reuse – means also the informal reuse of skills
Reuse – by scope • Classification of reuse according to the form and extent of reuse: • Vertical: reuse within the same domain or application area • Goal: to build generic models for families of systems that can be used as templates for building new system in that domain • Needs: effort in domain analysis and domain modelling • Horizontal: reuse of generic parts in different applications • Example: scientific subrutines • Needs: packaging and presentation of parts; cataloging and classification standards for parts;
Reuse – by technique • Classification of reuse according to the the approach used to implement reuse: • Compositional • Uses existing components as building blocks for new systems • Generative • Reuse at the specification level by means of application or code generators
Reuse – by product • Classification of reuse according to the work products that are reused: • Source code • Design • Specifications • Objects • Text • Architectures
What to reuse • Today’s agenda: (mainly based on chap. 18 from [Sommerville]) • Software building blocks • Concept reuse
Reusing software building blocks • What size are the reused blocks? • Application system reuse • The whole of an application system may be reused: • by incorporating it without change into other systems. (COTS reuse - Detailed in [Sommerville 18.5.1] • by reusing a common architecture used for developing applications from the same family, tailored for specific customers. (Software product lines - Detailed in [Sommerville 18.5.2] • Component reuse • Components of an application from sub-systems to single objects may be reused. Detailed in [Sommerville Chapter 19] • Object and function reuse • Software components that implement a single well-defined object or function may be reused. • Who reuses ? • Third party reuse: COTS • Intra-organizational: Software product lines
Concept reuse • Concepts are abstract, the reuse process includes an instantiation activity • Design patterns. Detailed in [Sommerville 18.2] • Program generators. Detailed in [Sommerville 18.3]
Reuse benefits Fig 18.1. [Sommerville]
Reuse benefits (cont.) Fig.18.1 [Sommerville]
Reuse problems Fig. 18.2 from [Sommerville]
Reuse problems (cont.) Fig. 18.2 [Sommerville]
The reuse landscape • Although reuse is often simply thought of as the reuse of system components, there are many different approaches to reuse that may be used. • Reuse is possible at a range of levels from simple functions to complete application systems. • The reuse landscape covers the range of possible reuse techniques.
Design patterns Component Application Aspect-oriented frameworks product lines software development Component-based C O TS Prog ram development integ ration generators Legacy system wrapping Configurable ver tical applications Service-oriented systems Prog ram libraries The reuse landscape Fig. 18.3 from [Sommerville]
Reuse approaches Fig. 18.4 from [Sommerville]
Reuse planning factors • Key question: given this array of techniques for reuse, which one (if any) to choose ? • The key factors to be considered when planning reuse: • The development schedule for the software. • The expected software lifetime. • The background, skills and experience of the development team. • The criticality of the software and its non-functional requirements. • The application domain. • The execution platform for the software. • Conclusion: whether reuse is achieved or not is often a managerial rather than technical issue
Reuse Investment Cost Estimated cost w/o reuse Estimated cost w/o reuse . . . Cost w/ reuse Cost w/ reuse Reuse investments $ Savings $ Savings Net profit Net loss Reuse producer activities Reuse consumer activities From [Barnes&Bollinger91]
Reusing parts - Size of reuse units • Possible reuse units: • Objects: often too fine-grained and too specialised for a particular application • Application frameworks: larger-grain abstractions • Application frameworks: • Frameworks are a sub-system design made up of a collection of abstract and concrete classes and the interfaces between them. • The sub-system is implemented by adding components to fill in parts of the design and by instantiating the abstract classes in the framework. • Frameworks are moderately large entities that can be reused.
Framework classes • System infrastructure frameworks • Support the development of system infrastructures such as communications, user interfaces and compilers. • Middleware integration frameworks • Standards and classes that support component communication and information exchange. • Enterprise application frameworks • Support the development of specific types of application such as telecommunications or financial systems.
Extending frameworks • Frameworks are generic and are extended to create a more specific application or sub-system. • Extending the framework involves • Adding concrete classes that inherit operations from abstract classes in the framework; • Adding methods that are called in response to events that are recognised by the framework. • Problem with frameworks is their complexity which means that it takes a long time to use them effectively.
Example: Model-view controller • System infrastructure framework for GUI design. • Allows for multiple presentations of an object and separate interactions with these presentations. • MVC framework involves the instantiation of a number of patterns (as discussed earlier under concept reuse).
Example: Model-view-controller Fig. 18.10 from [Sommerville]
Application system reuse • Involves the reuse of entire application systems either by configuring a system for an environment or by integrating two or more systems to create a new application. • Reuses large-grain assets • Two approaches covered here: • COTS product integration; • Product line development.
COTS product reuse • COTS - Commercial Off-The-Shelf systems – a software system that can be used without change by its buyer • Examples of COTS: database management systems, web browser, e-mailer • COTS systems are usually complete application systems that offer an API (Application Programming Interface). • Building large systems by integrating COTS systems is now a viable development strategy for some types of system such as E-commerce systems. • The key benefit is faster application development and, usually, lower development costs.
COTS design choices • Which COTS products offer the most appropriate functionality? • There may be several similar products that may be used. • How will data be exchanged? • Individual products use their own data structures and formats. • Writing adapters that convert from one representation to another • What features of the product will actually be used? • Most products have more functionality than is needed. You should try to deny access to unused functionality.
Client W eb browser E-mail system Server E-commerce Ordering and Adaptor system invoicing system Adaptor E-mail system COTS Example: E-procurement system Convert formats of orders Convert notifications into emails Fig. 18.11 from [Sommerville]
COTS products reused • On the client, standard e-mail and web browsing programs are used. • On the server, an e-commerce platform has to be integrated with an existing ordering system. • This involves writing an adaptor so that they can exchange data. • An e-mail system is also integrated to generate e-mail for clients. This also requires an adaptor to receive data from the ordering and invoicing system.
COTS system integration problems • Lack of control over functionality and performance • COTS systems may be less effective than they appear • Problems with COTS system inter-operability • Different COTS systems may make different assumptions that means integration is difficult • No control over system evolution • COTS vendors not system users control evolution • Support from COTS vendors • COTS vendors may not offer support over the lifetime of the product
Software product lines • Software product lines or application families are applications with generic functionality that can be adapted and configured for use in a specific context. • All members of the family share a common core: • The application-specific architecture • A set of core components • Adaptation (creation of individual family members) may involve: • Component and system configuration; • Adding new components to the system; • Selecting from a library of existing components; • Modifying components to meet new requirements.
Specialisation in a product line • Platform specialisation • Different versions of the application are developed for different platforms. • Environment specialisation • Different versions of the application are created to handle different operating environments e.g. different types of communication equipment. • Functional specialisation • Different versions of the application are created for customers with different requirements. • Process specialisation • Different versions of the application are created to support different business processes.
Product line configuration • Software product lines are designed to be reconfigured. • Reconfiguration: • Adding or removing components • Defining parameters and constraints for components • Including knowledge of business processes • Software product lines can be configured at 2 points in the development process: • Deployment time configuration • A generic system is configured by embedding knowledge of the customer’s requirements and business processes. The software itself is not changed. • Design time configuration • A common generic code is adapted and changed according to the requirements of particular customers.
Example of deployment-time configuration: Configuration of an ERP system Fig. 18.12 from [Sommerville]
Example: ERP systems • An Enterprise Resource Planning (ERP) system is a generic system that supports common business processes such as ordering and invoicing, manufacturing, etc. • These are very widely used in large companies - they represent probably the most common form of software reuse. • The generic core is adapted by including modules and by incorporating knowledge of business processes and rules.
Design time configuration • Software product lines that are configured at design time are instantiations of generic application architectures (see Chapter 13). • Involves changing and extending the source code of the core system • Offers greater flexibility than deployment-time configuration • Generic products usually emerge after experience with specific products.
Product line architectures • The decision to design a generic product line becomes explicit at a point, otherwise changes may corrupt the application structure • Architectures must be structured in such a way to separate different sub-systems and to allow them to be modified. • The architecture should also separate entities and their descriptions and the higher levels in the system access entities through descriptions rather than directly.
Product line: Vehicle despatching • A specialised resource management system where the aim is to allocate resources (vehicles) to handle incidents. • Versions for: police, fire service, ambulance service • Adaptations include: • At the UI level, there are components for operator display and communications; • At the I/O management level, there are components that handle authentication, reporting and route planning; • At the resource management level, there are components for vehicle location and despatch, managing vehicle status and incident logging; • The database includes equipment, vehicle and map databases.
A despatching system Fig. 18.14 from [Sommerville]
Product instance development Fig. 18.15 from [Sommerville]
Product instance development • Elicit stakeholder requirements • Use existing family member as a prototype • Choose closest-fit family member • Find the family member that best meets the requirements • Re-negotiate requirements • Adapt requirements as necessary to capabilities of the software • Adapt existing system • Develop new modules and make changes for family member • Deliver new family member • Document key features for further member development
Concept reuse • When you reuse program or design components, you have to follow the detailed design decisions made by the original developer of the component. • This may limit the opportunities for reuse. • One way around is to reuse abstract designs (concepts) that do not include implementation details • You must implement the abstract design for your application • Examples of reusable concepts: algorithms, abstract data types, design patterns • Main approaches to concept reuse are: • Design patterns • Generative programming
Design patterns • A design pattern is a way of reusing abstract knowledge about a problem and its solution. • A pattern is a description of the problem and the essence of its solution. • It should be sufficiently abstract to be reused in different settings. • Patterns often rely on object characteristics such as inheritance and polymorphism.
Pattern elements • Identification of a pattern [GoF]: • Name - A meaningful pattern identifier. • Problem description – when the pattern can be applied • Solution description - Not a concrete design but a template for a design solution that can be instantiated in different ways. • Consequences - The results and trade-offs of applying the pattern.
Example: The Observer pattern • Name • Observer. • Description • Separates the display of object state from the object itself. • Problem description • Used when multiple displays of state are needed. • Solution description • See slide with UML description. • Consequences • Optimisations to enhance display performance are impractical.
Example: Multiple displays Fig. 18.6 from [Sommerville]
Example: The Observer pattern Fig. 18.7 from [Sommerville]
Reuse through patterns - conclusion • The use of patterns is an effective form of reuse • Disadvantage: only experienced software engineers who have a deep knowledge of patterns can use them effectively • Experience needed to recognise generic situations where a pattern can be applied
Generator-based reuse • Concept reuse through patterns: • relies on describing the concept in an abstract way and leaving it up to the software developer to create an implementation • Generator-based reuse: • Program generators involve the reuse of standard patterns and algorithms. • These are embedded in the generator and parameterised by user commands. A program is then automatically generated. • Generator-based reuse is possible when domain abstractions and their mapping to executable code can be identified. • A domain specific language is used to compose and control these abstractions.