有朋友突然问我是不是改行搞SEO了。当时听了有点惊奇,原来是blogs上文章最近都是和SEO相关的 (*^__^*)。问问朋友现在忙些什么东西,他说在做一些日志记录的东西,问我有没有什么好的建议(log4.net开源组件不错)。还是具体问了朋友的一些需求,这个和我们的广告统计日志相识。我就想到写这篇文章了,也避免一下,大家认为我SEO去了。
需求及设想:
1:统计每日用户的点击量。2:考虑到并发和数据库的压力。数据先写入内存,在一定间隔时间将数据变化统一写入数据库。
3:需要考虑扩充统计不同的业务类型,比如 广告统计、注册统计。
业务分析:
业务上有扩展统计类型的需要,那么必然要定义一个服务接口:
Interface IDayLog
服务需要实现的方法:
Add(); 添加日志记录到内存
Save();保存日志记录到数据库
Clear();清空内存日志记录
根据目前业务需求,定义两个业务类:
RegDayLog:IDayLog 每天的登录日志统计
AWDayLog:IDayLog 每天的广告日志统计
这里具体展开一下AWDayLog的系统记录,根据业务需求,需要在子类上添加几个属性:
AWID 需要记录的广告ID
Count 广告ID的增量值
static Dictionary<int, int> adWords 广告的内存数据
这些和业务相关类都有了,接下来我们需要一个控制类(和具体业务无关,用来控制业务流程)
static class DayLogHelper 定义几个和业务相关的属性和方法:
static Dictionary<String, IDayLog> dayLogList 当前加载的日志业务列表
CreateLog() 负责加载需要添加日志记录的业务模块
Start() 负责启动日志记录
FindLog(string logName) 根据logName找到相应的日志业务模块
LogName枚举 系统中日志的类型(这个枚举可以通过配置进行忽略)
具体的类图:
从UML类图中我们可以得到如下信息:
1:Client类为具体的调用类,从类的关系图中可以很清楚的看到,Client只和LogName 枚举、DayLogHelper、IDayLog 有依赖关系。这就说明,我们在模块的外部已经不依赖具体的业务类了,既然这样,那么业务发生变化也不会影响到Client调用。松耦合了。
2:可以改进的地方。首先看图中标记《3》说明如果要新增业务类,就要要改动DayLogHelper。《1》《2》《3》 这三条依赖关系是需要new 具体的业务对象时产生的。那么如何删除这3条依赖关系呢?如何达到解耦的目的呢?配置文件,通过读取配置文件和反射的方式来创建对象。也就是说,如果我们新增加一个“D币日志统计”,我只要新增一个DCashDayLog类、WebConfig添加一条配置文件就可以了,对日志模块不需要做其他处理。当然Web层上需要调用DayLogHerlper添加具体的日志数据,但这和模块本身已没关系了。
总结
线上运行的日志模块和这个也差不多,具体的实现代码就不写了。其实说白了就是通过Interface隐藏了具体的业务类型,通过DayLogHelper 封装了具体业务类的创建过程。写累了,喝茶去了!