[IT168 技术文档]这是一个很小的功能,说明起来可能更容易些。需求很简单,实现对用户访问行为的记录。为了简单起见,有些东西省略了。旨在抛砖引玉,仓促之中,瑕疵甚多。
1,需要记录的页面类型可能许多,并且每一个记录又各有各的要记录的参数。2,记录的动作是肯定有的。3,有不同数目,不同名字的记录参数也是一定的。这些定性的东西是面向对象思考的根据。接下来从不同方面说一下:
一,记录类型的是显式的,在一个enum中定义所有记录类型的名称,这样做为了让记录类型对扩展者和调用者透明,他们访问TrackRecordType,可以知道现在系统中有哪些记录类型。扩展者扩展记录类型时,需要在此添加新成员,通知系统有新成员加入。
1 using System;
2
3 namespace Sban.Analytics
4 {
5 /// <summary>
6 /// Summary description for TrackRecordType
7 /// </summary>
8 [Flags]
9 public enum TrackRecordType : byte
10 {
11 BookPageTrackRecord = 0,
12 SeachPageTrackRecord
13 }
14 }
15
2
3 namespace Sban.Analytics
4 {
5 /// <summary>
6 /// Summary description for TrackRecordType
7 /// </summary>
8 [Flags]
9 public enum TrackRecordType : byte
10 {
11 BookPageTrackRecord = 0,
12 SeachPageTrackRecord
13 }
14 }
15
二,记录的动作在一个接口中定义,这样做一是为了扩展时有一个统一的约束,二是为了在下面的TrackRecordFactory工厂中可以动态调用。可以考虑用virtual class。这个接口极其简单,只有一个函数。面向对象不怕简单,越简单越好。Track接受一个自定义的参数(TrackRecordParameter param,下面三中提到),用于向记录动作提供所需信息。
1 using System;
2
3 namespace Sban.Analytics
4 {
5 /// <summary>
6 /// Summary description for ITrackRecorder
7 /// </summary>
8 public interface ITrackRecord
9 {
10 bool Track(TrackRecordParameter param);
11 }
12 }
13
2
3 namespace Sban.Analytics
4 {
5 /// <summary>
6 /// Summary description for ITrackRecorder
7 /// </summary>
8 public interface ITrackRecord
9 {
10 bool Track(TrackRecordParameter param);
11 }
12 }
13