Re: Re: A worked example of TDD in D, with some personal ruminations on my own style, and notes on the D language..
Luther Baker <[email protected]> Tue, 7 Jan 2014 19:59:12 -0600
| Newsgroups | gmane.comp.programming.test-driven-development |
|---|---|
| Message-ID | <CAL5Mv1mH9-4nTCJ+76UgrAriviQPnJeKS+ozAFqgD30s=k80jQ@mail.gmail.com> |
Missed the original post ... so many thanks for sharing! Wish this group were more active. On Tue, Jan 7, 2014 at 7:15 PM, John Carter <[email protected]>wrote: > > > Pity I didn't see this blog post first.... > > http://blog.8thlight.com/uncle-bob/2013/05/27/TheTransformationPriorityPremise.html > > Because then I would have defined "Provocative Test that adds one new > Behaviour" as one that provoked one new behaviour in the precedence order > suggested by Uncle Bob. > > > On Mon, Dec 30, 2013 at 9:40 AM, John Carter <[email protected]>wrote: > >> So I have being doing TDD for years now. >> >> But I started noting I tend not to do it exactly "By The Book". >> >> So as an exercise I tried going back to doing it... >> >> * Very fine grained steps. >> * Small change so Test fails - commit. >> * Small change so Test passes - commit. >> * Refactor so test passes - Commit. >> >> As small as I could. >> >> Oh, and just for the fun of it, I'm learning the D language, so I did it >> in D. >> >> So here is the result, complete with a blow-by-blow Mercurial Repository >> of every step. >> >> >> https://bitbucket.org/JohnCarter/roman/src/47ab019ccdf7a4d5d64c1f10ffc7418e67d6f916/roman.d?at=default >> >> * Conclusions from the exercise.* >> >> 1. Very fine grained steps resulted in fewer bugs and fewer >> backtracks. >> 2. Very fine grained steps resulted in better factored code. >> 3. Watching others do the same exercise led me to the attitude >> "adding more test cases is Bad". (Slower, hard to maintain tests, more >> lines of code) >> 4. Very fine grained steps slowed me down compared to my more usual >> somewhat loose style. >> 5. *Thoughtfully adding Provocative test cases in the order of "What >> I need to Handle Next" is Very Very Good.* >> 6. *Replacing "Fine Grained Steps" with, whenever stuck, pull out a >> smaller chunk and TDD that first (with Provocative test cases) works Very >> Very Well.* >> >> >> Bottom Line? >> In future I will be doing... >> >> 1. Thoughtfully choosing a minimal number of provocative test cases >> in the order that challenges a single new behaviour, ie. A test case that >> requires a single additional behaviour in the code. >> 2. I will take the largest steps I can where I can go from test fail >> to test pass in a single change. >> 3. Whenever I misjudged and take too large a step, I will factor out >> a smaller function and test and develop that first via the same process. >> 4. Factoring out works best like this... >> 1. Revert to last passing state, leaving failing test commented >> out. >> 2. Copy pasta the code you wish to factor / enhance into a small >> function leaving original function untouched. >> 3. Get tests for new function to pass. >> 4. Wire new function into parent cleaning out original copy. >> 5. Get tests to pass. >> 6. Reenable commented out test... hopefully it passes now. >> >> >> *What do I mean by provocative test cases?* >> >> For example, when converting Roman numerals. >> >> >> "I" is provocative. >> >> "II" is provocative. >> >> "III" is NOT provocative, it merely is extra Lines of Code (and hence a >> liability). >> >> "IV" is provocative, but a bad choice for next test case as it adds two >> new behaviours at once. >> >> "V" is provocative and adds a single new behaviour. >> >> "IV" is now provocative and adds only a single new behaviour. >> >> >> Conclusions about D. >> >> I love it. >> >> It is C / C++ with the worst stuff removed, and the best stuff stolen >> from it's competitors. >> >> If you are serious about industrial grade, high quality, defect free, >> efficient programming, you urgently need to be looking at D as your next >> language. >> >> Sigh! Unicode. >> >> That's not D's fault. >> >> D handles Unicode remarkably smoothly, but ye ancient 7bit ASCII is >> always going to be faster and conceptually easier than variable length code >> point UTF8. >> >> It took a bit of time and effort to get my head around D's template >> system (richer, safer, better than C++) >> >> It took even more time to get my head around Ranges, (again, richer, >> more flexible, safer than C++ iterators, more efficient than generators, >> coroutines or enumerators.) >> >> The choices D has made are rich in very powerful, very efficient >> implications. >> >> Possibly the most striking is Compile Time Function Evaluation. >> >> If it can be evaluated at compile time.... in D it will be. >> >> And that is startling powerful. >> >> >> -- >> John Carter >> Phone : (64)(3) 358 6639 >> Tait Electronics >> PO Box 1645 Christchurch >> New Zealand >> >> > > > -- > John Carter > Phone : (64)(3) 358 6639 > Tait Electronics > PO Box 1645 Christchurch > New Zealand > > > ------------------------------ > This email, including any attachments, is only for the intended recipient. > It is subject to copyright, is confidential and may be the subject of legal > or other privilege, none of which is waived or lost by reason of this > transmission. > If you are not an intended recipient, you may not use, disseminate, > distribute or reproduce such email, any attachments, or any part thereof. > If you have received a message in error, please notify the sender > immediately and erase all copies of the message and any attachments. > Unfortunately, we cannot warrant that the email has not been altered or > corrupted during transmission nor can we guarantee that any email or any > attachments are free from computer viruses or other conditions which may > damage or interfere with recipient data, hardware or software. The > recipient relies upon its own procedures and assumes all risk of use and of > opening any attachments. > ------------------------------ > > >