|

The
problems programmers are asked to solve have been
changing. Twenty years ago, programs were created
to manage large amounts of raw data. The people
writing the code and the people using the program
were all computer professionals. Today, computers
are in use by far more people, and most know very
little about how computers and programs work. Computers
are tools used by people who are more interested
in solving their business problems than struggling
with the computer.
Ironically,
in order to become easier to use for this new audience,
programs have become far more sophisticated. Gone
are the days when users typed in cryptic commands
at esoteric prompts, only to see a stream of raw
data. Today’s programs use sophisticated "user-friendly
interfaces," involving multiple windows, menus,
dialog boxes, and the myriad of metaphors with which
we’ve all become familiar. The programs written
to support this new approach are far more complex
than those written just ten years ago.
As
programming requirements have changed, both languages
and the techniques used for writing programs have
evolved. While the complete history is fascinating,
this book will focus on the transformation from
procedural programming to object-oriented programming.
Procedural,
Structured, and Object-Oriented Programming
Until
recently, programs were thought of as a series of
procedures that acted upon data. A procedure, or
function, is a set of specific instructions executed
one after the other. The data was quite separate
from the procedures, and the trick in programming
was to keep track of which functions called which
other functions, and what data was changed. To make
sense of this potentially confusing situation, structured
programming was created.
The
principle idea behind structured programming is
as simple as the idea of divide and conquer. A computer
program can be thought of as consisting of a set
of tasks. Any task that is too complex to be described
simply would be broken down into a set of smaller
component tasks, until the tasks were sufficiently
small and self-contained enough that they were easily
understood.
As
an example, computing the average salary of every
employee of a company is a rather complex task.
You can, however, break it down into these subtasks:
1.
Find out what each person earns.
2.
Count how many people you have.
3.
Total all the salaries.
4.
Divide the total by the number of people you
have.
Totaling
the salaries can be broken down into
1.
Get each employee’s record.
2.
Access the salary.
3.
Add the salary to the running total.
4.
Get the next employee’s record.
In
turn, obtaining each employee’s record can be broken
down into
1.
Open the file of employees.
2.
Go to the correct record.
3.
Read the data from disk.
Structured
programming remains an enormously successful approach
for dealing with complex problems. By the late 1980s,
however, some of the deficiencies of structured
programing had became all too clear.
First,
it is natural to think of your data (employee records,
for example) and what you can do with your data
(sort, edit, and so on) as related ideas.
Second,
programmers found themselves constantly reinventing
new solutions to old problems. This is often called
"reinventing the wheel," and is the opposite of
reusability. The idea behind reusability is to build
components that have known properties, and then
to be able to plug them into your program as you
need them. This is modeled after the hardware world—when
an engineer needs a new transistor, she doesn’t
usually invent one, she goes to the big bin of transistors
and finds one that works the way she needs it to,
or perhaps modifies it. There was no similar option
for a software engineer.
New
Term: The way we are now using computers—with
menus and buttons and windows—fosters a more interactive,
event-driven approach to computer programming. Event-driven
means that an event happens—the user presses a button
or chooses from a menu—and the program must respond.
Programs are becoming increasingly interactive,
and it has became important to design for that kind
of functionality.
Old-fashioned
programs forced the user to proceed step-by-step
through a series of screens. Modern event-driven
programs present all the choices at once and respond
to the user’s actions.
Object-oriented
programming attempts to respond to these needs,
providing techniques for managing enormous complexity,
achieving reuse of software components, and coupling
data with the tasks that manipulate that data.
The
essence of object-oriented programming is to treat
data and the procedures that act upon the data as
a single "object"—a self-contained entity with an
identity and certain characteristics of its own.
|