セルフレビューを考える
概要
これは、自分で書いたソースコードをレビューすることで、次の効能を期待した “お日記” です。
- ソフトウェアを変更しやすくする効果
- ソフトウェアはソフトであるため、なるべく簡単に変更できなければならない。もしくは捨てやすくなければならないと考えます
- ソフトウェアが価値を提供し続ける効果
- ソフトウェアはあくまでも手段であって、まずは作らずに JTBD(Job-To-Be-Done)とは何か by Ash Maurya - ワイクル株式会社:ブログ - Medium を考えたほうがいいものと考えます
なおプログラミング言語は Ruby を前提としています。
仮説
前述の効能については コードレビューの観点 | google-eng-practices-ja で挙げられている次のレビュー観点が必要と考えます。
出典:コードレビューの観点 | google-eng-practices-ja より抜粋
コードレビューをする際には、次のことを確認してください。
- コードがうまく設計されている
- コードが必要以上に複雑でない
- 開発者は将来必要になるかもしれないものではなく、現在必要だとわかっているものを実装している
- テストがうまく設計されている
- 開発者はあらゆるものに明確な名前を使った
- コメントは明確で有意義なもので、「何」ではなく「なぜ」を説明している
- コードはスタイルガイドに準拠している
以下に各観点の認識と妥当性の確認方法や外部サイトの参考リンクを示します。
コードがうまく設計されている、テストがうまく設計されている
役割や特徴が巨大ではなく、いい感じの期待感に合った責務へ分解されていることがうまい設計と考えます。言い換えるとテストがしやすい設計と言えるでしょう。
- 設計/コードレビューで”常に”心がけるポイント - little hands’ lab
- 関心の分離を意識した名前設計で巨大クラスを爆殺する - Qiita
- 役割駆動設計で巨大クラスを爆殺する - Qiita
- イミュータブルデータモデル - kawasima
コードはスタイルガイドに準拠している
RuboCop などの静的解析ツールを活用することで、スタイルガイドに準拠したプログラムの書き方や、ある程度の読みやすさ、未使用の変数がないことを確認できます。
基本的には静的解析ツールで検出された内容と次の内容を確認すればよいと考えます。
- ホーム > rubytips - komagataのブログ
- 初心者がRailsプロジェクトへの初PRする前に見るチェックリスト - komagataのブログ
- Rubyスクリプトにもmainメソッドを定義するといいかも、という話 - Qiita
- レガシープログラマかどうかを判断する10項目 - give IT a try
- Issue の主旨に合わないコミットは含まれていないこと
- プログラム実行そのものに関係がないデバッグ用の記述がないこと
- 開発時に使用していた冗長なテストコードがないこと
コードが必要以上に複雑でない
必要以上に複雑ではないとは、ソースコードが明確であると考えます。言い換えると疑問や誤解が生じない、行間を読ませないソースコードであると言えるでしょう。
具体的には次の要素を備えたソースコードではないでしょうか。
なお前述の コードはスタイルガイドに準拠している
で挙げた、ある程度の読みやすさとは1メソッドの行数やネスト情報が多くないことと考え、ソースコードの明確さの一部と捉えます。
1. 詳細を読まなくても予測可能なメソッド名や引数、戻り値であること
- テストコードを読んでメソッド名と振る舞いが腹落ちすること
- インターフェースとしていろいろな使い方があると混乱する
- 副作用をおこしていないか
- 余計なことをしていないか
- 驚きを与えていないか
- そのクラスに対する操作で違和感がないか
-
?
がついているのに Boolean 以外を返していないか
2. 必要最小限の可視性を持つメソッドであること
- クラスメソッドであれば必要かも考え、プライベートなインスタンスメソッドでよいかも考える
- 外的要因で上書きされる可能性を排除することで安心できる
- 使う側の気持ちとして知らなくていいものがあればそれを排除する
3. 必要以上に引数でデフォルト式や遅延初期化をしていないこと
- デフォルト式で使い分けを期待しているのであればいいが、そうでないなら混乱する
- 保守する際に必要な記述の判断に迷うので、万が一なら書かない
- やるならエラーを投げるなど親切にしよう
4. コールグラフ が簡潔でコードリーディングを阻害していないこと
- ワンライナーな記述をメソッドにしていないか
- 再帰的な処理が直感的か
5. 凝ったことをしていないこと
- 愚直に書いたほうが誤解のしようがないためわかりやすい
- 使わないブロックは削除しよう
- 使わないブロックパラメータは削除しよう
開発者は将来必要になるかもしれないものではなく、現在必要だとわかっているものを実装している
悲観的、防御的なプログラミングでなく、なるべくイミュータブルな属性で振る舞うことが最小限の実装であると考えます。言い換えると initialize
で初期化された属性がほとんど変わらないオブジェクトが必要最小限の実装と言えるでしょう。
開発者はあらゆるものに明確な名前を使った
明確な名前とは共通認識となる語彙があり、それを適切に名づけることと考えます。正解はないが改善を続けることが重要と言えるでしょう。
- 2021年の「オブジェクト指向」を考える - Zenn
- モデルやメソッドに名前を付けるときは英語の品詞に気をつけよう - Qiita
- [初心者向け] RubyやRailsでリファクタリングに使えそうなイディオムとか便利メソッドとか - Qiita
- 名前重要
- メソッド名や変数名で複数形だと配列もしくは Hash に見えるので、整数などであれば単数形であること
- ローカル変数で作業中のもは work をつけるなどわかりやすくすること
-
is 何
がわかる名前であること
コメントは明確で有意義なもので、「何」ではなく「なぜ」を説明している
コードには How
— Takuto Wada (@t_wada) September 5, 2017
テストコードには What
コミットログには Why
コードコメントには Why not
を書こうという話をした