プリンシプルプログラミング プログラミング

【POP77】直交性について〜コードは独立させる〜

はじめに

この記事は「プリンシプルオブプログラミング 3年目までに身につけたい一生役立つ101の原理原則」を読んだ際に記した議事録です。

著作権の関係により、詳細には書きません。詳しい詳細を知りたい方はぜひ本書を読んでみてください。

プリンシプルオブプログラミングをPOPと訳します。

What : コードは独立させよう

「直交」は幾何学において、グラフの座標軸のように直角に交わる二つの線分の性質です。X軸に並行に動かした場合、Y軸の値は変化しません。つまり、X軸の変更をY軸まで何も影響を与えません。

コードにもこの直交性を満たすように利用します。詰まるところコードに「独立性」「分離性」を持たせるようにします。

コードが複数ある時、片方を変更しても他のコードに影響を与えない時、それらは直交的であると言えます。

Why : 直行コードは堅牢だから

直交性のあるコードは以下の二つのメリットを享受することができます。

・生産性の向上

変更が局所化されるため、開発期間とテスト期間を短縮できます。コードの疎結合は再利用性も促進します。

・リスクの軽減

問題発生時にも、所定の箇所を隔離できるのでコードがより堅牢になります。そして依存性の少ないコードはテストを簡単に行えて検証しやすくなります。

How : コードをレイヤー化しよう

今までで散々書いてきましたが、コードは独立させます。結合度を最小化するということです。不要な情報は他のモジュールに公開せず、他のモジュールの実装をあてにしないコードを書きます。

具体的にはコードのレイヤー化が効果的です。Photoshoをしようしたことがある人であればなんとなくわかると思いますが、画像データがレイヤー毎に分離、独立しています。ソフトウェアは画像編集とはに比にならないくらい複雑ですが、Photoshop同様、それぞれが独立した機能を持ったモジュールの協調動作からなるべきです。

さらにレイヤー化はモジュール同士の関係性を整理してくれます。依存関係は指数関数的に複雑性を増していくため、結合度は小さく、機能をレイヤー化することは柔軟なソフトウェアを開発することにおいてとても効果的です。

逆に結合度を最大化させるのは「グローバル・データ」です。初心者が特にやってしまいがち(私がそうだった)な変数をグローバルに設定ししてまうことです。グローバルに設定されたデータは共有している他のコンポーネントと強い結びつきを生んでしまうため、使用しないようにしましょう。

レイヤー化のメリデメ

上記で説明した「機能のレイヤー化」は複雑なソフトウェア開発のシステムを分割するための一つのテクニックです。レイヤー化には以下のようなメリットがあります。

  • レイヤー単体で理解できる。
  • 他のレイヤーに影響を与えずとも、代替案でレイヤーを置き換えられる。
  • レイヤー間の依存関係を最小限にできる。
  • 標準化に適している。
  • 構築されたレイヤーは多くの高水準のサービスがしようすることができる。

以下はデメリットです。

  • レイヤー間で変更が連鎖されることがある。
  • レイヤーを通過するごとにデータ形式を変化する必要があり、パフォーマンスが悪くなることがある。

終わりに

この記事ではプリンシプルオブプログラミング 3年目までに身につけたい一生役立つ101の原理原則の議事録を自分用に記しています。

この記事ではカバーしきれていない部分も多いので、是非本書を手にとって読んでみてください。

次回、「【POP78】可逆性について〜UNDO可能な選択を〜」です。ぜひ、次の記事も読んでみてください。

  • この記事を書いた人
  • 最新記事

ミッチー

小中高と野球漬けの毎日 ▶︎ 大学時に自分が何もできないことに気づき、プログラミング学習開始 ▶︎ PCは疎かったがめげずに継続 ▶︎ 受託で案件を頂きながら、オーダースーツ事業に、通販事業にも参戦 ▶︎ 東証一部Web系自社開発企業にエンジニアとして内定。

-プリンシプルプログラミング, プログラミング

© 2022 オミチャンネル Powered by AFFINGER5