Object-oriented methods are considered the paradigm of choice in software engineering today. The real world is modeled by classes of objects, each class having common structures and behaviors. Data abstraction allows us to visualize these objects in varying degrees of detail, depending on our needs at the time. Encapsulation separates the implementation details of the objects from their interfaces. Inheritance allows us to reuse the properties of other classes. Polymorphism and overloading allow us to assign different meanings to the same operator. In this way, object-oriented methods provide both flexibility and control in the development process. The resulting software has been found to be more maintainable, reusable, and reliable.
This introductory text on object-oriented concepts and techniques consists of nine chapters. Chapter 1 introduces the basic concepts. Fundamental notions of object orientation, such as abstraction, separation, composition, association, aggregation, and generalization, are covered. Chapter 2 discusses the properties of objects within a class. Chapter 3 deals with the relationships and communications among objects in different classes. Communicating by copy, by reference, and by pointer are covered. In chapter 4, the method for implementing a new class is presented. The author analyzes the use of static and dynamic aggregations of properties and methods to build classes. Chapter 5 illustrates how production tools can be used to facilitate the development of object-oriented systems. Development and debugging tools under Unix and Visual C++ are examined. Inheritance, the key issue in object orientation, is discussed in chapter 6. Techniques such as replacing, extending, and hiding inherited operations are highlighted. Templates are also useful for alleviating repetitions in data structures and programming; they are explained in chapter 7. Another feature of object-oriented programming is overloading, which allows operators in a new class of objects to have the same name but different effects. This concept is examined in chapter 8. Finally, the last chapter presents the concepts of object-oriented design. Graphical representations such as class diagrams, object diagrams, and interaction diagrams are introduced. The basics of design patterns are also outlined.
The book introduces object-oriented concepts via worked examples and applications. Readers should find them much more interesting and useful than abstract discussions. The exploratory exercises at the end of each chapter enable readers to apply their skills immediately. They are simple, and yet would satisfy the needs of inquisitive readers. The Web pages associated with the book are also interesting. Readers can try out applet systems to reinforce their understanding of the concepts.
My concept of software design differs slightly from that of the author. In my view, software design serves as a bridge between requirements analysis and software implementation. It concentrates on determining how the class hierarchy should be structured and how the main operations should be specified, in order to satisfy both the functional requirements and performance constraints. It involves modeling techniques and decision-making processes that are quite distinct from implementation.
The C++ techniques presented in this book, on the other hand, are mostly relevant to implementation issues rather than design concerns. Strictly speaking, therefore, this book does not concentrate on “object-oriented software design.” Design principles are only covered in the last chapter. Because of the brief coverage, novices may not be able to appreciate the usefulness of the graphical representations. If these diagrams are indeed useful, readers may wonder why they are not used in tandem with the examples given in the earlier chapters.
In spite of this slight discrepancy between the title and the emphasis, this is an outstanding text. I have no hesitation in recommending it to readers who have taken an introductory course in object-oriented programming.