What If?

Our implementation assumes that the letter passed to encodedDigit will be found in the encodings map. We make the assumption to allow moving forward incrementally, writing only the minimal code needed to pass each test. But we still have the responsibility of thinking about code that may need to be written.

Will it ever be possible for encodedDigit to be passed a letter that doesn’t appear in the lookup map? If so, what should the function do? Wikipedia doesn’t answer the question. We could guess, but the better answer is to ask the customer. We don’t have one, but we can find a customer proxy online. A web search quickly turns up a handful of Soundex calculator apps. We enter A# into one of them and receive A000 as a response. Question answered: we need to ignore unrecognized characters.

With TDD, you can choose to jot down the name of a would-be test, or you can write it now. At times I’ve found that driving in a few exceptional cases earlier would have saved me some debugging time later. Let’s put the test in place now.

c2/21/SoundexTest.cpp
 
TEST_F(SoundexEncoding, IgnoresNonAlphabetics) {
 
ASSERT_THAT(soundex.encode(​"A#"​), Eq(​"A000"​));
 
}

The test doesn’t simply fail; it crashes. The find call returns an iterator pointing to end that we try to dereference. We change encodedDigit to instead return an empty string in this case.

c2/21/Soundex.h
 
std::​string​ encodedDigit(​char​ letter) ​const​ {
 
const​ std::unordered_map<​char​, std::​string​> encodings {
 
{​'b'​, ​"1"​}, {​'f'​, ​"1"​}, {​'p'​, ​"1"​}, {​'v'​, ​"1"​},
 
// ...
 
};
*
auto​ it = encodings.find(letter);
*
return​ it == encodings.end() ? ​""​ : it->second;
 
}
..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
18.119.111.179