Component-based software engineering
From Wikipedia, the free encyclopedia
| Programming paradigms |
|---|
|
Component-based software engineering (CBSE) (also known as component-based development (CBD)) is a branch of software engineering, the priority of which is the separation of concerns in respect of the wide-ranging functionality available throughout a given software system. This practice brings about an equally wide-ranging degree of benefits in both the short-term and the long-term for the software itself and the organisation that sponsors it.
Components are considered to be part of the starting platform for service orientation throughout software engineering, for example Web Services, and more recently, Service-Oriented Architecture (SOA) - whereby a component is converted into a service and subsequently inherits further characteristics beyond that of an ordinary component.
Contents |
[edit] Component Definition
An individual component is a software package, or a module, that encapsulates a set of related functions (or data).
All system processes are placed into separate components so that all of the data and functions inside each component are semantically related (just as with the contents of classes). Because of this principle, it is often said that components are modular and cohesive.
With regards to system-wide co-ordination, components communicate with each other via interfaces. When a component offers services to the rest of the system, it adopts a provided interface which specifies the services that can be utilised by other components and how. This interface can be seen as a signature of the component - the client does not need to know about the inner workings of the component (implementation) in order to make use of it. This principle results in components referred to as encapsulated. In the UML illustrations in this article, provided interfaces are represented by a lollipop attached to the outer edge of the component.
However when a component needs to use another component in order to function, it adopts a required interface which specifies the services that it needs. In the UML illustrations in this article, required interfaces are represented by an open socket symbol attached to the outer edge of the component.
Another important attribute of components is that they are substitutable, so that a component could be replaced by another (at design time or run-time), if the requirements of the initial component (expressed via the interfaces) are met by the successor component. Consequently, components can be replaced with either an updated version or an alternative for example, without breaking the system in which the component operates.
As a general rule of thumb for engineers substituting components, component B can immediately replace component A, if component B provides at least what component A provided, and requires no more than what component A required.
Software components often take the form of objects or collections of objects (from object-oriented programming), in some binary or textual form, adhering to some interface description language (IDL) so that the component may exist autonomously from other components in a computer.
When a component is to be accessed or shared across execution contexts or network links, techniques such as serialization or marshalling are often employed to deliver the component to its destination.
Reusability is an important characteristic of a high quality software component. A software component should be designed and implemented so that it can be reused in many different programs.
It takes significant effort and awareness to write a software component that is effectively reusable. The component needs to be:
- fully documented
- more thoroughly tested -
- robust - with comprehensive input validity checking
- able to pass back appropriate error messages or return codes
- designed with an awareness that it will be put to unforeseen uses
In the 1960s, scientific subroutine libraries were built that were reusable in a broad array of engineering and scientific applications. Though these subroutine libraries reused well-defined algorithms in an effective manner, they had a limited domain of application. Commercial sites routinely created application programs from reuseable modules written in Assembler,COBOL,PL/1 and other 2nd and third generation languages using both System and user application libraries.
Today, modern reusable components encapsulate both data structures and the algorithms that are applied to the data structures. It builds on prior theories of software objects, software architectures, software frameworks and software design patterns, and the extensive theory of object-oriented programming and the object oriented design of all these. It claims that software components, like the idea of hardware components, used for example in telecommunications, can ultimately be made interchangeable and reliable.
[edit] History
The idea that software should be componentized, built from prefabricated components, was first published in Douglas McIlroy's address at the NATO conference on software engineering in Garmisch, Germany, 1968 titled Mass Produced Software Components. This conference set out to counter the so-called software crisis. His subsequent inclusion of pipes and filters into the Unix operating system was the first implementation of an infrastructure for this idea.
The modern concept of a software component was largely defined by Brad Cox of Stepstone, who called them Software ICs and set out to create an infrastructure and market for these components by inventing the Objective-C programming language. (He summarizes this view in his book Object-Oriented Programming - An Evolutionary Approach 1986.)
IBM led the path with their System Object Model (SOM) in the early 1990s. Some claim that Microsoft paved the way for actual deployment of component software with OLE and COM. Today, many successful software component models exist.
[edit] Differences from object-oriented programming
The idea in object-oriented programming (OOP) is that software should be written according to a mental model of the actual or imagined objects it represents. OOP and the related disciplines of object-oriented design and object-oriented analysis focus on modeling real-world[citation needed] interactions and attempting to create 'verbs' and 'nouns' which can be used in intuitive[citation needed] ways, ideally by end users as well as by programmers coding for those end users.
Component-based software engineering, by contrast, makes no such assumptions, and instead states that software should be developed by gluing prefabricated components together much like in the field of electronics or mechanics. Some peers[who?] will even talk of modularizing systems as software components as a new programming paradigm.
Some argue that this distinction was made by earlier computer scientists, with Donald Knuth's theory of "literate programming" optimistically assuming there was convergence between intuitive and formal models, and Edsger Dijkstra's theory in the article The Cruelty of Really Teaching Computer Science, which stated that programming was simply, and only, a branch of mathematics.
In both forms, this notion has led to many academic debates about the pros and cons of the two approaches and possible strategies for uniting the two. Some consider them not really competitors, but only descriptions of the same problem from two different points of view.
[edit] Architecture
A computer running several software components is often called an application server. Using this combination of application servers and software components is usually called distributed computing. The usual real-world application of this is in financial applications or business software.
[edit] Technologies
- Pipes and Filters
- Component-oriented programming
- SOFA component system [1] from ObjectWeb
- Fractal component model [2] from ObjectWeb
- rCOS method of component-based model driven design [3] from UNU-IIST
- Visual Basic Extensions, OCX/ActiveX/COM and DCOM from Microsoft
- XPCOM from Mozilla Foundation
- VCL and CLX from Borland and similar free LCL library.
- Enterprise JavaBeans from Sun Microsystems
- UNO from the OpenOffice.org office suite
- Eiffel programming language
- Oberon programming language and BlackBox
- Bundles as defined by the OSGi Service Platform
- The
System.ComponentModelnamespace in Microsoft .NET - Flow-based programming
- MidCOM[4] component framework for Midgard and PHP
- Common Component Architecture (CCA) - Common Component Architecture Forum [5], Scientific/HPC Component Software
- Component-based software frameworks for specific domains
- Earth System Modeling Framework (ESMF)
- Compound document technologies
- Bonobo (component model), a part of GNOME
- KPart, the KDE Compound document technology
- Object linking and embedding (OLE)
- OpenDoc
- Fresco
- Business object technologies
- Distributed computing software components
- 9P distributed protocol developed for Plan 9, and used by Inferno and other systems.
- CORBA and the CORBA Component Model from the Object Management Group
- D-BUS from the freedesktop.org organization
- DCOM and later versions of COM (and COM+) from Microsoft
- DCOP from KDE
- DSOM and SOM from IBM (now scrapped)
- ICE from ZeroC
- Java EE from Sun
- .NET Remoting from Microsoft
- Web Services
- Universal Network Objects (UNO) from OpenOffice.org
- Zope from Zope Corporation
- Interface description languages
- XML-RPC, the predecessor of SOAP
- SOAP IDL from W3C
- WDDX
- Part of both COM and CORBA
- Open Service Interface Definitions
- Platform-Independent Component Modeling Language
- SIDL [8] - Scientific Interface Definition Language
- Generic programming emphasizes separation of algorithms from data representation
- Inversion of Control (IoC) and Plain Old C++/Java Object (POCO/POJO) component frameworks
[edit] See also
- Business logic
- Modular programming - (the more usual terminology for Component-based software engineering)
- Third party software component
- Web Service
[edit] References
| This article needs additional citations for verification. Please help improve this article by adding reliable references. Unsourced material may be challenged and removed. (December 2008) |
[edit] Further reading
- Brad J. Cox, Andrew J. Novobilski (1991). Object-Oriented Programming: An Evolutionary Approach. 2nd ed. Addison-Wesley, Reading ISBN 0-201-54834-8
- Bertrand Meyer (1997). Object-Oriented Software Construction. 2nd ed. Prentice Hall.
- Clemens Szyperski (2002). Component Software: Beyond Object-Oriented Programming. 2nd ed. Addison-Wesley Professional, Boston ISBN 0-201-74572-0
- George T. Heineman, William T. Councill (2001). Component-Based Software Engineering: Putting the Pieces Together. Addison-Wesley Professional, Reading 2001 ISBN 0-201-70485-4
- Richard Veryard (2001). Component-based business : plug and play. London : Springer. ISBN 1852333618
[edit] External links
| This article's external links may not follow Wikipedia's content policies or guidelines. Please improve this article by removing excessive or inappropriate external links. |
- Mass Produced Software Components by M. Douglas McIlroy
- NATO Science Committee Software Engineering Conference in Garmisch - reports (PDF)
- Planning the Software Industrial Revolution The history of manufacturing vs software compared.
- The independence of notion of component-orientation.
- Cox's feasibility demonstration of a usage-based mechanism for incentivizing component producers.
- comprehensive list of Component Systems
- Article "Why Software Reuse has Failed and How to Make It Work for You" by Douglas C. Schmidt
- New proposals to explore the Component properties: (i) Reuse and (ii) Replaceable
- http://www.smb.uklinux.net/reusability/
- Dynamically Self Configuring Automotive System
- New proposal for exploring a kind of CBSE comparable to the CBE

