What is it, naokirin?

共通性と可変性について

マルチパラダイムデザインを読んでの共通性・可変性まわりの自分なりのまとめ。読んでから随分と経ってしまったので、多少読み返しながら書いていってます。

あと、マルチパラダイムデザインに直接書いてないことも書き足しています。

新装版 マルチパラダイムデザイン

新装版 マルチパラダイムデザイン

  • 作者: ジェームス・O・コプリン,James O. Coplien,平鍋健児,金沢典子,羽生田栄一
  • 出版社/メーカー: ピアソン桐原
  • 発売日: 2009/12/01
  • メディア: 単行本
  • 購入: 3人 クリック: 41回
  • この商品を含むブログ (6件) を見る

アプリケーションドメイン分析とソリューションドメイン分析

アプリケーションサブドメインとソリューションドメインの構造を組み合わせることで、1つのシステムのサブドメインを構築する。

共通性

通化は再利用可能にすることにより以下を達成するために行う。

  • メンテナンス性の向上
  • 開発コストの削減
  • リソースの削減

一方で、共通化は以下を行うことで達成する。

  • 抽象化
  • 結合/凝集によるソフトウェアの構成

ただし、過度な共通化は目的から逸脱してしまうので行うべきではない。単一責任の原則(責任=変更理由)から、変更理由がない場面において、あえて共通化し可変性をもたせるべきではない。

通化されるものとしては以下が挙げられる。

可変性

可変性には正の可変性と負の可変性がある。

  • 正の可変性: 基の共通性に影響を与えずに何らかを「追加」する
  • 負の可変性: 基の共通性の仮定を「キャンセル」する

パラメータの決定

可変性はパラメータ化することで記述することができる。

可変性を生み出すためのパラメータには、決定(バインディング)のタイミングによって柔軟性と効率のトレードオフが一般的に存在する。またパラメータにデフォルトを設定することで、一部の例外的なパターンに対する可変性を生み出すことができる。

バインディング

バインディングのタイミングは基本的に遅延するほど柔軟性が上がるが、効率は下がる傾向にある

デフォルト

  • 一般的な選択と一部の例外的な選択による可変性を作る
  • 負の可変性を生むパターンあり

C++のソリューションドメイン分析

マルチパラダイムデザインではC++に特化していたので、多少C++以外も想定して書いてみる(とはいえ、千差万別なので逸れ過ぎない程度で)

データ

構造体やビルトイン型、enumなどのデータは以下のような特徴を持つ

  • 構造と振る舞いはソースコード時点で固定される
  • 構造により決定されている各項目の状態のみが変化する
    • const修飾されたものなどは変化しない
  • バインディングは基本的に実行時に行われる
共通性 可変性 バインディング
構造と振る舞い 状態 実行時

第一級関数、関数オブジェクト

関数オブジェクトはデータに近いが、異なる共通性と可変性を持つ

共通性 可変性 バインディング
戻り値型、インターフェース、意味 アルゴリズム、状態 実行時

多重定義

一般的に動的型付き言語では多重定義の機能は存在せず、静的型付きのみとなる。

共通性 可変性 バインディング
名前、戻り値型、意味 アルゴリズム、インターフェース コンパイル

ジェネリクス

ジェネリッククラス

共通性 可変性 バインディング
構造 型や値の詳細 ソースコード時(コンパイル時)

ジェネリック関数・メソッド

共通性 可変性 バインディング
構造 型や値の詳細 ソースコード時(コンパイル時)

継承

共通性 可変性 バインディング
振る舞いとデータ構造 構造とアルゴリズム コンパイル

動的なポリモーフィズム(仮想関数など)

共通性 可変性 バインディング
振る舞いとデータ構造 構造とアルゴリズム 実行時