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 などを使用して、エラー処理をちゃんとする。