First off I don't enjoy giving a bad mark to other people's effort. It's often too easy to put a tag value on something we had nothing to do with and even bad books are well intentioned. That been said, this book is far from being bad. The content is actually pretty good and Jason E. Sweat succeeds very well in explaining the patterns and their application in PHP. However, there's room for improvement and although I was really looking forward to give some kudos, I did have some issues with the book. I took some time to review it to help make it better in subsequent editions.
My opinions are made upon a few assumptions. Some may agree others may not, which is the point of a personal review, if you share my point of view chances are that you'll experience the same thing.
1) I presume that anyone deciding to learn about design patterns is probably serious about Object Oriented Programming and anyone serious about OOP in PHP should probably switch from PHP4 to PHP5. This book has been out for about a year and a half. PHP5 was already on course to acquire wide acceptance, yet Jason chose to code mainly in PHP4, which is clearly crippled in its OO implementation compared to PHP5.
This is not so much of an issue in chapters where pattern implementation is very similar in both versions, but at times the lack of true OO features in PHP4 made it tedious to go through the examples and I felt like just skipping the PHP4 parts and go straight to the PHP5 ones. It wasn's easy because only some of these examples have a PHP5 equivalent.
We are therefore often confined to make sense of all the PHP4 idiosyncrasies deployed to mimic the simplest features natural to true OOP, like the use of global variables to emulate staticity, prepending the ampersand (&) to pass objects by reference and other little 'tricks' that succeed more at veering attention away from the pattern at hand to language features.
2) I presume that most people who got this book did because of the two keywords in the title 'Design Patterns'. Yet there is as much, if not more, about Test Driven Development (TDD) using Simpletest as there is about design patterns. Don't get me wrong, TDD is an excellent coding practice, but as much as it can be practiced along with design patterns both can be clearly isolated. If, like me, you learn by focusing on one specific topic at a time, you will find this book's approach very annoying at times.
First, it's an informal introduction to TDD. You will probably need more support from a more specific text on TDD before really becoming proficient at it, so I don't see the point in trying to actually teach it along with design patterns. An introductory chapter would have been enough (the Mockobject Pattern chapter was perfect for this) and maybe an appendix with links to tests for the examples for those interested.
Second, Jason's insistence to test every bit of piece of code makes the reading even more tedious. Examples are cluttered with tests and the logic doesn't flow as smoothly anymore. Plus, TDD is an iterative coding process, meaning that you write a little test and then you implement just enough logic for the test to pass, then you add some more test and then you... repeat until done. If in real life the overall result can be good, it is not very practical to try and reproduce it in a book. Your tests may never be exhaustive or meaningful enough to actually matter and you may be constrained to use examples a tad bit too simplistic to illustrate your point, which is exactly what happens in this book.
I felt that the introduction of TDD in the book was meant exactly as a separate attempt at explaining that technique, not as a support to understand design patterns and the two topics became somehow intertwined and less substantial. Trying to chase a rooster and a rabbit, we're left with a chick and a bunny.
Here are my recommendations for the next edition:
- Forget php4
- Keep TDD for another book or introduce it in the mockobject pattern chapter or an appendix
- Concentrate on design patterns
- Include more solid examples
- Work more on refactoring solutions to really show how they remap to patterns