In recent years, we’ve seen a bit of a resurgence in the popularity of languages that eschew the object-oriented paradigm. Python and Ruby are praised by many because they can be used in a functional style; Lisp and OCaml are talked about in hushed tones of reverence by people who have only incidental experience with them (myself included); and even freak languages like Haskell are entering the mainstream consciousness of the software community. I’ve always felt that this might just be another instance of familiarity breeding contempt — or more accurately, as unfamiliarity breeding admiration. So, I read about and practice as many diverse techniques as I have time for.
I have read many discussions about why one paradigm is better than the other, or how these paradigms should be used together, or in what instances one paradigm might produce a more elegant and maintainable solution than the other. I almost always find these discussions lacking the hard rationality that is typical in, say, the physical sciences. Rather, they usually feel more like a group of people discussing why a song or a piece of artwork has greater merit than another. I’m not saying that these arguments are uninformative — I usually feel as if I’ve learned a lot. I just felt like they were lacking a robust and impartial framework by which the presented claims could be evaluated.
It turns out that the sort of concrete, rational analyses that I have been looking for were actually written long ago. (This might be one of those cases of having to rediscover a solution, rather than having to invent it anew. The aptly-named Michael Stonebreaker of data-management fame is well known for telling our generation of computer scientists that were are blithely ignoring the lessons of the previous generation and reinventing methodologies that were found to be inadequate many years ago. I am inclined to agree with him — but I digress.) This book was published in 1988, and contains a well-structured and precise progression of ideas that are used to derive the object-oriented paradigm.