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