我们被教导说一个方法应该只做一件事
差不多。不幸的是,程序比这更复杂。如果你把这个想法发挥到极致,方法将没有参数;)所以在编写接口和编写程序时,你需要考虑便利性和可用性。这需要考虑,但是您拥有的经验越多,就越容易理解您正在解决的问题,以及任何客户将如何使用该界面。
在这种情况下,字数和单独的字数是完全不同的。考虑一下:如何将它参数化为一种方法?您应该使用什么特殊的奇怪限定词来表示“所有单词”?NULL
或者空字符串将是 C 接口中的常见选择,甚至在某些 C++ 接口中也是如此。但是,我不认为这是一个设计良好的界面(有些人会不同意)。
IMO,理想的接口将有两种不同的方法:
size_t wordCount() const;
size_t countOccurrencesOfWord(const std::string& pWord) const;
而我之前劝阻的界面是:
// eah, just pass NULL or an empty string for the word count of the text file
size_t countOccurrencesOfWord(const std::string* const pWord) const;
但是,另一个考虑因素是公共接口与私有接口。你的公共接口可能提供了 2 种方法,但是如果内部实现在某些情况下可能会选择相同的底层实现,或者在问题相似时会略有不同。假设您的类包装了一个 C 接口,该接口具有size_t SomeTypeCountOccurrencesOfWord(SomeTypePtr pSomeType, const char* const pWord);
允许NULL
参数的接口pWord
——那么两个单独的方法仍然是一个不错的选择,即使它们的底层实现几乎相同。
我最初采取的方法是首先填充树,然后提供必要的接口来计算一个单词或所有单词。然后,如果我确定缓存一个值是一个好主意,我可以很容易地在事后引入一个变量。