Foreword to the first edition by Peter Wegner

This book is an important contribution to object-oriented literature, bridging the gap between the language and software engineering communities. It covers language design issues relating to inheritance, types, polymorphism, and active objects as well as software design paradigms such as the object modeling technique (OMT), the model-view-controller paradigm (MVC) and responsibility-driven design. Its four-part subdivision of the subject matter into design, languages and systems, foundations, and application frameworks nicely balances practice and theory, covering both practical design techniques and foundational models. Its use of C++ as the primary application language, with Smalltalk and Eiffel as additional languages, allows the book to be used in courses with programming assignments in mainstream object-oriented languages.

The overall sense of balance and perspective is matched by an engaging style and a modern treatment of an exceptionally broad range of topics in the body of the book. The conceptually challenging questions at the end of each chapter (with answers in an appendix) are sometimes humorous. For example, the question `Why do you need friends?', which invites the reader to examine the value of this C++ language construct, is nicely answered by pointing out tradeoffs between efficiency and safety, ending with the admonition `treat friends with care'.

Object-oriented programming started as a language framework for single-user systems, but is maturing into a technology for heterogeneous, distributed network systems that focus on interoperability and glue for the composition of heterogeneous modules. The notion of structure in object-oriented programming is analogous to, but more complex than, the structure of structured programming. This book reflects the maturation process from single-user to distributed systems technology and provides a bridge from object-oriented concepts of single-user programming to distributed software design concepts.

Basic object-oriented concepts are introduced from the viewpoint of design, thereby motivating language concepts by their role in the software life cycle. The first four chapters provide a gentle introduction to fundamental concepts that yields unexpected insights for the seasoned reader. Chapter 1 examines paradigms of programming and provides a distinctive object-oriented view of the software life cycle, while chapter 2 presents C++, examines its benefits and pitfalls, and compares it to Smalltalk and Eiffel. Chapter 3 on object-oriented design includes an insightful discussion of models, contracts, and specifications that provides a comparative overview and synthesis of alternative approaches to the conceptual foundations of design. Chapter 4 rounds out the section on design with a discussion of testing and metrics for software validation that provides a practical counterpoint to the conceptual focus of earlier chapters.

The topics in the first four chapters are well chosen to provide a foundation for later topics. The chapter on language design principles includes an up-to-date review of models of inheritance and delegation, the chapter on concurrency examines inheritance anomalies, concurrent object models, and principles of distributed programming, while the chapter on composition and collaboration explains callbacks, window management, and event-driven computation. The three chapters on foundations examine, in a substantive but relaxed way, algebraic models for abstract data types, calculi for type polymorphism, and behavioral refinement through subtyping. The two final chapters provide an account of interoperability, standards, library design, requirements engineering, hypermedia links, and heterogeneous systems.

This book covers an unusually broad range of topics in an eminently readable fashion and is unique in its balance between theory and practice and its multifaceted approach. Anton Eliëns demonstrates an up-to-date mastery of the literature and the rare ability to compare, evaluate, and synthesize the work of different software research and development communities. He is to be commended on his skill and versatility in weaving a sequential expository thread through a heterogeneous, distributed domain of subject matter.


Peter Wegner
October 1994