定义类接口
下面是用C++写的第一个类接口版本:
在实现这个类之前,让我们看一遍这些名字和注释,看看是否有什么地方我们想改一改。
改进命名
MinuteHourCounter这个类名是很好的。它很专门、具体,并且容易读出来。
有了类名,方法名MinuteCount()和HourCount()也是合理的。你可能会给它们起GetMinuteCount()和GetHourCount()这样的名字,但这并没什么帮助。如第3章所述,对很多人来讲"get"暗示着“轻量级的访问器”。你将会看到,其他的实现并不会是轻量级的,所以最好不要"get"这个词。
然而方法名Count()是有问题的。我们问同事他们认为Count()会做什么,其中一些人认为它的意思是“返回所有时间里的总的计数”。这个名字有点违反直觉。问题是Count既是个名词又是个动词,既可以是“我想要得到你所见过的所有样本的计数”的意思也可以是“我想要你对样本进行计数”的意思。
下面几个名字可供代替Count():
·Increment()
·Observe()
·Record()
·Add()
Increment()是会误导人的,因为它意味着一个只会增加的值。(在该情况中,小时计数会随时间波动。)
Observe()还可以,但是有点模糊。
Record()也有名词/动词的问题,所以不好。
Add()很有趣,因为它既可以是“以算术方法增加”的意思,也可以是“添加到一个数据列表”——在该情况中,两种情况兼而有之,所以Add()正合适。那么我们就要把这个方法重命名为void Add(int num_bytes)。
但是参数名num_bytes太有针对性了。是的,我们主要的用例的确是对字节计数,但是MinuteHourCounter没必要知道这一点。其他人可能用这个类来统计查询或者数据库事务的次数。我们可以用更通用的名字,如delta,但是delta这个词常常用在值有可能为负的场合,这可不是我们希望的。count这个名字应该可以——它简单、通用并且暗示“非负数”。同时,它使我们可以在更明确的背景下加入"count"这个词。
改进注释
下面是目前为止的类接口:
让我们看一遍每个方法的注释并且改进它们。看看第一个:
这条注释现在完全是多余的了——要么删除它,要么改进它。下面是一个改进的版本:
现在让我们来看看MinuteCount()的注释:
当我们问同事这段注释是什么意思时,得到了两种互相矛盾的解读:
1.返回现在所在的时间(如12:12 p.m.)所在的分钟中的计数。
2.返回过去60秒内的计数,和时钟边界无关。
第二种解释才是它实际的工作方式。所以让我们把这个混淆用更明确和具体的语言解释清楚。
(同样地,我们也可以改进HourCount()的注释。)
下面是目前为止包含所有改动的类定义,还有一条类级别的注释:
(出于简洁的考虑,我们在后面会省略掉代码中的这些注释。)
得到外部视角的观点
你可能已经注意到,我们已经有两次通过同事来帮助我们解决问题了。询问外部视角的观点是测试你的代码是否“对用户友好”的好办法。要试着对他们的第一印象持开放的态度,因为其他人可能会有同样的结论。并且这些“其他人”里可能就包含6个月之后的你自己。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论