わかりやすいコードで管理しておきたい
これが良いコードかわかりません。今日、個人プロジェクトにイベントのトラッキングを入れようと思ってふと思いついて書いてみました。
コードを書いて、その後説明をします。おかしなことを書いているかもしれません。その場合はご指摘いただけるとありがたいです。
コード
前提として、分析系のコードはAnalyzer
というclassに入っています。Screenのtrackingなどはここでまとめてやっていて、今回はそれにeventのトラッキングを追加してみました。
Swift1.2です。Swift2系ならprotocol extensionとか使ってもっとすっきり書けそうです。
protocol Tracker {
static var category: String { get }
func track(label: String?)
}
extension Analyzer {
enum Category: String {
case Article = "Article"
case Settings = "Settings"
}
enum Article: String, Tracker {
static var category = Category.Article.rawValue
case Stock = "Stock"
case Unstock = "Unstock"
case Share = "Share"
case Show = "Show"
case StockAction = "StockAction"
case ShowStockers = "ShowStockers"
case CommentAction = "CommentAction"
case ShowComment = "ShowComment"
case OtherAction = "OtherAction"
func track(_ label: String? = nil) {
Analyzer.trackEvent(self.dynamicType.category, action: rawValue, label: label)
}
}
...
static func trackEvent(category: String, action: String, label: String? = nil) {
let builder = GAIDictionaryBuilder.createEventWithCategory(category, action: action, label: label, value: nil)
gai.defaultTracker.send(builder.build() as [NSObject: AnyObject])
}
}
使う時はこうなります。
Analyzer.Article.Unstock.track(title)
Analyzer.Settings.Logout.track()
説明
特徴としては、
- Category毎のアクションが一箇所にまとまるので測定しているアクションをパッと見で把握できます。
- enumで書いているので使えるActionの制約がわかりやすいです。その場で文字列で書いていくと散らかってくるので...。
- Analyzer... Article... Unstock ... track と、補完が出てくるので簡単です。
- コードもそんなに長くなりません。
- valueは今の所使っていませんが、追加も簡単です。
とりあえず、ArticleよりもArticleTrackerの方が良いかもなどと思えてきました。