Chapter 1. A short dive into the architecture of an information system
Chapter 1. Designing simple object-oriented systems
Chapter 1. Exercises
Chapter 1. It s all about managing complexity
Chapter 1. Simple design as a day-to-day activity
Chapter 1. Summary
Chapter 1. The example project PeopleGrow!
Chapter 2. Exercises
Chapter 2. Make code readable and documented
Chapter 2. Making code small
Chapter 2. Move new complexity away from existing classes
Chapter 2. Summary
Chapter 3. Design effective data validation mechanisms
Chapter 3. Encapsulate state checks
Chapter 3. Exercises
Chapter 3. Keeping objects consistent
Chapter 3. Model aggregates to ensure invariants in clusters of objects
Chapter 3. Provide only getters and setters that matter
Chapter 3. Summary
Chapter 4. Avoid coupling to details or things you don t need
Chapter 4. Break down classes that depend on too many other classes
Chapter 4. Exercises
Chapter 4. Inject dependencies, aka dependency injection
Chapter 4. Managing dependencies
Chapter 4. Summary
Chapter 5. Designing good abstractions
Chapter 5. Exercises
Chapter 5. Generalize important business rules
Chapter 5. Prefer simple abstractions
Chapter 5. Summary
Chapter 6. Encapsulate low-level infrastructure errors into high-level domain errors
Chapter 6. Exercises
Chapter 6. Handling external dependencies and infrastructure
Chapter 6. Only depend on things you own
Chapter 6. Summary
Chapter 6. Use the infrastructure fully
Chapter 7. Achieving modularization
Chapter 7. Design clear interfaces
Chapter 7. Exercises
Chapter 7. No intimacy between modules
Chapter 7. Summary
Chapter 8. Accept that your code won t ever be perfect
Chapter 8. Being pragmatic
Chapter 8. Consider redesigns
Chapter 8. Exercises
Chapter 8. Refactor aggressively but in small steps
Chapter 8. References
Chapter 8. Summary
Chapter 8. You owe this to junior developers