mzumi's blog

以前 Rust で作成した CircleCI API クライアントをリファクタリングした

March 22, 2017

1年ほど間に Rust で作成した CircleCI API のクライアントツールを久々に見てみたら、色々と直したい箇所があったので、リファクタリングした。
とりあえず、リファクタしてみた箇所は、2箇所。

API で取得した JSON データを struct でマッピング

今までは、API で取得した JSON データをそのまま、配列やハッシュとして処理していたが、RustcDecodablestruct にマッピングしてみた。
以前のは、値を取り出す際に、unwrap が多すぎかつ、わかりづらい。。。
リファクタリング開始時は、mapand_then などを使用して、unwrap 部分をなくしていこうかとも思ったのだが、struct にマッピングした方が保守性がいいかなと思い、マッピングするようにした。
作成当初もおそらくマッピングしようとしたのだが、上手くいかず断念したんだと思う。
確かに今回マッピングする際に、CircleCI の API で、ハッシュのキーの部分が動的に変わる箇所があり、若干悩んだが、そこは HashMap としてマッピングすることにした。(API のハッシュのキーの部分が動的なので、struct の プロパティとして定義できない。)

ビルドのステータスを表すクラスを enum にする

これも、作成した当初に enumstruct で悩んだと思う。多分、ポリモーフィズムの形に持って行きたくて struct にしたような気がする。(状態が増えた時に、match の分岐に追加したくない。)
でも、今見ると、やっぱり enum で定義した方が良い気がするので、変更。(上手く説明できないのだが。。。)
match 式を使っていれば、状態が増えたとしても、網羅されていなければコンパイルエラーになるので、良しとする。

所感

JSON データを取り出している部分はだいぶすっきりして、読みやすくなったと思う。
ステータスを enum にすることにより、コード量も少なくなり、気分的にもスッキリした。

TODO