いっせいの!!細かなつぶやき

細かなことをぽつぽつと呟いてます

さらに横道に逸れるけどオブジェクト思考ってナニ?って話し

クラスがどうとか継承がどうとかがオブジェクト思考の大原則ではないことは有名になってきたと思う。

私が大学院で研究してきたときは、メソッド呼び出しも本質ではないってのが持論でした。


オブジェクト思考言語においては、「オブジェクトはプロパティという内部情報を持っていて、自分に出来ることも知っていて、つまりはどういう要求が有ったら自分の内部情報をどう変えるか、どのオブジェクトにどんな要求を行うかを知ってる」と言うのが大原則だと思うんだよね。
よって、様々なオブジェクトが互いに適切な要求を出し合って連動するイメージなわけだ。

で、その概念においてコトを複雑にしないためにいくつかのルールがある。

  • オブジェクトの中身は隠蔽されていてよそ様からは見れない。触れない
  • オブジェクトは自分に出来ることは知っている
  • オブジェクトは自分の状態を知っている
  • オブジェクトは自分の状態を変更できるのは自分だけ
  • 他のオブジェクトに何かしてして欲しいときは外から要求する

などなど。

にもかかわらす、ほとんどのOOPLでは、オブジェクトへの要求はメソッド呼び出しやプロパティへの代入で行われる。
呼び出されたメソッドは、一般に呼び出した側のオブジェクトの実行環境で、呼び出した側のタイミングで実行される。
だから(なんらかの理由があって)プロパティへの書き込みを許可してるオブジェクトは隠蔽されてないし、他のオブジェクトからいつのまにかw変更されるし、結果としてその変更を必ずしも自分で把握してるとは限らない。
自分で分からないくらいだから、外部から「前に取得したときから状態変わった?」とか聞かれても答えられない笑

こんな副作用だらけの状態だから、ミュータブルなオブジェクトを減らして基本はイミュータブルにしよう、なんて方向に話が向かうし、しかも完璧な対策にならないw


結局、最初にオブジェクト思考言語を設計したアラン・ケイが正しくて、オブジェクト間の相互干渉はメソッド呼び出しじゃなく、メッセージ通信にするべきなんだと思う。

要求側は相手にメッセージを送るだけで直接相手のメソッドを実行せず、メッセージを受け取った側は自分のタイミングで自分のプロセスなりスレッドで自分の中のメソッドを実行し、そこで発生する自分の状態変化も確実に把握すべきなんだと。


「オブジェクト思考の時代は終わった。これからはイミュータブルな関数言語だ!」と言う人は多いけど、扱うデータ構造がミュータブルだと効果は薄い。
私は敢えて「メソッド呼び出しの時代は終わった!これからはメッセージドリブンの時代だ!」と言いたいww


CPUがマルチコアなったりOSがマルチスレッド化するなど、並行処理が増える中で本質的にミュータブルなオブジェクト思考言語が生き残るには、この種のパラダイムシフトは必須だと思う。