kakudooo docs

直交性について

プログラミングにおける直交性という概念について、書籍達人プログラマーを中心に、理解を助ける補助資料を引用しながら整理する。

直交性とは?

直交性というのは数学的な考えで、たとえばグラフを見ると、X 軸と Y 軸が互いに直交しています。ある変数が別の変数に対して影響を及ぼさないことを直交性といいます。X 軸を Y 軸に対して平行に動かしても、グラフ全体の形は変わらないというのが直交性なんです。プログラムにおいては、あるプログラムモジュールが別のプログラムモジュールに対して影響を及ぼさないというのが直交性。

直交性というのはインタフェースのことで、互いにリソースのモジュールをいかに接触面積を小さくするようなものが直交性

書籍よりこの記事の説明が分かりやすかったので引用。

プログラムモジュール間の

を表す概念。

つまり直交させるとは「関係のないもの同士(プログラムモジュール)の影響を排除すること」らしい。

直交するメリット

プログラムモジュール間の依存度が低くなり、変更に強くなる。 → 凝集度の高いモジュールを作ることに繋がる。

「達人プログラマー」では、直交性の高いシステムを構築することのメリットとして、「生産性の向上」と「リスクの削減」が挙げられている。

生産性の向上

リスクの削減

具体例

モジュール化、コンポーネントベース、レイヤー化などは、直交性のあるシステムを設計するプロセスを指している。 直交性のあるシステムにおいては、あるモジュールを変更した場合に影響を受けるモジュールは一つになる(理論的にはそうだが、実際は複数のモジュールに影響を与えてしまうこともある)

レイヤー化による独立性と疎結合の実現を例に考える。

上記のようにすると、下位レイヤーの実装を変更しても、上位レイヤーのコードに影響を与えることがなくなる。

ソフトウェアアーキテクチャの基礎 10.2 層の分離の例

layered

レイヤー化をサポートするには、リクエストの方向以外に対してレイヤーが閉じている必要がある(閉鎖レイヤー)。 たとえば、プレゼンテーション層からのリクエストはビジネス層と永続化層を経由してデータベース層に到達する必要がある。 プレゼンテーション層が永続化層に直接アクセスできてしまうと、永続化層への変更は、ビジネス層とプレゼンテーション層の両方に影響を与えてしまう。

そうなると、コンポーネント間の層が相互依存を持つ密結合なアプリケーションとなり、変更が困難で壊れやすいものになるため、レイヤー化によりモジュール間の独立性と疎結合を担保するアーキテクチャを採用する場合がある。 このように、正しくレイヤー化されたアプリケーションでは、Rails の Action View を他のレイヤーに影響を与えることなく(理論上は)SPA(React.js)などに置き換えることができる。

レイヤー化のデメリットとしては、各層に対しての変更の連鎖、パフォーマンスの低下(レイヤー毎のデータ変換)などがある。

その他のレイヤー化の恩恵を受けている代表的な例は、OSI 参照モデルなどがある。

コーディングにおける直交性の担保

直交性を維持するテクニック

直交性と DRY 原則

DRY 原則と直交性原則は密接に関係しているとのこと。

この2つの原則、概念をうまく組み合わせることで保守性の高いコードを書くことができる。

まとめ

直交させるとは「関係のないもの同士(プログラムモジュール)の影響を排除すること」とあるように、関係のあるものとないものを分類して、関係あるものはまとめ(凝集する)、関係のないものは独立させる(疎結合にする)活動であり、結合度や凝集度をはじめとした、コード品質の指標につながる上位概念であると理解した。

また、DRY 原則と密接に関連する概念ということについては、適用する際に直交性を前提に共通化や抽象化のプロセスを踏むことが大事なのではないかと思った。

参考