app统计模块设计-面向对象的方式

app统计模块设计-面向对象的方式

需求

1. 多家统计

研发运营一个优秀的App, 要准确的统计APP的下载, 留存和活跃, 掌握各个功能的使用情况, 这通常需要使用第三方的统计服务. 市场上有很多家统计服务, 比如友盟, Google统计, Flurry统计, Facebook统计 等等.
但是各家的服务的统计算法, 准确性, 稳定性各不相同. 为了更准确, 可靠的进行统计, 需要为App增加多家统计功能.

2. 统计服务

一类统计是统计APP的新增, 活跃, 留存. 这类统计, 需要的是在APP启动的时候, 启动统计服务.
第二类是统计事件. 需要在某个事件发生的时候, 向统计服务发送事件数据. 这个需要在APP各个位置增加相关调用.

面向对象分析和设计

1. 面向对象分析

通过观察需求, 可以找出以下有效的的名词和动词

  • 名词:
    统计服务, 友盟, Google统计, Flurry统计, Facebook统计, 事件(包括名称和数据)
  • 动词
    启动(服务), 发送(事件)

2. 面向对象设计

名词转换为类, 动词转换为方法, 找出继承关系, 利用封装和多态, 得到的设计如下:

  • 类图


    app统计模块设计-面向对象的方式_第1张图片
    类图
  • 关键代码
    protocol AnalyticsService {
    func start()
    func sendEvent(event:Event)
    }

      class AnalyticsManager {
          static let instance = AnalyticsManager()
          private var services:~[AnalyticsService]()~
          private init() {
              services=~[UMAnalyticsService(),
                      GoogleAnalyticsService()
                      …]~
          }
          func start() {
              for s in services {
                  s.start()
              }
          }
    
          func sendEvent(name:String,data:~[String:AnyObject]~) {
              let e=Event(name:name, data:data)
              for s in services {
                  s.sendEvent(e)
              }
          }
      }
    
      class Event {
          let name:String
          let data:~[String:AnyObject]~
          init(name:String, data :~[String:AnyObject]~){
              self.name=name
              self.data=data
          }
      }
    
      class UMAnalyticsService: AnalyticsService {
          func start(){
              MobClick.startWithAppkey(“UMKEY”)
          }
          func sendEvent(event:Event){
              MobClick.event(event.name, attributes:event.data)
          }
      }
    

总结

设计目标有两个, 易用, 可扩展, 通过上述的设计, 基本达到.

  • 客户代码只用使用AnalyticsManager的两个方法(start, sendEvent)即可进行多家的统计.
  • 如果需要增加新的统计服务, 只需要增加一个类: 实现AnalyticsService的类, 修改一处代码: AnalyticsManager的初始化方法init里的代码即可. 符合面向对象, 需求发生变化, 尽量通过新增类, 而不是修改代码来实现这一原则.

你可能感兴趣的:(app统计模块设计-面向对象的方式)