Loosely
Coupled Verses Tightly Coupled
(Component level abstraction Verses Object level abstraction)
|
|
Most
components are built by assembling subcomponents. Again
these components are assembled to build larger and larger
components and finally the product. For example, many
parts are assembled to build the components for the
car, such as engine and transmission etc. Then these
parts are assembled to build the automobile. Likewise,
many chips and electronic components are assembled to
build computer-parts such as, graphics-card and hard-drive. |
|
It is desirable to build most components
by loosely coupling its subcomponents. Some cases,
it is possible to use loosely coupled subcomponents
to build the larger component. But, in other cases,
the subcomponents must be tightly coupled to build
the larger component.
|
|
For
a great product design, it is very useful to build and
use mostly loosely coupled components or parts. This
allows specialists (who have core competence in the
part making technologies) to independently build the
components, such that, they offer plug-in interface
to quickly assembled into the product. This substantially
cut the complexity and costs. For example, this allows
the product to be quickly adaptable to changing user
needs or incorporate latest technological advancements,
by updating each component independently. |
|
To
identify loosely coupled components, it may be helpful
to understand the differences between the characteristics
of the loosely coupled and tightly coupled parts. Tightly
coupled parts are very hard to separate and often use
irreversible manufacturing process. For example, the
IC chips are manufactured by fusing metal-oxide and
silicon. It is a complex chemical process and not meant
to be reversible. Likewise, the alloys made by mixing
metals, or steel-radial tires are built by infusing
steel wires and rubber. Usually tight coupling processes
are complex and require very high degree of skill and
knowledge. |
|
Loosely
coupled components are easy to assemble and easy to
remove or replace. For example, battery in the car is
a loosely coupled component. Also, automobile tire is
a loosely coupled component, which can be replaced when
it is used out, by a new tire. However, the battery’s
manufacturing process tightly couples its subcomponents
(e.g. lead plates, casing and Acid etc.). Computer chips
(e.g. CPU, DRAM) are usually loosely coupled to the
board (e.g. mother-board or graphics-cards) and they
can be quickly replaced. |
|
However,
many components for the computers (e.g. CMOS process
to make the IC chips) and for the cars (e.g. mixing
metals to make alloys for the parts or casting-molds
to shape the metal parts) are manufactured by tightly
coupling their ingredients (or parts). Many cases, this
tight coupling cannot be avoided. But, may be possible
to put the component (that is created using tightly
coupling its subcomponents) in to a casing, so that,
the component can support loosely coupled interface
to use as a subcomponent to make a larger component. |
|
According
to these examples, none of the existing software classes
(e.g. Java/Swing or Windows GUI-API & DB or EJB-Objects)
could be loosely coupled components. For example, the
GUI-objects (or presentation logic) and data-objects
(application logic) are tightly
fused to build the parts of the application.
Detailed explanation is provided later pages, to show, why
the OOP cannot be used to build loosely coupled systems. |
|
To
build software applications using loosely coupled components,
we invented a new process and plug-in components: CF/AC,
where CF encapsulates the manufacturing process that
tightly couples the OOP Objects, and support loosely
coupled interface for the resultant AC to easily
plug-in (or plug-our to independently update or even
to replace it). |
|
Where does our
technologies fit in the overall software landscape? |
|
The
Objectives of the technologies are to help developers
to build superior next generation online-GUI applications
than ever possible at far less cost. Before the advent
of the Internet, developers used VC++ or VisualBasic
to build the information technology applications (e.g.
information systems, data where housing, data analysis,
visual simulation data entry and processing etc.). |
|
These
applications usually require us to write several hundred
thousand lines of code or even millions of lines of
code. They used Windows GUI-API (or UNIX/X11/Motif)
to build the front end user interface. |
|
Many
of these applications are built using Object Oriented
Paradigm. If you map the relationships or interactions
between the Objects, it might look like the figures
#3, #5
and #7
(please note: The CBSDF preserves the AC seperation
as in fig#6).
Where, fig#3 shows, how one can use OOP to build a part
or component (i.e. an AC) of the application by tightly
coupling the Objects. Then fig#5 shows, how two components
(or ACs) are tightly coupled to add the second component
to the application. Then fig#7 shows three components
… I hope you get the picture. |
|
Please
recall how you write the OOP. Also recall that the concept
of AC doesn’t exist in the OOP; but applications
must have them in some form. How one incorporates a
new AC that needs many Objects to build, as shown in
Fig#3? |
|
One
may create all the needed Classes or one Class at a
time. Then usually instantiate or add each Object to
the application and write integration code to set data
or get data as shown in the Fig#3.
There is no ideal place or standard process to include
this code, so one may add each of the Object instantiation
and initialization code in one of the existing files
(i.e. files for the first AC). Usually all the GUI-components
are grouped (See Fig#5).
If two Objects exchange data, when the two ACs communicate,
those objects may be placed in the same file. Usually
upon the user action on one AC, its callback may call
other AC’s methods. The code for the callback
may be added in a different file. |
|
If
one builds the Cars in this way, to incorporate each
part such as the battery: he should add each ingredient
(e.g. lead plates and Acid etc.) at a time and manually
adjust to meet the needs. It is ugly and hard to even
imagine, but please imagine about it. Fortunately, the
battery maker encapsulates the tight coupling in a casing
that offers much simpler Component-level
abstraction. |
|
Large
application may contain thousands of such ACs or components
(or parts). In OOP process, we used to end up with millions
of lines of tangled code and numerous Object
level dependencies (Fig#7),
where the Objects are tightly coupled with each other.
The OOP can provide only Object
level abstraction. This code (in all the files)
is compiled to build the application’s executable. |
|
Therefore,
maintenance of large applications becomes problematic
because, it’s difficult or nearly impossible to
predict what sort of effect a simple change might have
on other parts of such tightly coupled system (especially
a year or two after its release; or to a new recruit,
even he is talented and has 10 years experience). If
small change is difficult, just imagine the complexity,
if one needs to replace a large AC (e.g. AC15
in Fig#2, if it includes many sub-ACs & Objects).
|
|
Furthermore,
developers are usually confronted with other challenges,
such as, poor design, documentation and time pressure
to adapt to the evolving needs. Large ACs almost never
removed, but tried to add additional code to update
many of its Objects to get the desired results, while
keeping old code and Object-dependencies, to reduce
the uncertainty. However, our loosely coupled AC can
be removed (or replaced, if a new AC/CF is ready) in
few minutes. |
|
It
is the main objective of the researchers for decades
to invent ideal plug-in components that can avoid this
tangled mess ( Fig#7)
and create a loosely coupled system, such as, the one
shown in the Fig#8
& Fig#10.
The Fig#7
shows traditional Object-level
abstraction and their complex interactions, while
Fig#8
shows Component-level abstraction
and their simpler plug-in interfaces. Both have three
ACs and can accomplish the same. Both may be compiled
to build the same application. But, the Fig#8
encapsulated each AC in a single cohesive code-block
(the AC is built using the same old Objects as shown
in the Fig#3)
and uses simple mechanism such as, service-oriented
interfaces to integrate the ACs. |
|
Success of the
Web in the mid 90s & Emerging Online Applications |
|
Today
businesses are building increasingly complex J2EE or
.NET online-applications that generally use the HTML,
DHTML & Jscript as front end. These applications
are no smaller or less complex than those VC++ applications
a decade ago (even though we ended up having inferior
text-based or primitive HTML GUI elements). The software
developers using the same tightly coupled Object integration
in the Servlets (or ASPX) files to build the online-applications. |
|
Users
are increasingly demanding better visualization or online
graphics. Today’s information driven economy,
the graphics intensive or “rich” online-applications
are essential to improve the productivity and to reduce
the mistakes of the knowledge workers. A picture is
worth thousand words, to cope up with the information
overload. Today, we do not have a viable online-GUI
to build rich online applications such as, visual-analysis,
visual-simulations, decision-support, location-based
or GIS, command & control systems. |
|
Despite
worldwide effort by leading organizations (e.g. Microsoft’s
XAML, Macromedia’s MXML/Flash and W3C’s
X3D, SVG) they cannot create a viable online-GUI technology
any time in the near future. They readily admit that
these technologies can never match even 50% of the functionality
of the traditional GUI-API (e.g. Java/Swing, UNIX/X11
or Windows-XP). |
|
Please
forgive me for the rude unsubstantiated assertion, but,
based on my years of research and competitive analysis
of their future plans and projected directions, with
out our technology, world may never see a viable online-GUI-API
(or at least in the next few years). Using our GUI-API
technology, today we can create far superior online-GUI
applications than ever thought possible on the traditional
GUI-platforms (e.g. Java/Swing) at fraction of the cost. |
|
If
you have seen the sample components in my Zipped folder,
you would notice complex component hierarchies. Those
components use Zero coupling between the components,
therefore can be created in matter of minutes (once
all the CF for the ACs are independently created). The
couplings would be created only when one component communicate
with other component. The components in the most of
the example do not exchange data with other components
therefore they have Zero coupling. |
|
Please
understand that, one of the main objectives of our component
technology (i.e. CBSDF) is to build such million lines
future graphics intensive applications, using loosely
coupled components to eliminate nearly 70% of the development
costs. Today US businesses alone spend nearly US$70
billion a year to build such information technologies
and enterprise applications. |
|
Causes for the
complexity explosion & Our Solutions |
|
1. |
Software
today is a technology in crisis, where its complexity
has far outrun our ability to comprehend it. It’s
next to impossible to understand what is going on in
software whenever a program runs longer than a few hundred
lines of code—and today’s software applications
contains millions of lines. What we don’t understand,
we can’t fix or maintain (e.g. to adapt to evolving
need): 25 percent of commercial software projects are
canceled, which meant $60 billion in losses in 2000
in the U.S. economy alone. |
|
|
|
Most
software modules may be built using good Objects that
usually have good abstraction and hides internal complexity.
However, the OOP-Object oriented paradigm forces us
to write tangled code that tightly integrates the Objects
( Fig#3).
The code structure of these modules, even containing
few Objects, would degrade and the modules loose their
abstraction and modularity. The modules further integrated
to build larger and larger modules by writing more tangled
code ( Fig#7).
Larger systems contain thousands of tightly coupled
modules. Therefore, maintenance becomes problematic
because, it’s difficult or impossible to predict
what sort of effect a simple change might have on other
parts of the system. |
|
|
|
The
CBSDF introduced a new kind of modules: “AC”,
that are custom build using “CF”, which
separates the manufacturing and AC’s service-interfaces.
This overcomes the problems, since each CF is an independent
module and each of the AC is “loosely coupled”
to the rest of the software system by service oriented
plug-in interface (a simple link); and further can offer
CASE tools to automatically validate these links. Therefore,
the custom application may be noting but a collection
of loosely coupled plug-in and easily replaceable parts
( Fig#8,
#9,
#10).
|
|
|
2. |
Unfortunately,
the OOP technologies suffer from several problems. During
evolution and customization for reuse, components are
affected by changes arising from new functional and
nonfunctional requirements, new variation points, new
software architectures and component deployment strategies,
new versions of a computing environment that effect
component communication, etc. Due to those changes,
class/object code structure erodes quickly (as we add
patches), resulting in complexity explosion, performance
degradation and redundant implementations of similar
features, thereby reducing the modules’ or components’
reusability and system maintainability. |
|
|
|
The
Generative process offers an innovative approach to
alleviating the above problems, as changes affecting
AC can now be more effectively managed during the generation
( Fig#2)
rather than at the component level. Using generative
programming, we can produce custom components (i.e.
AC) from small or fine-grained highly flexible and independent
elements (e.g. CF and GUI-API) that can be considerably
simpler than executable components themselves, keeping
the complexity of an evolving component system under
control. |