見出し画像

「抽象度」でオブジェクト指向を考える

  こんにちは。抽象度でオブジェクト指向を考えてみます。

抽象度

  抽象度とは視点です。よく巨視的な視点、微視的な視点と言われますが、抽象度はそういった視点のレベルです。微視的であるほど抽象度が低く、巨視的であるほど抽象度が高くなります。
  また、抽象の対義語は具体です。つまり、抽象度が高い、巨視的な視点であるほど抽象的であり、抽象度が低い、微視的な視点であるほど具体的です。

  基礎研究、応用研究という言葉がありますが、基礎研究では低い抽象度の概念を研究し、応用研究では基礎研究の成果を使って高い抽象度の概念を研究します。高い抽象度の概念は低い抽象度の概念を包含しています。

プログラム

  高級言語と呼ばれるコードは機械の言葉が人間の言葉に翻訳されたものです。よって、人間が簡単にわかるように書かなければなりません。わたしは、コードをあるアプリケーションを表す説明データと考えています。人間用に高級言語で説明された概念をコンパイラが機械語に翻訳し、機械に説明することで機械が仕事をこなします。

クラス

  オブジェクト指向の主な機能にクラスがあります。クラスにメンバ変数とメソッドを定義し、インスタンス化します。クラスにはアクセシビリティがあり、中身を隠蔽することができます。
  では、クラスに抽象度の概念を導入してみましょう。クラスはある一つの概念です。その概念を説明するために、より抽象度の低い要素に分割します。その要素をメンバ変数とし、メソッドに要素間のつながりを表します。メンバ変数はクラスを分割する要素であり、それ以外をメンバ変数にしてはいけません。

  重要なのがメンバ変数をクラスより一つ低い抽象度にそろえることです。人体を細胞のつながりの記述だけで説明することは無謀でしょう。筋肉などの体の部位のつながりを記述してから各部位を説明をするべきです。メンバ変数間の抽象度をばらばらにすると、より高い抽象度のクラスのメンバ変数と低い抽象度のクラスのつながりを記述し、抽象度を無理やり合わせる必要が出てきます。察しの良い人はお分かりかもしれませんが、これはデルメルの法則に抵触します。

  抽象度の高いクラスが抽象度の低いクラスを参照していくことになります。この依存関係はロバート・C・マーチンのCleanArchitectureを守っていることになります。また、抽象度の低いクラスは具体的であるので、DDDでいうバリューオブジェクトやエンティティがそれにあたります。

  クラス間のつながりはより抽象度の高いクラスによって記述されるので基本的に「メディエーターパターン」をとることになります。ここで問題になるのが異なるクラスのメンバ変数間のつながりです。デルメルの法則より、メンバクラス異なるクラスのメンバ変数同士のつながりを記述することはとても難しいことになります。

抽象クラス、インターフェース

  系統発生的進化論を考えると、枠組みを作ってから、その枠組みを実装していく過程で派生、進化していくというトップダウンの開発手法が考えられます。この開発手法だと実装を後回しにできて、かつ、依存性が一方向になるので依存性の逆転をする必要があまりありません。遺伝子において抽象クラスやインターフェースの概念がないので当然です。
  一方で抽象クラス、インターフェースは枠組みの再利用という側面で効果を発揮することができます。抽象クラスは派生することで元の概念の責任を拡張でき、インターフェースは定義と実装を分離することでモジュールの付け替えを容易にします。

結論

  抽象度という観点でオブジェクト指向を考えてみました。「コードは概念を説明するデータである」という視点で見ると、抽象度はオブジェクト指向におけるたった一つのルールであるのかもしれません。

この記事が気に入ったらサポートをしてみませんか?