If I went through these steps, though, I wouldn't be able to demonstrate the third and most conservative implementation strategy: Triangulation.
And honestly: I kind of wish he hadn't done that.
Some backround - early after Kent shared the first draft of the book that eventually became Test Driven Development by Example, an objection was raised: there should be a second test to "drive" the refactoring that Kent had demonstrated in the multiplication example. Until the second test is introduced, "You Aren't Going to Need It" should apply. Furthermore, in Kent's approach, during the refactoring task, he makes changes that don't actually preserve the behavior; a function that ignores its inputs is converted into a function that is sensitive to its inputs.
So bunch of things all get tangled up here. And when the dust clears, triangulation ends up with a lot more ink than is strictly justified, remove duplication gets a lot less ink, and a bunch of beginners fall into a trap (confession - I was one who did fall in, back in the day).
Kent's earliest remarks on triangulation emphasize that he doesn't find it particularly valuable. And certainly he didn't come up with a particularly well motivated example when introducing it.
The metaphor itself isn't awful - sometimes you do need more information to be certain of your course - just over emphasized.
For example: it takes up this entire chapter.
I find the motivation for implementing Dollar::equals to be a little bit underwhelming.
If you use Dollars as the key to a hash table, then you have to implement hashCode() if you implement equals().
This rather suggests that we should be writing a check that demonstrates that Dollar can be used as a hash key.
The "implementation" of Dollar::equals really leaves me twitching (see Effective Java by Joshua Bloch) - this is an override that doesn't match the semantics of the parent class (yet). I'd want to add the additional checks needed to finish this implementation before moving on to some other more interesting thing.
No comments:
Post a Comment