If you haven't read Applying UML and Patterns - An Introduction to Object-Oriented Analysis and Design and Iterative Development by Craig Larman, go buy it. I am reading the recently released 3rd edition, and quite frankly, I feel I missed out by not purchasing the earlier versions.
The book rocks. I started reading some additional chapters last night at 1:00am and didn't put it down until 3:15am it was that good. The first part of the book focuses on agile and iterative development and made it interesting, informative, and practical. The chapters I read last night started focusing more on GRASP, design patterns, assigning responsibilities to objects, etc.
It is not that these topics are new to me, but that they are presented in such a clear and practical manner. Craig Larman takes the reader through the development of a NexGen Point of Sale (POS) Application and a Monopoly Game from start to finish. The book is literally used as a text book in many classes and is refreshingly complete and thorough (yet not mundane) in its coverage of the topics.
The book takes you through all nine GRASP Patterns that are useful as a learning aid for OO design with responsibilities:
- Information Expert - A general principal of object design and responsibility assignment?
- Creator - Who creates?
- Controller - What first object beyond the UI layer receives and coordinates a system operation?
- Low Coupling - How to reduce the impact of change?
- High Cohesion - How to keep objects focused, understandable, and manageable?
- Polymorphism - Who is responsible when behavior varies by type?
- Pure Fabrication - Who is responsible when you are desperate, and do not want to violate high cohesion and low coupling?
- Indirection - How to assign responsibilities to avoid direct coupling?
- Protected Variations - How to assign responsibilities so that the variations or instability in the elements do not have an undesirable impact on other elements?
The patterns may not sound like much, but I guarantee the 200 or so pages dedicated to understanding and applying them in your applications will make you a better developer.