前の関連記事:LibreOffice(9)OpenOffice Developer's Guide日本語版
LibreOffice(7)Pythonマクロ独習の資料を集めるの資料とかOpenOffice Developer's Guideを読んでいますがオブジェクト指向プログラミングが何なのかというのがわからないとなかなか理解が進みません。
オブジェクトは具体的なもの
プログラミングの解説書によく出てくる用語。
変数というのは数学で習ったものと同じ意味。
関数はなにか処理をしてくれるもの。
数字だけ、とか、文字だけ、とか同じ種類のデータの集合が配列。
さまざまな種類のデータの集合が構造体。
関数と変数の集合がクラス、、、
と思っていたのですがこれが間違っていました。
オブジェクト指向プログラミングでは、関数と変数の集合はオブジェクトになります。
でもオブジェクト指向プログラミングではこれ以外のものもオブジェクトになります、、、
その言語における基本的な操作を制限なしに使用できる対象のことであるこの説明が私には一番しっくりきました。
第一級オブジェクト - Wikipedia
要は変数と同じ振る舞いをできるものは全てオブジェクトになります。
具体的に、作ったり、代入したり、足したり、引いたりできるものはオブジェクトです。
変数のことはオブジェクトとはいわないようです。
リテラルじゃないから?(リテラル=コードに直接記述するデータ)
オブジェクト指向プログラミングとはこのようなオブジェクト同士が情報(メッセージ)のやりとりをするような仕組みでプログラミングすることです。
クラスはオブジェクトとは別の抽象的な世界にある
関数と変数の集合がオブジェクトとなるとクラスというのは何を指すのでしょう?
キーワードは、抽象化、です。
関数と変数の集合であるオブジェクトを抽象化したのがクラスです。
クラスを具体化してできたオブジェクトを特にインスタンスといいます。
ということで関数と変数の集合はインスタンスということになります。
現実社会はオブジェクトから成り立っているのでプログラミングするときはまずはオブジェクトを抽象化してクラスを設計します。
プログラムを実行するときはこの抽象化したクラスを具体化してオブジェクト(このオブジェクトを特にインスタンスという)を生成させます。
クラスを使うオブジェクト指向プログラミングをクラスベースオブジェクト指向プログラミングといいます。
クラスは抽象的な世界にありオブジェクトがある具体的な世界とは違う世界にあります。
(上図の「クラス界」と「オブジェクト界」は適当な専門用語がみつからなかったので私が勝手につけたものです。)
このように二つの世界が存在することはいいこともあればよくないこともあります。
クラスは抽象的で定義がはっきりしているので整理統合がしやすいです。
Java:Eclipseでコールグラフ(2)ispaceでコールグラフを作成みたいに自動的に構造を図示できたりしやすいです。
欠点としては二つの世界の対応を保つようにプログラミングをする必要があります。
オブジェクトをあとで追加しようと思うとまずはそれを抽象化してクラスを作ってからオブジェクトに還元するという思考作業が必要になります。
プロトタイプベースオブジェクト指向プログラミング
(2015.8.16追記。この記事の記載内容はかなり大雑把です。プロトタイプベースのJavaScriptについてコードから図を起こしてくれるツールをようやくみつけたので、JavaScriptプロトタイプチェーン(1)プロトタイプチェーン図示ツールでより正確にプロトタイプベースについて書きました。)
クラスからオブジェクトを生成するクラスベースオブジェクト指向プログラミングに対して、クラスを使わずオブジェクトを生成するプロトタイプベースオブジェクト指向プログラミングがあります。
オブジェクト同士が情報(メッセージ)のやりとりをする仕組みでプログラミングする点は、クラスベースでもプロトタイプベースでも全く同じです。
オブジェクト2はオブジェクト1を流用しています。
オブジェクト3はオブジェクト2を流用しています。
オブジェクト2が流用したオブジェクト1の部分をオブジェクト1のプロトタイプといいます。
オブジェクト3が流用したオブジェクト2の部分をオブジェクト2のプロトタイプといいます。
オブジェクト3のオブジェクト1の部分もオブジェクト1のプロトタイプといえます。
オブジェクトを生成するときは単に流用元のオブジェクトのプロトタイプに要素を追加するだけではなく、上書きもできます。
上図のオブジェクト3の一番上の緑の部分がその下のオブジェクト2の青色のプロトタイプの部分に食い込んでいるのはイラストの間違いではなく、その部分を上書きしていることを示しています。
オブジェクト1を変更するとオブジェクト2やオブジェクト3にあるオブジェクト1のプロトタイプの部分も変化します。
このようにプロトタイプベースではすでにあるオブジェクトをプロトタイプとして流用して新たなオブジェクトを生成します。
クラスベースではこのような流用はクラスの世界で行っています。
プロトタイプベースではオブジェクトの世界だけでこのように流用をやってしまいます。
このためプロトタイプベースのオブジェクトでクラスを模倣しやすいのでプロトタイプベースの言語でクラスベースを比較的容易に模倣できます。
これはプロトタイプベースの言語の長所でもあるのですが、初学者にとっては勉強しにくいという短所にもなります。
私もこの記事をまとめるまではプロトタイプベースがクラスベースとどう違うのかがわかっていませんでした。
参考にしたサイト
第一級オブジェクト - Wikipedia
オブジェクトととは?
プロトタイプ・ベースのオブジェクト指向プログラミングを採り入れる
この記事を熟読してオブジェクト指向プログラミングが何かよくわかりました。
Yet Another...: JavaScriptのオブジェクト指向は、逆の順番で学んだほうが理解しやすいと思うので…
プロトタイプベースがクラスベースとは違うことがよくわかります。
Sapporo.jsでJavaScriptの成り立ちについてLTしてきました。 - I am Bad at Math
スライドでJavaScriptの歴史がよくわかります。
Class-Based vs. Prototype-Based Languages - JavaScript | MDN
クラスベース言語とプロトタイプベース言語の比較
定数 (プログラミング) - Wikipedia
リテラル=定数ではなく、ソースコードに直接記述するデータをリテラルと呼ぶ。
0 件のコメント:
コメントを投稿