app統(tǒng)計模塊設計-面向?qū)ο蟮姆绞?/h1>
需求
1. 多家統(tǒng)計
研發(fā)運營一個優(yōu)秀的App, 要準確的統(tǒng)計APP的下載, 留存和活躍, 掌握各個功能的使用情況, 這通常需要使用第三方的統(tǒng)計服務. 市場上有很多家統(tǒng)計服務, 比如友盟, Google統(tǒng)計, Flurry統(tǒng)計, Facebook統(tǒng)計 等等.
但是各家的服務的統(tǒng)計算法, 準確性, 穩(wěn)定性各不相同. 為了更準確, 可靠的進行統(tǒng)計, 需要為App增加多家統(tǒng)計功能.
2. 統(tǒng)計服務
一類統(tǒng)計是統(tǒng)計APP的新增, 活躍, 留存. 這類統(tǒng)計, 需要的是在APP啟動的時候, 啟動統(tǒng)計服務.
第二類是統(tǒng)計事件. 需要在某個事件發(fā)生的時候, 向統(tǒng)計服務發(fā)送事件數(shù)據(jù). 這個需要在APP各個位置增加相關調(diào)用.
面向?qū)ο蠓治龊驮O計
1. 面向?qū)ο蠓治?/h3>
通過觀察需求, 可以找出以下有效的的名詞和動詞
- 名詞:
統(tǒng)計服務, 友盟, Google統(tǒng)計, Flurry統(tǒng)計, Facebook統(tǒng)計, 事件(包括名稱和數(shù)據(jù)) - 動詞
啟動(服務), 發(fā)送(事件)
2. 面向?qū)ο笤O計
名詞轉(zhuǎn)換為類, 動詞轉(zhuǎn)換為方法, 找出繼承關系, 利用封裝和多態(tài), 得到的設計如下:
-
類圖
類圖 -
關鍵代碼
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)即可進行多家的統(tǒng)計.
- 如果需要增加新的統(tǒng)計服務, 只需要增加一個類: 實現(xiàn)AnalyticsService的類, 修改一處代碼: AnalyticsManager的初始化方法init里的代碼即可. 符合面向?qū)ο? 需求發(fā)生變化, 盡量通過新增類, 而不是修改代碼來實現(xiàn)這一原則.
