この記事はフリュー Advent Calendar 2023の17日目の記事となります。
はじめに
新卒エンジニアとして半年ほど経過した現在までにコードを書く中で、可読性・保守性の観点からレビューで指摘を受けることが多くありました。
そこで、「いったい何を意識して書けばいいのだ?」と思い、一冊の本を紹介いただき、読んでみました。
それが「principle of programming」です。
今回はこちらの書籍を読み、可読性・保守性を考慮するために必要だと感じた、「考え方/原理・原則」を5つ紹介します。
1. パルナスの規則
パルナスの規則とは?
- モジュールの利用者には、そのモジュールを利用するために必要なすべての情報を与え、それ以外の情報は見せない
- モジュールの作成者には、そのモジュールを実装するために必要なすべての情報を与え、それ以外の情報は見せない
つまりどういうことか
あるモジュールに対して、利用者と作成者の立場になって利点を考えます。
利用者
モジュールを使用する際、内部の構造を知らなくても使用できるようにするというのが一文目の利点となります。
必要な情報を与えるだけで使用できるため、複数の場面で効果的に使用でき、再利用性が高いモジュールであると言えます。
作成者
モジュールを作成/変更する際、利用者に影響を与えず実装を入れ替えることができるというのが二文目の利点となります。
他機能への影響を限りなく少なくすることで、修正箇所が限定的となり、変更容易性が高く保守性が高いモジュールであると言えます。
まとめ
パルナスの規則とは、各モジュールの独立性を高くし、再利用性・保守性を高く保つために必要な考え方です。
クラスやオブジェクトがそれぞれの責務を持ち、適切に分割されることで、再利用性・保守性が向上するのです!
2. 単一責任の原則
単一責任の原則とは?
1つのモジュールは1つだけの責任を持たなければならない
つまり、あるモジュールは変更の理由が一つだけであるべきということです。
変更の理由が複数あるということは、責任が複数あると言えます。
1つのモジュールに対し複数の責任を持つ場合、それぞれの責任に変更が加わると他の責任にも影響が及ぶ可能性が高まります。
そうすると、変更容易性が低下し、結果的にコード全体の保守性が低下します。
単一責任の原則を守ることで、柔軟で保守性の高いコードを構築できるということです。
まとめ
実際の業務でコードを書く際も、この単一責任の原則はとても意識する様になりました。
また、研修中は一人でコードを書くことが多かったのですが、再利用性と変更容易性の向上という面では非常に効果を実感できました。
1モジュール1責任を意識して実装することで、他の影響を考慮せず使い回すことができます。
3. ソフトウェアエージング
ソフトウェアエージングとは?
ソフトウェアが時間の経過とともに劣化し、性能が低下する事象
つまりソフトウェアも高齢化するよねという考え方です。
ここで言いたいのは、何も高齢化するコードを無くそうということではありません。
そうではなく、更新し続けることが重要だということです。
また、その更新を予測した柔軟な設計にしておくことも重要となります。
そうすることで、ソフトウェアの高齢化速度を軽減し、健全性を維持できます。
まとめ
私はこの考え方を取り入れ、新規実装を追加する際や、現在ある実装を修正する際、関係するコードをみるタイミングで、今ある実装をリファクタリングすることを意識するようになりました。
これをボーイスカウトの規則とも言います!
来た時よりも美しくということですね。
「この実装こうした方が良くね?」「この実装イマイチやな、今の書き方はこうだ!」と思うことがあれば、どんどんボーイスカウトしていきましょう!
4. オッカムの剃刀
オッカムの剃刀とは?
ある事柄を説明するために、必要以上に多くの前提を仮定するべきでない
オッカムの剃刀は、科学や哲学において使用される一般的な原則のひとつです。
この原則は、同じ現象や事象を説明する複数の仮説や理論がある場合に、最も単純で少数の仮定を用いた説明が最も優れているとする考え方です。
この考え方はコードを書く上でも非常に役立つものとなります。
機能が同一である場合、よりシンプルな(余分なものを含まない)実装にするべきだということです。
そうすることで、読み手の思考負荷が減り、改善しやすいコードとなります。
つまり、可読性がよく保守性が高いコードと言えます。
まとめ
この考え方は、実装方法を決める軸として役立ちます。
実装したい機能に対して、いくつか方法を考え、最終的に実装がよりシンプルとなるものを選択するようにすることで、可読性・保守性を担保できます。
ただ、注意する点として、明確性を考慮する必要があります。
テクニックを駆使して、パフォーマンス(シンプルさ)を少し上げる代わりに、可読性を低下させるようなトレードオフをしてはいけません。
読み手に実装の意図が分かりやすい明確なコードを書くようにしましょう。
そう言った点では、適度にコメント文を追記することも大切であると言えます。
コードを書く際、あくまで読み手はコンピュータでなく人であることを意識すべきです。
5. 階層原理
階層原理とは?
構造が階層であることにこだわる
つまりどういうことか
階層ごとに処理を取り決め、同じ種類の処理が異なる階層間に渡らないようにこだわると言うことです。
構造を階層的に整理することで、読み手が全体を抽象化して理解することができるため、可読性が向上します。
また、変更が発生した場合に、その変更が影響する範囲が限定されるため、保守性も向上します。
まとめ
階層原理を意識することで、可読性・保守性の高いコードを書くことができます。
階層原理を適切にプログラムに適応する方法として、様々なアーキテクチャが存在します。
それぞれのアーキテクチャの特性を理解し、上手く取り入れることで、階層原理に基づいて機能や責務を適切に分離することができます。
最後に
新卒エンジニアとして、コードを書く際に意識すべき「考え方/原理・原則」をまとめてみました。
この記事でまとめたものは、ほんの一部に過ぎません。
ぜひ書籍や他の記事を読んでみることをお勧めします!