Preface |
Acknowledgments |
Introduction / 1: |
Decomposition and Abstraction / 1.1: |
Abstraction / 1.2: |
Abstraction by Parameterization / 1.2.1: |
Abstraction by Specification / 1.2.2: |
Kinds of Abstractions / 1.2.3: |
The Remainder of the Book / 1.3: |
Exercises |
Understanding Objects in Java / 2: |
Program Structure / 2.1: |
Packages / 2.2: |
Objects and Variables / 2.3: |
Mutability / 2.3.1: |
Method Call Semantics / 2.3.2: |
Type Checking / 2.4: |
Type Hierarchy / 2.4.1: |
Conversions and Overloading / 2.4.2: |
Dispatching / 2.5: |
Types / 2.6: |
Primitive Object Types / 2.6.1: |
Vectors / 2.6.2: |
Stream Input/Output / 2.7: |
Java Applications / 2.8: |
Procedural Abstraction / 3: |
The Benefits of Abstraction / 3.1: |
Specifications / 3.2: |
Specifications of Procedural Abstractions / 3.3: |
Implementing Procedures / 3.4: |
Designing Procedural Abstractions / 3.5: |
Summary / 3.6: |
Exceptions / 4: |
The Java Exception Mechanism / 4.1: |
Exception Types / 4.2.1: |
Defining Exception Types / 4.2.2: |
Throwing Exceptions / 4.2.3: |
Handling Exceptions / 4.2.4: |
Coping with Unchecked Exceptions / 4.2.5: |
Programming with Exceptions / 4.3: |
Reflecting and Masking / 4.3.1: |
Design Issues / 4.4: |
When to Use Exceptions / 4.4.1: |
Checked versus Unchecked Exceptions / 4.4.2: |
Defensive Programming / 4.5: |
Data Abstraction / 4.6: |
Specifications for Data Abstractions / 5.1: |
Specification of IntSet / 5.1.1: |
The Poly Abstraction / 5.1.2: |
Using Data Abstractions / 5.2: |
Implementing Data Abstractions / 5.3: |
Implementing Data Abstractions in Java / 5.3.1: |
Implementation of IntSet / 5.3.2: |
Implementation of Poly / 5.3.3: |
Records / 5.3.4: |
Additional Methods / 5.4: |
Aids to Understanding Implementations / 5.5: |
The Abstraction Function / 5.5.1: |
The Representation Invariant / 5.5.2: |
Implementing the Abstraction Function and Rep Invariant / 5.5.3: |
Discussion / 5.5.4: |
Properties of Data Abstraction Implementations / 5.6: |
Benevolent Side Effects / 5.6.1: |
Exposing the Rep / 5.6.2: |
Reasoning about Data Abstractions / 5.7: |
Preserving the Rep Invariant / 5.7.1: |
Reasoning about Operations / 5.7.2: |
Reasoning at the Abstract Level / 5.7.3: |
Operation Categories / 5.8: |
Adequacy / 5.8.3: |
Locality and Modifiability / 5.9: |
Iteration Abstraction / 5.10: |
Iteration in Java / 6.1: |
Specifying Iterators / 6.2: |
Using Iterators / 6.3: |
Implementing Iterators / 6.4: |
Rep Invariants and Abstraction Functions for Generators / 6.5: |
Ordered Lists / 6.6: |
Assignment and Dispatching / 6.7: |
Assignment / 7.1.1: |
Defining a Type Hierarchy / 7.1.2: |
Defining Hierarchies in Java / 7.3: |
A Simple Example / 7.4: |
Abstract Classes / 7.5: |
Interfaces / 7.7: |
Multiple Implementations / 7.8: |
Lists / 7.8.1: |
Polynomials / 7.8.2: |
The Meaning of Subtypes / 7.9: |
The Methods Rule / 7.9.1: |
The Properties Rule / 7.9.2: |
Equality / 7.9.3: |
Discussion of Type Hierarchy / 7.10: |
Polymorphic Abstractions / 7.11: |
Polymorphic Data Abstractions / 8.1: |
Using Polymorphic Data Abstractions / 8.2: |
Equality Revisited / 8.3: |
More Flexibility / 8.4: |
Polymorphic Procedures / 8.6: |
Specifications and Specificand Sets / 8.7: |
Some Criteria for Specifications / 9.2: |
Restrictiveness / 9.2.1: |
Generality / 9.2.2: |
Clarity / 9.2.3: |
Why Specifications? / 9.3: |
Testing and Debugging / 9.4: |
Testing / 10.1: |
Black-Box Testing / 10.1.1: |
Glass-Box Testing / 10.1.2: |
Testing Procedures / 10.2: |
Testing Iterators / 10.3: |
Testing Data Abstractions / 10.4: |
Testing Polymorphic Abstractions / 10.5: |
Testing a Type Hierarchy / 10.6: |
Unit and Integration Testing / 10.7: |
Tools for Testing / 10.8: |
Debugging / 10.9: |
Requirements Analysis / 10.10: |
The Software Life Cycle / 11.1: |
Requirements Analysis Overview / 11.2: |
The Stock Tracker / 11.3: |
Requirements Specifications / 11.4: |
Data Models / 12.1: |
Subsets / 12.1.1: |
Relations / 12.1.2: |
Textual Information / 12.1.3: |
Requirements Specification for Stock Tracker / 12.2: |
The Data Model / 12.3.1: |
Stock Tracker Specification / 12.3.2: |
Requirements Specification for a Search Engine / 12.4: |
Design / 12.5: |
An Overview of the Design Process / 13.1: |
The Design Notebook / 13.2: |
The Introductory Section / 13.2.1: |
The Abstraction Sections / 13.2.2: |
The Structure of Interactive Programs / 13.3: |
Starting the Design / 13.4: |
Discussion of the Method / 13.5: |
Continuing the Design / 13.6: |
The Query Abstraction / 13.7: |
The WordTable Abstraction / 13.8: |
Finishing Up / 13.9: |
Interaction between FP and UI / 13.10: |
Module Dependency Diagrams versus Data Models / 13.11: |
Review and Discussion / 13.12: |
Inventing Helpers / 13.12.1: |
Specifying Helpers / 13.12.2: |
Top-Down Design / 13.12.3: |
Between Design and Implementation / 13.14: |
Evaluating a Design / 14.1: |
Correctness and Performance / 14.1.1: |
Structure / 14.1.2: |
Ordering the Program Development Process / 14.2: |
Design Patterns / 14.3: |
Hiding Object Creation / 15.1: |
Neat Hacks / 15.2: |
Flyweights / 15.2.1: |
Singletons / 15.2.2: |
The State Pattern / 15.2.3: |
The Bridge Pattern / 15.3: |
Procedures Should Be Objects Too / 15.4: |
Composites / 15.5: |
Traversing the Tree / 15.5.1: |
The Power of Indirection / 15.6: |
Publish/Subscribe / 15.7: |
Abstracting Control / 15.7.1: |
Glossary / 15.8: |
Index |