コードレビューで心がけたいこと
仕事では、チームで開発をしているので、毎日お互いにコードレビューをする機会が多くあります。
しかし、コードレビューはどうしてもレビュワーの技術力や好みに左右される部分があり、私はまだまだ技術的に未熟な部分もあり、質の高いレビューは難しいな〜
と思うことが度々あります。
現在読んでいる最中の本の中に、コード妥当性レビュー観点という内容がありました。
そこでは、7つの設計原理といわれるコード構造上の核心観点のことで、
それをレビュー上での観点として持つことで、レビューの質の安定や向上が図ることが出来るという内容でした。
非常に参考になったので、7つの設計原理について、1から纏めてみたいと思います。
ちなみに、読んでいる本はこれです。
プリンシプル オブ プログラミング3年目までに身につけたい一生役立つ101の原理原則
- 作者: 上田勲
- 出版社/メーカー: 秀和システム
- 発売日: 2016/03/23
- メディア: 単行本
- この商品を含むブログ (11件) を見る
1. 単純原理
単純原理とはシンプルに実装するという原理です。
これだとそのままなので、シンプルとはでイメージしてみたのですが
- ロジックが単純である
- 見通しが良い
- 初心者でも読みやすい(必要以上に複雑でない、基礎的に技術で構成されている)
- 1つのメソッドが長すぎない
とかになると思います。(他にも多々あると思いますが)
ここは実装する上で真っ先に意識する点だと思いますが、
「初心者でも読みやすい」は特に大事にしたいなと思いました。
「メソッドを長くしない」に囚われすぎて、なかなか使うことの無いような
ニッチなメソッドを使ったり、ちょっと凝ったロジックを実装したりとかは無意識のうちにあることなので、意識していきたいなと思いました。
2. 同型原理 3. 対称原理
ここは一緒に説明した方が分かりやすいかなと思ったので、一緒に説明します。
ここは、アプリケーション全体として、
- 同じようなものは、同じように実装する
- 反対のものは、明らかに反対なように実装する
というものでした。
ここは非常に重要だなと思って、
コードを読むときって、ミスが無いようにコードを遡って丁寧に読むことは
大事ですが、同じような実装は同じように実装してあった方が
スピーディーにミスなく読めるからです。
例えば、あるエクスポート処理の実装があったとして、
エクスポート処理の実装は、色々なデータの種類に応じて複数個作る必要がある
としたら、一連の処理が同じ様に実装されていた方が読みやすいですよね。
また、反対なものについてもそうで、
メソッド名でいうとgetの反対はsetで。pushの反対派popで命名するべき
などがあります。
4. 階層原理
これは、処理の階層関係を理解し、整理することが大事だという内容でした。
個人的には一番出来ていなくてハットした原理でした。
階層関係でも十分伝わると思うのですが、
1つのメソッドの中には、同じ抽象度のものを扱う様にする
という様に理解しました。
例えば、基本的にあるデータをDBに保存するまでの処理があったとして、
簡単に考えると、流れとしては
- データをどこからか受け取る
- 保存できる形に整形する
- 保存する
といったような順番になると思います。
この時、1.2.3はそれぞれさらに細かく分けることが出来て
1.データをどこからか受け取る(APIで受け取るとします)
1. リクエスト先のURLを取得する
2. リクエストするときのパラメータを設定
3. 例外処理の対応
4. etc...
などなど、1を達成するために必要なことがさらに複数あります。
で、このときに、これらの詳細な項目と、最初の1.2.3の大項目を
同じ階層で扱わないことが大事になります。
これらは抽象度が違うことなので、完全に分けて実装すべきで、
詳細項目は、大項目の下の階層で扱うべき問題になります。
5. 線形原理
これは処理の流れは直線的であるべきという内容です。
受け取るデータによって、通るべき処理が全く異なってしまう様な実装は非常に複雑なので控えようと思いました。
6. 明証原理 7. 安全原理
ここは1の単純原理とも近しい部分があるのですが、
常に実装は明確になっていて、後にメンテナンスをする技術者が読んでも
確実に理解できる実装を心がけなさいということでした。
また、安全原理に関しては、実装は基本的に常に安全サイドに倒して実装しなさい
という内容でした。
「ここのメソッドはこんなデータを受け取ることは無いだろう」
という安易な予測がバグをうむ原因になることは多々あると思うので、
必要以上な対応は返って複雑性をうむので、加減が大事ですが、
例外処理や、データチェックは念入りに行うに越したことは無いということでした。
基本的にこれらは、自らが実装するときに心がけるべき内容という感じなのですが、
実装する時より、ついつい観点がブレがちなレビューでも、これらを意識してレビュー
することで、今までより安定的、かつ質の高いレビューを心がけたいなと思いました。