Hatena::ブログ(Diary)

Smalltalkのtは小文字です

id:sumim:about

Smalltalk を本格的に勉強する気はないけれど、うんちく程度に知っておきたいなら→Smalltalkをちょっとかじってみたい人のための、チュートリアルまとめ - Qiita

オブジェクト指向の“モヤッと”の正体を知りたくなったらこちらの記事が役に立つかも→id:sumim:20080415:p1 とか id:sumim:20040525:p1


 | 

2008-04-15

[] “オブジェクト指向”の本質


「OO(OOP)とは何か?」については、ネタが割れてしまえばそんなに複雑なものではない…と個人的には最近、考えるようになってきています。

  • リスコフのユーザー定義型(aka、抽象データ型。データと手続きのセット)そのもの、あるいはその「ユーザー定義型」をクラスやそれに準ずる機能で実現しようとするOO(ストラウストラップ。aka、クラス指向。継承を使ったプログラミング)。もしくはそれらを一般化したOO(クック。aka、手続きによる抽象化)。
  • メッセージングにより動的性を実現しようとするOO(ケイ。aka メッセージ指向)
  • 今回登場した、後者のメッセージングのOOのミニマリズムをおしすすめることによって派生的に生じたOO(アンガーとスミスからの 派生 変形。aka、プロトタイプベースOO。フレームとスロット、あとは委譲機構があれば十分…というミニマル化の結果、アンガーとスミスの頃には重要だった“メッセージング”というコンセプトすらそぎ落とされたのは興味深いですね!)。

この三系統のOO、各々の本質を把握できていれば、それらの混成ということで、ほとんどのOOPLの機能や立ち位置、世にはびこる“俺OOP”の中身…はスッキリ説明できるはずです。

http://d.hatena.ne.jp/sumim/20080413/p1#c1208228975

ということで、これら三系統のOOにおけるそれぞれの本質を、ざっくりとですがまとめてみました。前にもなんだか 似たようなこと&今回と矛盾するようなこと を書いたような気がしますが大人の対応をお願いします(^_^;)。

今回は、よりシンプルに「なには無くとも、これだけは欠いてはいけないもの」を。そして何かと話題となっていて、個人的にも最近、理解の整理をつけることができたプロトタイプベースOOも加えてより網羅的に。



▼データ型にこだわるOO

この系統のOOの本質は、とにかく言語のユーザー(プログラマ)が「データ型」を定義できること。その先の、型安全なプログラミングが真の目的です。実装としては、ユーザー定義型を実現するのにクラスやそれに準ずるもの(抽象クラスやインターフェイス)を使うのが主流。継承がないとダメ、とか、手続き(関数、メソッド)は型に内包されないとダメ、とか、情報隠蔽・アクセスコントロールがないとダメ、とか、いろいろと流派があるけれど、それらは(各々の流派にとってはそうだとしても…)総じては“本質”とよべるほどのものではない“おまけ”。とはいえ「郷に入っては郷に従え」。たとえ“おまけ”でも各流派の教えやしきたりにはきちんと従うべきでしょう。



▼メッセージングにこだわるOO

この系統のOOの本質は、プログラムやそれを実行する処理系を含め、世の中のいろんなコトをメッセージングとそれの受け手の振る舞いに置き換えてみよう…という考え方それ自体。その先の、あらゆる切り口で動的なシステムの設計と実現が真の目的です。目的はともかく、メッセージングというお題目自体はパワフルで、意外なものにまで適用できるうえ、たんなる解釈ともとれるので、関係ないところ(たとえば他の二系統のOO)に対する汚染力も最強最悪です(でも、慣れれば排除も簡単w)。実装のバリエーションもいろいろで、主流は仮想関数もどき。動的結合っぽいことができれば、実はなんでもOK? 文法レベルにまでこだわりを持ち込むケースも有りますが、これは“おまけ”で本質ではありません。



▼オブジェクトと委譲のみからなるOO

この系統のOOの本質は、オブジェクトが自由にスロット(データや手続き)を持てること。スロットの追加や削除は、動的(実行時)に行えるにこしたことはありませんが、動的であることそれ自体は本質ではありません。実装上は、「スロット」とそれを束ねた「フレーム」(つまり、オブジェクト)、それとあと、存在しないスロットに対するアクセス時に発動できる「移譲」のための何らかの機構があればすべて事足りる…という考え方。その先の、目的や思想はとくに見えてきません。強いて言えば、シンプリシティを貫くことでの前二者に対するアンチテーゼ…でしょうか。

きむら(K)きむら(K) 2008/04/15 13:53 せんせーしつもんです。

データ型にこだわる〜で、手続きが型に内包される必要性はないとあるんですけど、
内包していない場合にある型とそれに応じた手続き(メソッド)を選択するカラクリが必要ではないかと思うのですがどうでしょうか?

不勉強からくる勘違いだったら平にご容赦(^^;

sumimsumim 2008/04/15 13:58 型を見て分岐すればイイのデス。宗派によってはこれはOOではないと言われます。

sumimsumim 2008/04/15 14:06 あと、分岐の機構を処理系組み込みにして持たせる手もあります。(演算子の)多重定義とか、総称関数とか。

きむら(K)きむら(K) 2008/04/15 15:33 すみません。もうちょっと疑問点を明確にします。
どの分岐を選択するか、という動作はプログラムの書き手が行ってもいいのでしょうか?
ということです。つまり、型とそれに適切に組み合わされるべき手続きの選択をプログラムの書き手に
ゆだねてしまうと、それは非OOPのPascalとかでも可能ですよね。という疑問です。
一応「カラクリ」としてはコメントにあります総称関数とかを考えてました。

って、あれか。以前解説していただいたことのある「OOP『言語』」かどうかと、「OOP」という行為そのものかですね。

sumimsumim 2008/04/15 18:39 そうですね。今回のは、OOPLの要件や“かくあるべし”論ではなく、考え方としてのOOPのつもりです。
「データ型にこだわるOO」は、型が定義できればいいので、ミニマルには C 言語でも実践可能だと思います。

通りすがりの2chネラ通りすがりの2chネラ 2008/05/20 14:47 今回元ネタふったのは私なんで, 謝罪に参りました。ご迷惑をお掛けしたようで申し訳ございませんでした。
根がハード屋なもんで, 個人的には「自分がなにすりゃいいか分かってるもの」にコマンドなりメッセージ送りつけて勝手に動いてくれればオブジェクトなんですけどねぇ。なんで, みんな流儀にこだわるんでしょうか?

sumimsumim 2008/05/20 18:46 いえいえ。「OOとは何か」という話について、何か議論の助けになる情報があれば、さいわいです。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト

コメントを書くには、なぞなぞ認証に回答する必要があります。

 | 
2004 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 08 | 10 | 12 |
2013 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 11 | 12 |
2014 | 01 | 02 | 05 | 07 | 08 | 09 | 10 | 11 |
2015 | 04 | 07 | 08 | 11 | 12 |
2016 | 02 | 03 | 06 | 07 | 08 |
2017 | 04 | 05 |

最近のコメント

1. 06/25 sumim
2. 06/25 山田
3. 08/29 squeaker
4. 08/29 ardbeg1958
5. 10/16 umejava

最近のトラックバック

1. 05/25 プラグインレスでSVGを表示する「SIE」開発ブログ - メッセージをや...
2. 01/30 no_orz_no_life - Erlangとジャンケン
3. 12/31 檜山正幸のキマイラ飼育記 - J言語、だってぇー?
4. 09/04 Twitter / @atsushifx
5. 07/06 みねこあ - オブジェクト指向 と FizzBuzz

この日記のはてなブックマーク数
1673676