指向の果て

# はじめに
これはポエム。
適当に文献漁ったので、まとめ。



# オブジェクト指向
観測対象となるモノの状態を、**机上で表現する方法**の１つ。
この概念自体に動作を要求するものではない。
「クラス(種別、分類)」という概念も(あれば便利だけど)必要ない。

### 背景
群を形成するシステムに対して、観測調査や再現調査を行いたい。
既にシステムを構築する以下の2つに対して十分な理解が得られている。

- 要素
    - システムを構築するモノ
    - Yes観測対象
    - いっぱいある
    - 種類もいっぱいある
    - 環境と他の要素との相互作用によってシステムが表出する
- 環境
    - 要素に対して作用するモノ全般
    - No観測対象
    - 簡単な弾道計算であれば古典的な物理法則や射出器等



システムをコンピュータ上でシミュレートする場合、
シミュレーション環境とシミュレーションモデルを
コンピュータでのコードに落とし込む必要がある。

「ライフゲーム」のような極度に単調な要素と環境しか持たない
システムならまだメタ的な落とし込みは可能だが、
相手はもうちょっと複雑だったりしてた。

## 性質の明記
環境に配置された観測対象となる要素(=オブジェクト)の性質を表す事。
表す性質は以下の２つ。これらを合わせて「マルチプルビュー」とか呼ぶ。

- 静的ビュー
    - 要素の性質
    - **クラス**でいうプロパティ
- 動的ビュー
    - 作用によって表出する要素の性質
    - **クラス**でいうメソッド

上記性質を元に、「創発」を起こす性質を持つことがある。
これを「創発特性」と言う。

### 創発特性
主に相互作用や環境作用による、「それ単体で表出しない性質や状態」の事。
創発特性に関しては、Wikipadiaに「創発」の項にある「ライフゲーム」を参照すると理解しやすい。
[Wikipadia - 創発](https://ja.wikipedia.org/wiki/%E5%89%B5%E7%99%BA)


### オブジェクト指向とマルチプルビューの関係
オブジェクト指向におけるマルチプルビューでないドキュメントおよび構想は、
以下の通り「観測に満たない/観測不可能」となる。

- 静的ビューのみ
    - ただの値群
    - 相互作用を起さないため、創発特性を持たない
    - 状態を持つが、観測対象ではない(正確には、これに状態を上書きした要素が観測対象)
    - どちらかというと、設定や状態保存に使う、環境に位置するドキュメント
    - それ静的なデータだよね
- 動的ビューのみ
    - ただのメソッド群、静的クラス
    - 相互作用を起さないため、創発特性を持たない
    - 状態を持たないため、観測不可能
    - どちらかというと環境からの作用メソッドに使う、環境に位置するドキュメント
    - それ静的なクラス指向だよね


オブジェクト指向の大前提である「机上における観測対象の表現方法」という点では、
対象がマルチプルビューであればオブジェクト指向と言える。

ただし、「インスタンスが作成不可能」「無意味な静的ビュー/動的ビュー」等の
観測可能性や観測意義が危ぶまれる場合は、
オブジェクト指向ではなく、インターフェイス指向やクラス指向等、
他の指向に準ずる考えられる。



# ご利用方法
基本的にオブジェクト指向は**表現の方法**のため、
実用という面では「理解しやすい」以外のモノはない。
また、コンピュータに読み込ませて動かすことも考慮していない。
ただの設計書。マルチプルビュー。

ここから必要になるのは、オブジェクト指向で書かれたドキュメントを
プログラムとして組み込む**オブジェクト指向プログラミング**を行うことです。

ここで便利な**シンタックス(構文表現)**がでてきました。
クラスやらインスタンスやらカプセル化やら継承やらなんやらが出てきます。
これを使うとオブジェクト指向プログラミングが楽になります。

しかし、これらはあくまでもオブジェクト指向で書かれたドキュメントを、
プログラムのコードに簡潔に落とし込むのに使**った**シンタックスの**1つ**で、
これそのものや、これを使用したコードがオブジェクト指向**というわけではない**です。
(javascriptもES2015より前ではclassがなかったので、functionを利用してたりする。)


- オブジェクト指向：表現方法および、マルチプルビューに則ったドキュメントや構想のこと
- オブジェクト指向プログラミング：上記ドキュメントや構想を元にプログラミングする
    - 言語がサポートしているシンタックスは関係なし
    - あるシンタックスを用いることでより簡潔にコードに落とし込めるようになるだけ

## クラス指向プログラミング
クラス(分類)をプログラミング(コードに落とし込む)すること全般を言います。
親クラスとか継承とかあります。
これも便利なシンタックスがありまして、classですね。

ここで大事なのは、どのように**クラス(分類)分けするか**は、
完全にそのシステム依存というところです。
（is has 議論とかいうオブジェクト指向**全く関係ない話**もここら辺）

ここら辺は現在大変にバズっており、
クラス指向に関する作法(is has 分類の切り口 等)や、
クラス指向プログラミングの実用記事もあるので省略。

## Q. オブジェクト指向とクラス指向は何が違うのか
A. 指向(関心)が違う。

ただし、クラス指向も地味に2種類あり、
純粋なクラス指向(機能の分類、静的クラス)と、
オブジェクト指向の拡張としてのクラス指向(動的クラス)がある。
現行ではオブジェクト指向の拡張の方が主流。

- オブジェクト指向：インスタンスやシステムの状態に関心
- クラス指向(静的)：システムから見た機能の分類に関心
- クラス指向(動的)：オブジェクトの分類、親子関係、カプセル化、継承等に関心

## Q. オブジェクト指向とクラス指向は共存可能か
A. 可能。ただしオブジェクト指向優先という条件がある。

クラス指向優先での機能分類を行うと、
オブジェクト指向における機能の単純化が阻まれる事が**容易に**起こるため、
基本的にはオブジェクト指向を元に、分類分け(クラス指向)をすることになる。

- オブジェクト指向：インスタンスレベルのクラスとなる部分
- クラス指向：インスタンスを含むクラス周り全般の分類

ちなみに静的なクラス指向(機能の分類)に失敗すると、神クラスが出来上がる。


# 他にもいろいろな指向

## インターフェイス指向
オブジェクト指向の拡張としてのクラス指向に対して、
さらに制約をかけるものとして扱われる。
契約と言われている。
流儀としては、クラス指向。

## メッセージ指向
オブジェクト同士の相互作用に関心を寄せたもの。
オブジェクト自体は、オブジェクト指向によって作成される事前提であり、
その上でメッセージ指向でオブジェクト同士を結びつけるという発想。
このオブジェクトの相互作用におけるやりとりを「メッセージ」と表している。

オブジェクトに関しては利用しているだけで、
あくまでもメッセージをどうするかに関心がある。
本質的にはオブジェクト指向ではなく、切り分けが必要である。


# おわりに
オブジェクトを作っているのか、

機能の分類をしているのか、

オブジェクトの分類をしているのか、

オブジェクトの動作の契約をしているのか、

オブジェクト同士のメッセージ処理周りを作っているのか、

そんなこと考えても、旨味なんてなかった。