Arguably ahead of its time, given the strong functional borrowings of ostensibly object oriented languages such as Ruby and Python, this book presents an approach to domain analysis and program design using C++, although it's applicable to several programming languages. Readers may also find echos of Eric Evans' Domain Driven Design, particularly in the idea of a domain dictionary to record a vocabulary for use in naming the parts of the finished model.
The main message is that OO is only one of several choices when building software in C++. The author presents the following alternatives: generics, classes without virtual functions, overloaded functions and using the preprocessor. Clearly, some of these suggestions are more niche than others. Some extended examples are provided, involving a text editor/buffer, a function differentiator and a finite state machine.
The other big idea is the concept of commonality and variability analysis. The process goes along the following lines:
1. Create a domain dictionary defining all terms used in the domain.
2. Analyse the domain using experience or intuition to group the domain into subdomains of commonality.
3. For each subdomain, analyse the variabilities with respect to their common core.
4. Decide which paradigm to use, depending upon whether the variability needs to be specified at run time, compile time, etc.
I worked hard to like this book, really I did. One of the biggest problems for me is that I just can't get along with James Coplien's writing style, which reads like a stuffy academic research paper. I find it extremely ponderous and obfuscated, whole sentences flow by without imparting any meaning.
Perhaps as a by-product of my difficulties with Coplien's style, I found it hard to extract much usable content from the book. The four points I outlined above all seem entirely reasonable to me, but reading this book hasn't given me any further insight into them. It's particularly frustrating that Coplien has little to say about how to go about finding commonalities in a domain, apart from appealing to notions of experience and intuition, which is unhelpful. At least he doesn't suggest underlining nouns. There is some mention of design patterns, so if you're looking for more examples in C++, you may get some value from that.
It seems that lots of people liked this book (including the authors of the excellent Design Patterns Explained, where I first heard of it), so maybe if you find Coplien's writing style a bit more readable, you should give it a go. Personally, I got fairly low returns from it.