第15章:「分/時間カウンタ」を設計・実装する
概要
本章では、プロダクトコードで用いられる、データ構造「分/時間カウンタ」について解説してくれている。
まとめ
「ConveyorQueue」「TrailingBucketCounter」「MinuteHourCounter」の3つのクラスを用いて、それぞれの下位問題を解決できるようにすることが理想的である。
学んだ点
・Count()というメソッド名には、「全期間のカウントを返す」と考える人が多く、この名前を見ただけで直感的に理解できるものではない。そこで、Count()に代わる候補は以下の4つ
①Increment() →値が増加する一方だと思われてしまう。(カウントは時間によって変化するもの)
②Observe() →問題はないが少し曖昧
③Record() →名詞と動詞の問題があるのでだめ
④Add() →「この数値を追加する」と「データのリストに追加する」という2つの意味があるので適切
・Add(~ count)という形で、仮引数の名前にcountを持ってくることで文脈も理解しやすくなる。
・コードがユーザーフレンドかどうかを確認するための優れた手段として、同僚に質問して外部の視点を得る。
・ベルトコンベヤー設計とは、事前に変数同士の合計値を算出して、その後不要なデータを削除して、という流れを繰り返すために用いられる設計
・ベルトコンベヤー設計で、最も大切なのは時間経過に伴うイベントの「移動」である。
・ConveyorQueue
最大長のあるキューで、「シフト」可能で合計値を保持する。
・TrailingBucketCounter
時間経過に伴ってConveyorQueueを移動する。また、1つの(最新の)時間帯のカウントを任意の精度で保持する。
・MinuteHourCounter
2つのTrailingBucketCounterを保持する。1つは1分間のカウントで、もう一つは、1時間のカウントである。
感想と振り返り
実装しているアプリではすでにこのようなカウンタは実装されているため、手を加えることはないと考えられますが、これを機にカウンタに関わるコードを見てどのような書き方やデータのやり取りがされているのかを学びたいと思いました!
最後の振り返り
リーダブルコードは初めて読んだコードに関しての解説本でした。個人開発をしていた際にも、一読したのですがその時は何を言っているのかさっぱりでした。しかし、実装に関わらせていただきはや1ヶ月少しが経ちまして、もう一度読んでみると奥が深く勉強になることばかりでした!改めてメモがわりに投稿し続けてよかったなと思います!(古い本なので仕方ないですが、できればSwiftで書かれた例題とかあればよかったなと思いました。)
次に読むのは、「いいコード悪いコード」もしくは、「iOSアプリ設計パターン入門」を読みたいなと考えています!iOS関連でおすすめの記事や書籍、サイトがあればぜひご共有していただければ幸いです!
引き続き、学習楽しんでいきましょう!