定义类接口
<span style="font-size:14px;"> class MinuteHourCounter{ //add a count void Count(int num_bytes); //return the count over this minute int MinuteCount(); //return the count over this hour int HourCount(); } </span>在实现这个类之前,让我们首先看一看这些名字和注释,看看有哪些地方有改进的地方。
MinuteHourCounter 这个类名很好,很专门、具体,并且容易读出来。
Count()是有问题的,因为有人会认为它的意思是“返回所有时间里的总的计数”。这个名字有点违反直觉。问题是count既是个名词又是个动词,所以既可以是“我想要得到你所见过的所有样本的计数”意思也可以是“我想要你对样本进行计数”的意思。
下面有几个名字可供替代count():
1、Increment()
是会误导人的,因为它意味着一个只会增加的值。
2、Observe()
还可以,但是感觉有点模糊。
3、Record()
既是动词又是名称,不好
4、Add()
它既可以是“以算术方法增加”的意思,也可以是“添加到一个数据列表的意思”,在该情况下,两种情况兼有,所有适合。
所以修改为void Add(int num_bytes)。
但是参数名num_bytes太有针对性了,可以采用更加通用的count,既简单、通用并且暗示“非负数”。
版本 1:
下面是主要的接口设计,其中的 Add()对新到来的流量事件进行记录,而 MinuteCount()和
HourCount()分别用于统计过去一分钟和一小时的网络流量和;
<span style="font-size:14px;"> class MinuteHourCounter{ //add a count; void Add(int count); //return the accumalated count over the last 60 seconds; int MinuteCount(); //return the accumalated count over the last 3600 seconds; int HourCount(); } //下面是上述接口的具体实现: class MinuteHourCount{ struct Event{ Event(int count, time_t time):count(count), time(time){} int count; time_t time; }; list<Event> events; public: void Add(int count){ events.push_back(Event(count, time()); } int MinuteCount(){ int count = 0; const time_t now_secs = time(); for(list<Event>::reverse_iterator i = events.rbegin(); i!=events.rend()&&i->time > now_secs-60; ++i){ count += i->count; } return count; } int HourCount(){ int count = 0; const time_t now_secs = time(); for(list<Event>::reverse_iterator i = events.rbegin(); i!=events.rend()&&i->time > now_secs-3600; ++i){ count += i->count; } return count; } }; </span>简评:
2. int MinuteCount() 和 int HourCount()两者之间的代码重复度太大;可以考虑合并抽取;
<span style="font-size:14px;"> //对于上述的问题1的改进: int MinuteCount(){ int count = 0; const time_t now_secs = time(); for(list<Event>::reverse_iterator i = events.rbegin(); i!=events.rend(); ++i){ if(i->time > now_secs - 60) //将判断条件独立出来,增加可读性; count += i->count; else break; } return count; }</span>观察上述的代码,就可以发现很多的代码都是重复的,因此对于上述问题 2 的改进:
<span style="font-size:14px;">int CountSince(int cutoff){ int count = 0; const time_t now_secs = time(); for(list<Event>::reverse_iterator i = events.rbegin(); i!=events.rend(); ++i){ if(i->time > cutoff) count += i->count; else break; } return count; } int MinuteCount(){ return CountSince(time()-60); } int HourCount(){ return CountSince(time()-3600); } </span>从设计的角度讲,上述代码的主要问题:
原文:http://blog.csdn.net/u013476464/article/details/26363833