In the world of structured programming, to create a form with a list box, for example, you would need to write
voluminous code: the code to create the form itself, the code to create and populate the list box, and the code
to create an OK button that will accept the value in the list box. With object−oriented programming, on the
other hand, you simply need to use three (typically prebuilt) objects: a form, a list box, and an OK button. The
exercise of coding used to be along the lines of "create from scratch, but copy whatever you can find from old
programs to save some time." The newer paradigm is "put together a bunch of objects, and then just focus on
what's unique to this particular application."
One of the primary advantages of the object−oriented paradigm is the ability to build components once and
then use them over and over again. Just as you can reuse a toy building block in a castle or a house, you can
reuse a basic piece of object−oriented design and code in an accounting system, an inventory system, or an
order−processing system.
So, how is this object−oriented paradigm different from the traditional approach to development?
Traditionally, the approach to development has been to concern ourselves with the information that the system
will maintain. With this approach, we ask the users what information they will need, design databases to hold
the information, provide screens to input the information, and print reports to display the information. In other
words, we focus on the information and pay less attention to what is done with the information or the behavior
of the system. This approach is called data−centric and has been used to create thousands of systems over the
years.
Data−centric modeling is great for database design and capturing information, but taking this approach when
designing business applications presents some problems. One major challenge is that the requirements for the
system will change over time. A system that is data−centric can handle a change to the database very easily,
but a change to the business rules or to the behavior of the system is not so easy to implement.
The object−oriented paradigm has been developed in response to this problem. With the object−oriented
approach, we focus on both information and behavior. Accordingly, we now can develop systems that are
resilient and flexible to changes in information and/or behavior.
The benefit of flexibility can be realized only by designing an object−oriented system well. This requires
knowledge of some principles of object orientation: encapsulation, inheritance, and polymorphism.
Encapsulation
In object−oriented systems, we combine a piece of information with the specific behavior that acts upon that
information. Then we package these into an object. This is referred to as encapsulation. Another way to look
at encapsulation is that we divide the application into small parts of related functionality. For example, we
have information relating to a bank account, such as the account number, balance, customer name, address,
account type, interest rate, and opening date. We also have behavior for a bank account: open, close, deposit,
withdraw, change type, change customer, and change address. We encapsulate this information and behavior
together into an account object. As a result, any changes to the banking system regarding accounts can simply
be implemented in the account object. It works like a one−stop shop for all account information and behavior.
Another benefit of encapsulation is that it limits the effects of changes to the system. Think of a system as a
body of water and the requirement change as a big rock. You drop the rock into the water
and—SPLASH!—big waves are created in all directions. They travel throughout the lake, bounce off the
shore, reverberate, and collide with other waves. In fact, some of the water may even splash over the shore
and out of the lake. In other words, the rock hitting the water caused a huge ripple effect. But if we
encapsulate our lake by dividing it into smaller bodies of water with barriers between them, then the
requirement change hits the system—SPLASH! As before, waves are created in all directions. But the waves
Chapter 1: Introduction to UML
5