1年ほど間に Rust で作成した CircleCI API のクライアントツールを久々に見てみたら、色々と直したい箇所があったので、リファクタリングした。 とりあえず、リファクタしてみた箇所は、2箇所。
- API で取得した JSON データを struct でマッピング。
- ビルドのステータスを表すクラスを
enum
にする。
API で取得した JSON データを struct でマッピング
今までは、API で取得した JSON データをそのまま、配列やハッシュとして処理していたが、RustcDecodable
で struct
にマッピングしてみた。
以前のは、値を取り出す際に、unwrap
が多すぎかつ、わかりづらい。。。
リファクタリング開始時は、map
や and_then
などを使用して、unwrap
部分をなくしていこうかとも思ったのだが、struct
にマッピングした方が保守性がいいかなと思い、マッピングするようにした。
作成当初もおそらくマッピングしようとしたのだが、上手くいかず断念したんだと思う。
確かに今回マッピングする際に、CircleCI の API で、ハッシュのキーの部分が動的に変わる箇所があり、若干悩んだが、そこは HashMap
としてマッピングすることにした。(API のハッシュのキーの部分が動的なので、struct の プロパティとして定義できない。)
ビルドのステータスを表すクラスを enum
にする
これも、作成した当初に enum
か struct
で悩んだと思う。多分、ポリモーフィズムの形に持って行きたくて struct
にしたような気がする。(状態が増えた時に、match の分岐に追加したくない。)
でも、今見ると、やっぱり enum
で定義した方が良い気がするので、変更。(上手く説明できないのだが。。。)
match
式を使っていれば、状態が増えたとしても、網羅されていなければコンパイルエラーになるので、良しとする。
所感
JSON データを取り出している部分はだいぶすっきりして、読みやすくなったと思う。
ステータスを enum
にすることにより、コード量も少なくなり、気分的にもスッキリした。
TODO
- API をモック化しテスト出来るようにする。
- Result などを使用して、エラー処理をちゃんとする。