<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>オブジェクト指向</title><link>http://blogs.wankuma.com/alf/category/2016.aspx</link><description>オブジェクト指向</description><managingEditor>あるふ</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>あるふ</dc:creator><title>継承について</title><link>http://blogs.wankuma.com/alf/archive/2009/03/12/169547.aspx</link><pubDate>Thu, 12 Mar 2009 02:25:00 GMT</pubDate><guid>http://blogs.wankuma.com/alf/archive/2009/03/12/169547.aspx</guid><wfw:comment>http://blogs.wankuma.com/alf/comments/169547.aspx</wfw:comment><comments>http://blogs.wankuma.com/alf/archive/2009/03/12/169547.aspx#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://blogs.wankuma.com/alf/comments/commentRss/169547.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/alf/services/trackbacks/169547.aspx</trackback:ping><description>&lt;p&gt;継承(+委譲)について考えていきます  &lt;p&gt;今回は、継承についての最初ということで、継承について現在私が考えているもの、これから求めていこうと思うものをざっくり出します&lt;br&gt;各項目の詳細な説明は次回以降ということにします。&lt;br&gt;(一応最低限の情報は載せるので実際にやるかどうかは気分しだいということで)&lt;br&gt;最近数学を見だしたばかりなので、数学用語等間違いがあれば主旨を変えない程度に変更する可能性は高いです  &lt;p&gt;&amp;nbsp; &lt;p&gt;#1, 単一継承は多重継承の一形態ではないか&lt;br&gt;class C : public A, public B{}; //AとBを多重継承したC&lt;br&gt;class C : public A{}; //Aと無名の型を多重継承したC = 単一継承  &lt;p&gt;//class C : public A, public 無名の型{/*中身は空*/}; //単一継承は←と同じと考える。Cは何も継承しなければ空集合とする  &lt;p&gt;&amp;nbsp; &lt;p&gt;#2, 継承に使える要素&lt;br&gt;継承という仕組みに使えるのは集合のみだとします。(なぜかは、まだよくわからない)&lt;br&gt;これ以降、集合の特性を使います。&lt;br&gt;最も重要な特性は、"全ての集合は、ある条件を持つ"ということです&lt;br&gt;この条件のことを以後制約と呼びます  &lt;p&gt;&amp;nbsp; &lt;p&gt;#3, 階層構造&amp;lt;--&amp;gt;制約 の変形&lt;br&gt;継承は、階層構造を持ちますが、これがどうにも扱いにくかったので制約の形に置き換えます&lt;br&gt;(相対パス(階層)&amp;lt;--&amp;gt;絶対パス(制約)のイメージ。継承で扱う階層は全て包含だとします)  &lt;p&gt;ここに、ある集合の包含階層&amp;nbsp; A-&amp;gt;B-&amp;gt;C があるとします  &lt;p&gt;これを制約表記(私の独自用語：おそらく何か専門用語があるはず)に置き換えます。(単に積集合を適用します)&lt;br&gt;$A ： Aの制約を持つ = A&amp;nbsp;&amp;nbsp;&amp;nbsp; = $Aの制約&lt;br&gt;$B ： Aの制約とBの制約を持つ = A かつ B&amp;nbsp; = $Bの制約&lt;br&gt;$C ： Aの制約とBの制約とCの制約を持つ = A かつ B かつ C = $Cの制約  &lt;p&gt;包含階層のAとCは階層が違うため演算ができません。&lt;br&gt;A-&amp;gt;B-&amp;gt;CにおけるCの制約は(A かつ B かつ C)であって、Cの制約は必要条件に過ぎないため、&lt;br&gt;Cの制約だけではCであることを表せず、AとCを同一の空間で扱うことができません  &lt;p&gt;$A,$B,$Cなら、階層を気にせず扱うことができます  &lt;p&gt;&amp;nbsp; &lt;p&gt;#4, Aであること及び、AかつBをオブジェクト指向に適用してみる&lt;br&gt;@1, Aならば、A'という必須なインターフェースを持つ&lt;br&gt;@2, Bならば、B'という必須なインターフェースを持つ  &lt;p&gt;@3, Aならば、A''という(インターフェース以外の全ての)制約を満たす&lt;br&gt;@4, Bならば、B''という(インターフェース以外の全ての)制約を満たす  &lt;p&gt;@1,@2,@3,@4が真のとき、&lt;br&gt;@5(AかつB)ならば (A'のインターフェースを持つ かつ B'のインターフェースをもつ)が真&lt;br&gt;@6(AかつB)ならば (A''の制約を満たす かつ B''の制約を満たす)が真&lt;br&gt;ここまではOKなのですが、次はどうでしょうか。  &lt;p&gt;@7(A'のインターフェースを持つ かつ B'のインターフェースをもつ)ならば(AかつB) が真？？？&lt;br&gt;逆は必ずしも真ならずであり、@7は必ずしも真ではありません  &lt;p&gt;@7は、@1,@2があってもなくても関係ないとき、つまりA'',B''が恒真のときのみ真です  &lt;p&gt;@1も@3もAの必要条件です。&lt;br&gt;わざわざ分けたのは、プログラム言語がそうしていることが多いというだけです。&lt;br&gt;@1と@3をあわせると、"Aであるための全ての制約"と呼べます。&lt;br&gt;要はAであるための必要十分条件です  &lt;p&gt;&amp;nbsp; &lt;p&gt;#5, 項目#4の、@1と@3の違い&lt;br&gt;インターフェースは、集合を分割する基準を持つことを表すことはできますが&lt;br&gt;分割された集合を選択することができません  &lt;p&gt;例えば"赤色のもの"という型を作りたい時&lt;br&gt;X:"赤色かどうかという関数を持つ集合"と、Y:"赤色であるという集合"は同じ集合ではありません&lt;br&gt;X=赤い集合+赤くない集合 (赤色が何かということは知っている)&lt;br&gt;Y=赤い集合 (赤色が何かということは知っている)  &lt;p&gt;制約という表現で言い換えると、&lt;br&gt;X=赤色かどうかという関数を持つという制約 という一つの制約を持つ集合&lt;br&gt;Y=赤色かどうかという関数を持つという制約と、赤色であるという制約という二つの制約を持つ集合  &lt;p&gt;"赤色のもの"という型を作りたい時は、当然(XかYかでいえば)Yでなければいけません。  &lt;p&gt;&amp;nbsp; &lt;p&gt;#6, AかつBとは、実装多重継承である&lt;br&gt;AとBが完全に別な時(独立している時？)、AかつBは実装多重継承を表します&lt;br&gt;しかし、現在のオブジェクト指向による継承の仕組みでは、インターフェースによる制約にしか対応していません。&lt;br&gt;だからインターフェース以外に制約があった時、現在のオブジェクト指向では実装多重継承は、&lt;br&gt;継承により必要な制約を引き継げないので、うまくいかないことが多いという予測が立ちます  &lt;p&gt;項目#1より、単一継承は多重継承の特殊な形と考えた時、この問題は単一継承でも起こるはずです。  &lt;p&gt;&amp;nbsp; &lt;p&gt;#7, インターフェース継承とは、AもしくはBの(IF以外の制約が)恒真のときのAかつBである&lt;br&gt;(c.制約 = (A.制約 &amp;amp;&amp;amp; true))&lt;br&gt;オブジェクト指向言語によるインターフェースは実装のない関数を指します。&lt;br&gt;インターフェース以外の制約が恒真であることは、この実装のない関数、インターフェース継承で表すことができます  &lt;p&gt;現在のオブジェクト指向ではこの"片側が恒真"という場合に必要なものを全てもっているので、&lt;br&gt;インターフェース継承はうまくいくことが多いと予測できます  &lt;p&gt;&amp;nbsp; &lt;p&gt;#8, Aの全ての制約とBの全ての制約が同じ時、つまりAかつAの時はどうか&lt;br&gt;俗にis-aと呼ばれているものです。リスコフの置換原則も同じですかね？&lt;br&gt;現在のオブジェクト指向ではインターフェースは全て引き継がれるので、&lt;br&gt;おそらくインターフェース以外の全ての制約が同じであることをさしているのだと思います  &lt;p&gt;Aが真のとき、AかつAは真になりますから、理屈としては正しいです  &lt;p&gt;問題は、現在のオブジェクト指向(だけ)でこれを守るのは現実的に不可能であるということです&lt;br&gt;AとBがずれた時に検知する仕組みがないこと、そもそもAであることを示せないことが原因です  &lt;p&gt;&amp;nbsp; &lt;p&gt;#9, Aの必要十分条件&lt;br&gt;オブジェクト指向では、Aの制約を表すことができません&lt;br&gt;ではここで仮に、Aという集合の制約をXとおいてみます  &lt;p&gt;制約に含まれるものは全て、条件を満たすか満たさないかの2値、boolで表すことができます&lt;br&gt;条件がどれだけあっても、それらを全て積で重ね合わせれば、たった一つのboolとして表すことができます  &lt;p&gt;Aという集合の制約Xは、一つのbool変数としておくことができます&lt;br&gt;全ての(少なくとも継承の可能な)要素は、一つのbool変数を持たなければいけません  &lt;p&gt;bool変数とboolを返す関数は(多分数学的に)同等なので、boolを返す関数をおきましょう  &lt;p&gt;オブジェクトがこの特殊な意味を持った boolを返す関数を含むのであれば、&lt;br&gt;インターフェースだけで "あるオブジェクトである"ということを示すことができます  &lt;p&gt;Aであることが表すことができるようになれば、AかつBを表すことができるようになります&lt;br&gt;つまり、この仕組みを使えば、実装継承が可能になるはずです  &lt;p&gt;&amp;nbsp; &lt;p&gt;うーーん。&lt;br&gt;まあそもそも全ての集合は、集合の条件をもつので、クラスを集合としておくのであれば、&lt;br&gt;全てのクラスはクラス(集合)の条件を表すboolを返す関数(もしくは同等の何か)を持たなければいけない、とするだけでも十分なのかもしれません。 &lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/alf/aggbug/169547.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あるふ</dc:creator><title>視点と命題</title><link>http://blogs.wankuma.com/alf/archive/2009/02/16/168199.aspx</link><pubDate>Mon, 16 Feb 2009 03:27:00 GMT</pubDate><guid>http://blogs.wankuma.com/alf/archive/2009/02/16/168199.aspx</guid><wfw:comment>http://blogs.wankuma.com/alf/comments/168199.aspx</wfw:comment><comments>http://blogs.wankuma.com/alf/archive/2009/02/16/168199.aspx#Feedback</comments><slash:comments>30</slash:comments><wfw:commentRss>http://blogs.wankuma.com/alf/comments/commentRss/168199.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/alf/services/trackbacks/168199.aspx</trackback:ping><description>&lt;p&gt;ずっとblogについて考えつつネットを見ていたら、ハッと閃きました  &lt;p&gt;今まで定義とかオブジェクトと私が呼んでいたものは、数学用語の「命題」でした&lt;br&gt;wiki等の説明を読む限り、私のイメージと完全に一致します&amp;nbsp;&amp;nbsp; &lt;p&gt;ソフトウエア、もしくは任意のスコープを一つの公理系としたとき&lt;br&gt;そのスコープ内にあるものは全て命題として扱うことができます&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;wikiの内容を超えるところがあるので、もう少し詳細をだします。&lt;br&gt;そもそも命題とは何かというと、真偽値をもつ明確な文です。  &lt;p&gt;・私の身長は160cm以上である&lt;br&gt;これは意味的に不明瞭なところがみあたらないので命題  &lt;p&gt;・彼は偉人である&lt;br&gt;これは偉人の定義が不明瞭なので命題ではない  &lt;p&gt;&amp;nbsp; &lt;p&gt;さて。&lt;br&gt;ではここで、ほとんど全ての文を命題に変えてしまえる魔法のようなテクニックを紹介しましょう。&lt;br&gt;それは、「全ての単語の前に&amp;lt;&amp;lt;○○にとっての&amp;gt;&amp;gt;と付け加える」ことです。(より正確に言うなら、それを行った全ての用語の定義も必要。そのスコープ内で一つの用語には一つの定義しかないという前提も必要)  &lt;p&gt;&amp;nbsp; &lt;p&gt;先ほど命題ではない例として出した「彼は偉人である」を命題に変えてみましょう&lt;br&gt;そのためには誰かが必要なので、A君を出してみます。&lt;br&gt;・A君にとっての彼はA君にとっての偉人である。&lt;br&gt;これで命題になりました。  &lt;p&gt;&amp;nbsp; &lt;p&gt;他にもいくつか作ってみましょうか。&lt;br&gt;「富士山は美しい」は命題ではないが、「A君にとっての富士山はA君にとっての美しいです」は、命題です。&lt;br&gt;「5000は大きい」は命題ではないが、「A君にとっての5000はA君にとっての大きいです」は命題です  &lt;p&gt;&amp;nbsp; &lt;p&gt;この&amp;lt;&amp;lt;○○にとっての&amp;gt;&amp;gt;と付け加えた上で、その用語を定義する技法を&lt;br&gt;抽象化と呼びます。・・呼べるはずです。  &lt;p&gt;ありとあらゆる全ての抽象化でこの技法が使われています&lt;br&gt;映画しかり、小説しかり。人もそうですね。&lt;/p&gt; &lt;p&gt;&lt;br&gt;そして数学でもそうです。 &lt;/p&gt; &lt;p&gt;数学では、実は必ず公理系を選択しなければいけません。公理系が選択されていなければ全ての文は命題となりません。&lt;br&gt;ある公理系Cでは、AはBである。&lt;br&gt;これは命題です。  &lt;p&gt;(公理系が不明な時、) AはBである。&lt;br&gt;このように、公理系を選択しない文は、命題ではありません  &lt;p&gt;&amp;nbsp; &lt;p&gt;ソフトウエアを独自の公理系と考えます。公理系という言葉になじみがあまりないので、以後視点と呼びます&lt;br&gt;ソフトウエア内部にあるものはすべて"そのソフトウエアにとっての○○"です&lt;br&gt;そのソフトウエアにとっての○○の定義は、プログラムのソースとして全て存在するはずです&lt;br&gt;だからソフトウエアは、命題という形で全てをあらわすことが可能だと思います&lt;br&gt;(もし一部例外が出たばあいは、命題として扱えるものだけを対象とする、と変更するかもしれません。まだそこまで考えが固まっていません)&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/alf/aggbug/168199.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あるふ</dc:creator><title>ダックテストを考える3 オブジェクトの正当性</title><link>http://blogs.wankuma.com/alf/archive/2009/01/20/166496.aspx</link><pubDate>Tue, 20 Jan 2009 01:42:00 GMT</pubDate><guid>http://blogs.wankuma.com/alf/archive/2009/01/20/166496.aspx</guid><wfw:comment>http://blogs.wankuma.com/alf/comments/166496.aspx</wfw:comment><comments>http://blogs.wankuma.com/alf/archive/2009/01/20/166496.aspx#Feedback</comments><slash:comments>52</slash:comments><wfw:commentRss>http://blogs.wankuma.com/alf/comments/commentRss/166496.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/alf/services/trackbacks/166496.aspx</trackback:ping><description>&lt;p&gt;もう一度ダックテストでいきます  &lt;p&gt;用語の説明は次のものです&lt;br&gt;ある鳥が鴨のように見え、鴨のように泳ぎ、鴨のように鳴くならば、それはたぶん鴨である。  &lt;p&gt;&amp;nbsp; &lt;p&gt;この例では、鳥を見ている人が、"鴨のように泳ぐことができる"、"鴨のように鳴くことができる"&lt;br&gt;という少なくとも2つ以上の条件が同時に成立することを定義としていることがわかります  &lt;p&gt;複数の条件が同時に成立するかどうかを判定することは、多分原理的？(もしくは計測的？現実的？)に不可能です。&lt;br&gt;同時に観測することが不可能である点と、同時に判定することが不可能であるという点において。  &lt;p&gt;これを解決する方法は今のところ一つしか思いつきません&lt;br&gt;ある条件を確認した後、その結果がある期間において変化しないと決め付けてしまうという方法です。&lt;br&gt;こうすれば、どれだけ条件がたくさんあっても、ある期間内であれば判定が可能になります  &lt;p&gt;期間は、時間つまりタイムアウト付きとしてもいいし、何かのトリガーで寿命としてもいいですね  &lt;p&gt;&amp;nbsp; &lt;p&gt;そういったものを何というかというと ・・ 要は変数/状態です&lt;br&gt;複数の条件を同時に満たすことが求められる時、変数が必要になります&lt;br&gt;条件は全て、満たすか満たさないかの2値、つまりbool変数として表すことができます  &lt;p&gt;オブジェクトの条件、ダックテストで使用した&lt;br&gt;XXができることを条件とする、もしくはXXができないことを条件とする、&lt;br&gt;といった条件もbool値とその評価の組み合わせとしてとれます  &lt;p&gt;オブジェクトが正しい状態というのがどういう状態かというのを表明できます&lt;br&gt;オブジェクトは正しい状態と正しくない状態の2値、つまりbool値となれるので、&lt;br&gt;オブジェクトが他のオブジェクトの条件の一つとなることも可能になります  &lt;p&gt;&amp;nbsp; &lt;p&gt;総括すると、ダックテストはある種の状態制御を含む概念である、ということです&lt;br&gt;オブジェクトの正当性とはつまり状態の値かつ定義です。&lt;br&gt;正しい状態の値(の範囲)を定義に含むことをサポートしなければいけません  &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;状態の値を含んだ定義というのは実に普通のことです  &lt;p&gt;ある会社の採用条件として、TOEIC600点以上の人が必要だとしましょう&lt;br&gt;ダックタイピングでは"TOEICの点を持つかもしれない人"程度の定義でしか表現できません&lt;br&gt;ダックテストでは"TOEIC600点以上を持つ人"という状態の値を含んだ定義が使えます  &lt;p&gt;状態の値を含んだ定義の例はいくらでもあげることができます&lt;br&gt;元気な犬/病気の犬 (健康というパラメータの値)&lt;br&gt;黒色のもの/灰色のもの (明度という状態の値)&lt;br&gt;きれいな机/汚い机 (整頓度？)  &lt;p&gt;例えばあなたは、"きれいな机"を見つけることができます&lt;br&gt;"机"をみつけてきれいかどうかを見るのではなく、"きれいな机"を直接見つけられるはずです&lt;br&gt;それはあなたが、あなたの頭の中で状態の値を含んだ定義を作成できるからです  &lt;p&gt;&amp;nbsp; &lt;p&gt;状態の値を定義に含むことを、人間(の認知)はサポートしています&lt;br&gt;抽象化もサポートしています&lt;br&gt;ダックテストもサポートしています&lt;br&gt;実はソフトウエア(=実行ファイル=プログラム)もサポートしています  &lt;p&gt;それらから作られたはずの、今のオブジェクト指向プログラミング(の解説)と今のダックタイピングはサポートしていません&lt;br&gt;これは問題であり、状態の値を定義に含むことをサポートすべきだと私は考えます  &lt;img src ="http://blogs.wankuma.com/alf/aggbug/166496.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あるふ</dc:creator><title>ダックテストを考える2</title><link>http://blogs.wankuma.com/alf/archive/2009/01/07/165769.aspx</link><pubDate>Wed, 07 Jan 2009 03:18:00 GMT</pubDate><guid>http://blogs.wankuma.com/alf/archive/2009/01/07/165769.aspx</guid><wfw:comment>http://blogs.wankuma.com/alf/comments/165769.aspx</wfw:comment><comments>http://blogs.wankuma.com/alf/archive/2009/01/07/165769.aspx#Feedback</comments><slash:comments>21</slash:comments><wfw:commentRss>http://blogs.wankuma.com/alf/comments/commentRss/165769.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/alf/services/trackbacks/165769.aspx</trackback:ping><description>&lt;p&gt;今回は、ダックテストにおいて誰が"鴨の基準"を持つのかを考えて見ます  &lt;p&gt;&amp;nbsp; &lt;p&gt;ダックテストの用語説明は次のものです&lt;br&gt;ある鳥が鴨のように見え、鴨のように泳ぎ、鴨のように鳴くならば、それはたぶん鴨である。  &lt;p&gt;&amp;nbsp; &lt;p&gt;ここでは一見登場人物？は鳥だけに見えますが、違います&lt;br&gt;登場人物？は"鳥"と"鳥を見る人"ですね。今回はこれに加えて、"第三者"も加えてみます  &lt;p&gt;&amp;nbsp; &lt;p&gt;#1.複数の人が鴨を見れば、複数の鴨の基準ができる。&lt;br&gt;鳥を見る人にとって、鴨のように見え、鴨のように泳ぎ、鴨のように鳴くものが鴨です。&lt;br&gt;しかし、第三者にとってはどうでしょう。&lt;br&gt;例えば第三者が鴨料理屋に来た客としましょう。&lt;br&gt;第三者にとっては、鴨の味がするものを鴨とみなすでしょう？  &lt;p&gt;おそらく、鳥を見る人と第三者(客)では、鴨一つの単位も違うはずです。&lt;br&gt;鳥を見る人にとっての鴨は、一つとは一匹のことで、第三者にとっては一切れをさすでしょう。  &lt;p&gt;何を持って鴨とするかは、鴨(らしきもの)自身を見ても全くわからない、ということです  &lt;p&gt;&amp;nbsp; &lt;p&gt;#2.鳥を見る人は、(生物学的な)鴨じゃないものを鴨とみなすことができるし、(生物学的な)鴨を鴨でないとみなすことができる。&lt;br&gt;ダックテストにおいて、生物学的というのは単に視点の一つにすぎません&lt;br&gt;鳥を見る人が生物学的視点を採用してもいいししなくてもいいです。&lt;br&gt;実際ダックテストでは生物学的基準は含んでいませんね&lt;br&gt;精巧にできたロボット鴨なら、鳥を見る人が鴨と判断しても何の不思議もありません  &lt;p&gt;鳥を見る人にとっての鴨が何かを知らない第三者にとってみれば、&lt;br&gt;ありとあらゆる全てのものが、鳥を見る人にとっての鴨となりえてしまいます。  &lt;p&gt;鳥を見る人にとっての鴨の基準がわからない限り、鳥を見る人にとっての鴨を見つけることはできません。  &lt;p&gt;&amp;nbsp; &lt;p&gt;#3.鳥を見る人は、鴨か鴨でないかの判断ができる&lt;br&gt;&amp;gt;それはたぶん鴨である。&lt;br&gt;とあるように、鳥を見る人は何かを鴨かどうか判断することができなければいけません&lt;br&gt;鴨自身が基準をもてない以上、鳥を見る人が鴨の基準を持つのは自明でしょう。 &lt;/p&gt; &lt;p&gt;つまり鳥を見る人は、認識可能な全てのものを鴨の集合と鴨でない集合に分けることができます &lt;/p&gt; &lt;p&gt;&amp;nbsp; &lt;p&gt;鳥を見る人を実行ファイルとしてみたとき、&lt;br&gt;鴨オブジェクトは鳥を見る人の中に生成されます。(鴨オブジェクトを通して外部の鴨を探す)&lt;br&gt;この鴨オブジェクトの基準は誰が持つべきでしょうか。  &lt;p&gt;鴨オブジェクト自身、というのが妥当な解の一つです。&lt;br&gt;(鳥を見る人の中であれば鴨オブジェクト外でもよい)  &lt;p&gt;&amp;nbsp; &lt;p&gt;ここでいう基準とは、オブジェクトが成立するために"必須な"条件です。&lt;br&gt;オブジェクトは、必須でない特長も持つことがあります  &lt;p&gt;A.ある鳥が鴨のように見えるならば、それはたぶん鴨である。鴨は鴨のように泳いだり、鴨のように鳴くことがある。&lt;br&gt;B.ある鳥が鴨のように見え、鴨のように泳ぐならば、それはたぶん鴨である。鴨は鴨のように鳴くことがある。&lt;br&gt;C.ある鳥が鴨のように見え、鴨のように鳴くならば、それはたぶん鴨である。鴨は鴨のように泳ぐことがある。&lt;br&gt;D.ある鳥が鴨のように見え、鴨のように泳ぎ、鴨のように鳴くならば、それはたぶん鴨である。  &lt;p&gt;A,B,C,Dは明らかに違う基準を持った鴨ですが、インターフェースのみに注目すると、同じになってしまいます  &lt;p&gt;class 鴨{&lt;br&gt;public:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 鴨のように見える();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 鴨のように泳ぐ();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 鴨のように鳴く();&lt;br&gt;};  &lt;p&gt;A,B,C,Dを明確に区別するためには、インターフェースだけではなく、各インターフェースに対して&lt;br&gt;成功することが条件なのか、失敗することが条件なのか、成功/失敗は関係ないのか等の、&lt;br&gt;重み付けが必要です。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/alf/aggbug/165769.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あるふ</dc:creator><title>ダックテストを考える</title><link>http://blogs.wankuma.com/alf/archive/2008/12/26/164961.aspx</link><pubDate>Fri, 26 Dec 2008 08:20:00 GMT</pubDate><guid>http://blogs.wankuma.com/alf/archive/2008/12/26/164961.aspx</guid><wfw:comment>http://blogs.wankuma.com/alf/comments/164961.aspx</wfw:comment><comments>http://blogs.wankuma.com/alf/archive/2008/12/26/164961.aspx#Feedback</comments><slash:comments>46</slash:comments><wfw:commentRss>http://blogs.wankuma.com/alf/comments/commentRss/164961.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/alf/services/trackbacks/164961.aspx</trackback:ping><description>&lt;p&gt;ダックタイピングの元になった、ダックテストを考えて見ます。  &lt;p&gt;&amp;nbsp; &lt;p&gt;用語の説明は次のものです&lt;br&gt;ある鳥が鴨のように見え、鴨のように泳ぎ、鴨のように鳴くならば、それはたぶん鴨である。  &lt;p&gt;では、鴨、剥製の鴨を、ダックテストに通してみましょう。&lt;br&gt;鴨は、鴨のように見え、鴨のように泳ぎ、鴨のように鳴くので、鴨であると判断できます。&lt;br&gt;剥製の鴨は、鴨のように見えますが、鴨のように泳げず、鴨のように鳴かないので、鴨ではありません(もしくは、鴨であるとは限らない)  &lt;p&gt;&amp;nbsp; &lt;p&gt;鴨である条件は、次の3つですね。&lt;br&gt;・鴨のように見える&lt;br&gt;・鴨のように泳げる&lt;br&gt;・鴨のように鳴ける  &lt;p&gt;この3つの条件を全て満たす時、鴨とみなす。これがダックテストとします  &lt;p&gt;&amp;nbsp; &lt;p&gt;"見える"はちょっとややこしいので、泳げる、鳴けるだけに注目します。&lt;br&gt;これをプログラムとして表現すると、どういった形が自然でしょうか。  &lt;p&gt;#1.鴨のように泳ぐ()関数と、鴨のように鳴く()関数を持った上で、それぞれの関数に成功した時、鴨とみなす。&lt;br&gt;#2.鴨のように泳ぐ()関数と、鴨のように鳴く()関数を持つ時、鴨とみなす。  &lt;p&gt;もう一度用語説明を&lt;br&gt;「ある鳥が鴨のように見え、鴨のように泳ぎ、鴨のように鳴くならば、それはたぶん鴨である。」  &lt;p&gt;&amp;nbsp; &lt;p&gt;#1が私の解釈で、#2が検索するとよく出てくるRubyやC++によるダックタイピングの実装です(多分)。&lt;br&gt;もちろん、#2は技術的に有用ですし、ダックテストともそうは離れていません。  &lt;p&gt;ただし#1,#2のどちらがダックテストの意味に近いかといえば、#1のほうが明らかに意味が近いと感じます。&lt;br&gt;何度読み返しても#1のほうが近く感じてしまいます。  &lt;p&gt;例えば、鴨のように泳ぐ()関数と、鴨のように鳴く()関数を持つけれども、必ず失敗してしまうものがあったとします。&lt;br&gt;これを#2に通すと、ある鳥が鴨のように見え、鴨のように泳ぐことに失敗し、鴨のように鳴くことに失敗したなら、それはたぶん鴨である&lt;br&gt;という風に、仕様と外れたものが出来上がってしまいます。&lt;br&gt;#1では、直感どおりの判定をします  &lt;p&gt;&amp;nbsp; &lt;p&gt;ダックテストの実装として、本当にインターフェースの保証のみでいいのか、&lt;br&gt;インターフェースの結果保証、つまり(成功するという)状態の保証までしなければいけないのか。&lt;br&gt;もしくはそれ以外なのか。  &lt;p&gt;どう思いますか &lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/alf/aggbug/164961.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あるふ</dc:creator><title>無効をサポートするオブジェクト</title><link>http://blogs.wankuma.com/alf/archive/2008/12/23/164682.aspx</link><pubDate>Tue, 23 Dec 2008 16:32:00 GMT</pubDate><guid>http://blogs.wankuma.com/alf/archive/2008/12/23/164682.aspx</guid><wfw:comment>http://blogs.wankuma.com/alf/comments/164682.aspx</wfw:comment><comments>http://blogs.wankuma.com/alf/archive/2008/12/23/164682.aspx#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://blogs.wankuma.com/alf/comments/commentRss/164682.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/alf/services/trackbacks/164682.aspx</trackback:ping><description>&lt;p&gt;前項の無効をサポートするオブジェクトがどんなものかを、他の手法と比較して考えて見ます  &lt;p&gt;・テストファースト&lt;br&gt;仕様の洗い出しのためにテストを作成するという意味では同じです。&lt;br&gt;どちらも動的なテストができるという意味では同じです。&lt;br&gt;クラスを作成するときに、最初にSelfTest()を作ってしまうのも同じです。  &lt;p&gt;違いは、繰り返しテストを削除したことと、このテストを本番コードにも組み込むということです。&lt;br&gt;繰り返しテストを取るのか、本番コードに組み込むことによるさまざまなメリットをとるのか・・。  &lt;p&gt;両方のいいとこ取りをするのがベストですかね。  &lt;p&gt;&amp;nbsp; &lt;p&gt;・ダックタイピング&lt;br&gt;クラスの作成権、編集権が見る側に全権があるという意味で、SelfTest()オブジェクト指向とほぼ同じです。&lt;br&gt;理念は同じなのですが、現在のダックタイピングは静的に表現されることが多いです。&lt;br&gt;見る側の思惑と現実が同じかどうかの検証は動的である必要があります。  &lt;p&gt;現在のダックタイピングと、SelfTest()オブジェクトは、動的か静的かが主な違いです。  &lt;p&gt;&amp;nbsp; &lt;p&gt;・契約プログラミング&lt;br&gt;SelfTest()は、事前条件そのままという意味で同じです。&lt;br&gt;事前条件以外を使用しないという意味では違います。  &lt;p&gt;現在の契約プログラミングでは、静的解決を目標にしているものが多いため、&lt;br&gt;現在の契約プログラミングとはかけ離れているかもしれません。  &lt;p&gt;SelfTest()は、動的テストを重要視しています。  &lt;p&gt;&amp;nbsp; &lt;p&gt;・ネットワーク&lt;br&gt;オブジェクト指向を、オブジェクト間、オブジェクト-リソース間の通信と考えれば、通信の手法が使えるはずです。&lt;br&gt;ネットワークの場合、切断の要因が相手にあることがあるため、&lt;br&gt;常に接続されているかどうかを確認しなければいけません。この考えはSelfTest()と同じです。  &lt;p&gt;&amp;nbsp; &lt;p&gt;・デザインパターン&lt;br&gt;Nullオブジェクトが最も近いです。&lt;br&gt;全てのクラスがNullオブジェクトにもなれることをサポートしなければいけない、と考えるとSelfTest()と同じです  &lt;p&gt;&amp;nbsp; &lt;p&gt;・ガード句&lt;br&gt;極めて相性がよい、というよりはオブジェクト指向をガード句に対応させたものがSelfTest()オブジェクト指向といっても過言ではないです。&lt;br&gt;どんなクラスに対しても有効なガード句を使用可能になります  &lt;p&gt;&amp;nbsp; &lt;p&gt;・関数型&lt;br&gt;全てのクラスが"無効な状態"をサポートするため、戻り値でクラスのインスタンスを安全に返すことができます&lt;br&gt;(初期化に失敗しても例外を出さない。コード上に矛盾も起きない)。&lt;br&gt;この使い勝手が、関数型と少し似ているかもしれません  &lt;p&gt;&amp;nbsp; &lt;p&gt;・状態遷移&lt;br&gt;必要性を感じなくなります。&lt;br&gt;SelfTest()は、全ての状態を考慮した上でどんな時にでも正しく動くことを目指すため、&lt;br&gt;特定のパターンに依存する状態遷移は必要がなくなります。  &lt;p&gt;むしろ状態遷移の上位互換に近い(全てのパターンを考慮するという意味で)のですが、その分難しいともいえます  &lt;p&gt;&amp;nbsp; &lt;p&gt;もっともイメージしやすいのはおそらく、テストファーストを本番コードに組み込んだもの、ですかね。&lt;br&gt;実際メリットの半分くらいはテストファーストと同じです。  &lt;p&gt;なぜ本番コード、つまり動的にテストをしなければいけないのかは、&lt;br&gt;オブジェクト-リソース間の通信(メッセージ)と捉えているからです。&lt;br&gt;通信であれば、接続テストは必須ですよね？  &lt;p&gt;オブジェクト指向の外を見てみれば、案外と普通の手法です  &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;無効をサポートするオブジェクト手法のメリットを考えて見ます。&lt;br&gt;まず一つは、テストファーストと同様、仕様の理解を深めます。  &lt;p&gt;&amp;nbsp; &lt;p&gt;もう一つは、プログラムの構造をシンプルにすることが可能な点です。&lt;br&gt;？？わかりませんね。  &lt;p&gt;まず構造化定理を思い出してください。&lt;br&gt;全てのプログラムは順次、反復、分岐で表現できます。  &lt;p&gt;このうち分岐は全て、あるオブジェクトが有効か無効かで表すことができます。&lt;br&gt;ある処理をするとき、"全ての必須のオブジェクトが有効であれば"、&lt;br&gt;順次、反復のみであらわすことが可能です。&lt;br&gt;分岐がなければ、反復は順次と読み替えても対して問題にならないでしょう。  &lt;p&gt;必須のオブジェクトが一つでも無効であれば、それは制約を満たしていないので処理が中断します。  &lt;p&gt;つまり、プログラムを順次と中断だけで表現することができるようになります。  &lt;p&gt;&amp;nbsp; &lt;p&gt;分岐をなくすというよりはむしろ、初期化に持ってくるイメージに近いです。&lt;br&gt;RAII（Resource Acquisition Is Initialization リソースの確保は初期化時に)をもじって&lt;br&gt;SII(Selection Is Initialization 選択は初期化時に)とかどうでしょうか  &lt;p&gt;&amp;nbsp; &lt;p&gt;もっともっと実装よりに言えば、全てのオブジェクトに対してガード句を使えるのが最大のメリットです&lt;br&gt;いったんこの手法に慣れてしまうと、引数のオブジェクトにガード句を使えないのが不満で不満でしょうがなくなりますｗ  &lt;p&gt;int Func(Object obj){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(int res = obj.SelfTest()){return res;}//←これ。  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //何か&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br&gt;}&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/alf/aggbug/164682.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あるふ</dc:creator><title>オブジェクト指向理論04 命題</title><link>http://blogs.wankuma.com/alf/archive/2008/12/20/164476.aspx</link><pubDate>Sat, 20 Dec 2008 00:18:00 GMT</pubDate><guid>http://blogs.wankuma.com/alf/archive/2008/12/20/164476.aspx</guid><wfw:comment>http://blogs.wankuma.com/alf/comments/164476.aspx</wfw:comment><comments>http://blogs.wankuma.com/alf/archive/2008/12/20/164476.aspx#Feedback</comments><slash:comments>1247</slash:comments><wfw:commentRss>http://blogs.wankuma.com/alf/comments/commentRss/164476.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/alf/services/trackbacks/164476.aspx</trackback:ping><description>&lt;p&gt;用語の解説は一応したつもりなので、そろそろ本題に入りたいと思います。  &lt;p&gt;挑戦してみたいのは、オブジェクト指向を定義からトップダウン式に展開していって、&lt;br&gt;オブジェクト指向プログラミングで使われている技術(カプセル化や継承等)につなげてみたい、ということです。  &lt;p&gt;&amp;nbsp; &lt;p&gt;今回大量に未証明のものがありますが、それはおいおい埋めていければいいと思ってます。&lt;br&gt;若干弱いところはあるけれど、矛盾とまではいわない程度になっていると思います。  &lt;p&gt;&amp;nbsp; &lt;p&gt;私の考えるオブジェクト指向理論の定義は次のものです。&lt;br&gt;@1.「リソース」を「オブジェクト」として「捉える」。オブジェクト指向XXでは、「オブジェクト」のみを扱う  &lt;p&gt;とっちゃんさんにまとめてもらったものを利用するとこうです&lt;br&gt;「AをBの中に概念化したA'を重視する」  &lt;p&gt;Aをリソースと呼び、Bを主体と呼び、A'をオブジェクトと呼ぶことにします&lt;br&gt;A、Bにはどんなものを当てはめても成り立つとします。&lt;br&gt;(B＝主体を、開発者固定にしている人は要注意です。がんがん切り替えていきます)  &lt;p&gt;&amp;nbsp; &lt;p&gt;@1を展開していきます。  &lt;p&gt;#1.捉えるということは、それを行う主体がいる&lt;br&gt;#2.捉えるというのは、主体の中にリソースをオブジェクトとして再構築すること&lt;br&gt;#3.オブジェクトは主体の中にあるので、主体がオブジェクト制御の全権を握る&lt;br&gt;#4.リソースは主体の中にあるとは限らないので、主体はリソースに対する制御権をもたない&lt;br&gt;#5.捉えるというのは正当性の基準をもつということ。&lt;br&gt;#6.オブジェクトに、そのオブジェクト及び関連付けられたリソースの正当性を保証する義務がある。&lt;br&gt;#7.オブジェクトは、主体になることができる  &lt;p&gt;上記7点が全て正しいなら、ちょっとした定理が導けます。  &lt;p&gt;それは、(主に＃4により)オブジェクトは常に有効でいることはできないので、&lt;br&gt;全てのオブジェクトは無効になることをサポートしなければいけない、ということです。&lt;br&gt;無効になることをサポートするというのはつまり、オブジェクトが有効かどうかを判定するメンバ関数を作る、というのと同じです。&lt;br&gt;つまり全てのクラスの基底となるObjectクラスにオブジェクト-リソース間の正当性チェック関数を持たせるべき、となります。  &lt;p&gt;&amp;nbsp; &lt;p&gt;オブジェクト指向の定義から導かれる、Objectクラスに必要なものは、&lt;br&gt;ToString()でもなく、Serialize()でもなく、リソースまで含めた正当性判定ではないかという提案です。&lt;br&gt;(ToString()で代用できなくはないですけど)  &lt;p&gt;class Object{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //この関数が呼ばれた時点で、このクラスが正しいといえるかどうかの判定関数&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //クラスが正しくないとはどういうことか↓&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //この関数は、この関数(とOpenXX)以外の全てのメンバ関数の先頭で呼ばれ、失敗(!=0)時はそのメンバ関数が失敗する..ことになっている&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Isで始まらないいい名前がなかったので、SelfTest()=自己診断としました&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; virtual int SelfTest()=0;&lt;br&gt;};  &lt;p&gt;&amp;nbsp; &lt;p&gt;似たような概念に、IsInvalid() があります。&lt;br&gt;ただこれは、クラス－クラスインスタンス間の正当性チェック(つまりnewした結果が失敗かどうか)を調べるというニュアンスが強いのと、(私の採用する規約だと)Isで始まる関数はboolしか返せないので、新しく名前をつけました。  &lt;p&gt;&amp;nbsp; &lt;p&gt;重要なのは、型のチェックだけではなく、意味のチェックもするということです(意味、概念という外部のリソースとつながっているはずなので。)。&lt;br&gt;だからこの関数が調べる必要があるのは、&lt;br&gt;・外部から提示された要求仕様&lt;br&gt;・型として正しいかどうか&lt;br&gt;・メンバ変数(クラスを使う人という視点から見ればリソースにあたる)&lt;br&gt;・グローバル変数(普通はないと思いますが)&lt;br&gt;・環境変数(OSの設定、関連ファイルなど)&lt;br&gt;となります。  &lt;p&gt;&amp;nbsp; &lt;p&gt;無効をサポートしない手法だと案外大変そうな、子供クラスで実装してみました。  &lt;p&gt;&amp;nbsp; &lt;p&gt;class Child : public Object{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int m_age;//メンバ変数はクラスを使う人から見るとリソース。このクラスを使う人からは直接制御権がない&lt;br&gt;public:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Child() : m_age(-1){}  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //クラスは、自分が正しい状態にあるかどうかを判定できなければいけない&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Child が、クラスとして有効であるために少なくても満たさなければいけない条件判定//制約条件&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int SelfTest(){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(m_age &amp;lt; 0){return 1;}//生まれてなければ、Childとして認めない&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(m_age &amp;gt; 12){return 2;}//12歳より上なら、Childとして認めない&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;};  &lt;p&gt;class Child : public Object{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Human m_human;//メンバ変数はクラスを使う人から見るとリソース。このクラスを使う人からは直接制御権がない&lt;br&gt;public:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Child(){}  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //クラスは、自分が正しい状態にあるかどうかを判定できなければいけない&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Child が、クラスとして有効であるために少なくても満たさなければいけない条件判定//制約条件&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int SelfTest(){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(int res = m_human.SelfTest()){return res;}//人として正しくなければ子供として正しくない  &lt;p&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(m_human.GetAge() &amp;lt; 0){return 1;}//生まれてなければ、Childとして認めない//←このチェックはHumanに移管&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(m_human.GetAge() &amp;gt; 12){return 2;}//12歳より上なら、Childとして認めない&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;};  &lt;p&gt;@1.「リソース」を「オブジェクト」として「捉える」。オブジェクト指向XXでは、「オブジェクト」のみを扱う&lt;br&gt;ので、SelfTest()関数が必要&lt;br&gt;これがきれいにつながるかどうかが前半の山場です。  &lt;p&gt;これが成り立てば、全てのオブジェクトは制約オブジェクトとして扱えるようになります。&lt;br&gt;そうなれば、それを使って継承等の仕組みを説明できる・・ような気がしますよね？&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/alf/aggbug/164476.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あるふ</dc:creator><title>オブジェクト指向理論？03 インスタンスとリソース</title><link>http://blogs.wankuma.com/alf/archive/2008/12/18/164211.aspx</link><pubDate>Thu, 18 Dec 2008 01:55:00 GMT</pubDate><guid>http://blogs.wankuma.com/alf/archive/2008/12/18/164211.aspx</guid><wfw:comment>http://blogs.wankuma.com/alf/comments/164211.aspx</wfw:comment><comments>http://blogs.wankuma.com/alf/archive/2008/12/18/164211.aspx#Feedback</comments><slash:comments>31</slash:comments><wfw:commentRss>http://blogs.wankuma.com/alf/comments/commentRss/164211.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/alf/services/trackbacks/164211.aspx</trackback:ping><description>&lt;p&gt;私-犬が対話する時、オブジェクト指向プログラミング用語の"オブジェクト"は、  &lt;p&gt;"私"の中、つまり"私の妄想の中の犬"にあたります。  &lt;p&gt;イメージしにくいので、比較表を作ってみました。  &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="703" border="1"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="105"&gt;&amp;nbsp;&lt;/td&gt; &lt;td valign="top" width="132"&gt;私の妄想の中の犬&lt;/td&gt; &lt;td valign="top" width="130"&gt;現実の犬&lt;/td&gt; &lt;td valign="top" width="156"&gt;クラス/インスタンスの犬&lt;/td&gt; &lt;td valign="top" width="178"&gt;リソースとしての犬&lt;br&gt;(例えばファイル)&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="105"&gt;作成&lt;/td&gt; &lt;td valign="top" width="132"&gt;私の意思により可能&lt;/td&gt; &lt;td valign="top" width="130"&gt;現実のルールに従う&lt;/td&gt; &lt;td valign="top" width="156"&gt;ソフトウエアの意思により可能&lt;/td&gt; &lt;td valign="top" width="178"&gt;外のルール(OS等)に従う。(依頼することは可能)&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="105"&gt;複製&lt;/td&gt; &lt;td valign="top" width="132"&gt;私の意思により可能&lt;/td&gt; &lt;td valign="top" width="130"&gt;現実的には不可能&lt;/td&gt; &lt;td valign="top" width="156"&gt;ソフトウエアの意思により可能&lt;/td&gt; &lt;td valign="top" width="178"&gt;外のルール(OS等)に従う&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="105"&gt;消去&lt;/td&gt; &lt;td valign="top" width="132"&gt;私の意思により可能&lt;/td&gt; &lt;td valign="top" width="130"&gt;現実のルールに従う&lt;/td&gt; &lt;td valign="top" width="156"&gt;ソフトウエアの意思により可能&lt;/td&gt; &lt;td valign="top" width="178"&gt;外のルール(OS等)に従う&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="105"&gt;カプセル化&lt;/td&gt; &lt;td valign="top" width="132"&gt;可能&lt;/td&gt; &lt;td valign="top" width="130"&gt;一切しない(見る側の能力に依存)、&lt;/td&gt; &lt;td valign="top" width="156"&gt;可能&lt;/td&gt; &lt;td valign="top" width="178"&gt;一切しない(見る側の能力に依存)&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="105"&gt;継承&lt;/td&gt; &lt;td valign="top" width="132"&gt;可能&lt;/td&gt; &lt;td valign="top" width="130"&gt;不可&lt;/td&gt; &lt;td valign="top" width="156"&gt;可能&lt;/td&gt; &lt;td valign="top" width="178"&gt;不可&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="105"&gt;正しさ&lt;/td&gt; &lt;td valign="top" width="132"&gt;私にとっての正しさの基準を全て満たす&lt;/td&gt; &lt;td valign="top" width="130"&gt;見る側に依存&lt;/td&gt; &lt;td valign="top" width="156"&gt;ソフトウエアにとっての正しさの基準を全て満たす&lt;/td&gt; &lt;td valign="top" width="178"&gt;見る側に依存&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="105"&gt;非現実的なもの&lt;/td&gt; &lt;td valign="top" width="132"&gt;作ることが可能、&lt;/td&gt; &lt;td valign="top" width="130"&gt;現実のルールに従うものしかない&lt;/td&gt; &lt;td valign="top" width="156"&gt;作ることが可能&lt;/td&gt; &lt;td valign="top" width="178"&gt;現実のルールに従うものしかない&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&amp;nbsp; &lt;p&gt;下記二つの組み合わせは、全く同じといっていいほどよく似た特徴を持ちます。  &lt;p&gt;私の妄想の中の犬=クラス/インスタンスの犬  &lt;p&gt;現実の犬=リソースとしての犬&lt;/p&gt; &lt;p&gt;それ以外の組み合わせで "同じ"であるというのは無理があると思うのですが、どうでしょうか。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;オブジェクト指向プログラミングの適用範囲は以外に狭くて(この例では)実行ファイルの中だけであることと、&lt;/p&gt; &lt;p&gt;一般用語のモノとオブジェクト指向用語のオブジェクトは別物であり、混同してはいけないということを示しているだけで、&lt;/p&gt; &lt;p&gt;別段変ではない、はずです。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;テーマについて。&lt;/p&gt; &lt;p&gt;「オブジェクト指向」＝「オブジェクトを指向することにより得られる理論、オブジェクト指向プログラムの正しさの拠りどころとなる理論の総称」&lt;/p&gt; &lt;p&gt;つまり名詞で使ったときには、暗黙的に"理論"が足されると思っていました。&lt;/p&gt; &lt;p&gt;とりあえずオブジェクト指向理論としてみましたが、意味的に大丈夫でしょうか。全く自信がないです&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;"オブジェクト指向する"は日本語としてとてもわかりにくいので、&lt;/p&gt; &lt;p&gt;私は日本語の資料によくある@1をオブジェクト指向XX？の定義としています。&lt;br&gt;@1.「モノ」を「オブジェクト」として「捉える」。オブジェクト指向XXでは、「オブジェクト」のみを扱う&lt;br&gt;@2.人の認知はオブジェクト指向XXの仕組みと同じ&lt;br&gt;(@3.オブジェクト指向プログラミング)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;基本的には、@1だけを使用して論理展開した理論が、オブジェクト指向プログラミングの基盤となる理論であると思います。&lt;br&gt;実際には@2を根拠として使用しても許されるはず。&lt;/p&gt; &lt;p&gt;万が一@1がおかしかった場合は、全てがおかしいので早めに教えてもらえると大変助かります。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/alf/aggbug/164211.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あるふ</dc:creator><title>オブジェクト指向02 定義2</title><link>http://blogs.wankuma.com/alf/archive/2008/12/16/163928.aspx</link><pubDate>Tue, 16 Dec 2008 21:48:00 GMT</pubDate><guid>http://blogs.wankuma.com/alf/archive/2008/12/16/163928.aspx</guid><wfw:comment>http://blogs.wankuma.com/alf/comments/163928.aspx</wfw:comment><comments>http://blogs.wankuma.com/alf/archive/2008/12/16/163928.aspx#Feedback</comments><slash:comments>19</slash:comments><wfw:commentRss>http://blogs.wankuma.com/alf/comments/commentRss/163928.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/alf/services/trackbacks/163928.aspx</trackback:ping><description>&lt;p&gt;前回の私の質問の、私なりの解釈です。  &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;私が犬に鳴けといったら、犬がワンと鳴いた。  &lt;p&gt;これをオブジェクト指向(*1)であらわすとしたら、何になるのかという質問でした。  &lt;p&gt;&amp;nbsp; &lt;p&gt;ズバリ結論からいきましょう。  &lt;p&gt;・クラス ＝ 私の頭の中の像  &lt;p&gt;・クラスのインスタンス ＝ 私の頭の中の像  &lt;p&gt;・オブジェクト ＝ クラスのインスタンス  &lt;p&gt;・開発者 ＝ 該当無し(あえていうなら神？/世界？)  &lt;p&gt;・プログラム=実行ファイル=私  &lt;p&gt;・設計図 ＝ 該当無し(誰も犬を作ったりはしていない)  &lt;p&gt;&amp;nbsp; &lt;p&gt;"犬"に値するものはリストにないです。  &lt;p&gt;私はリソースと呼んでることが多いです。  &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;実際に現実のプログラムを見た時、私＝実行ファイルとすれば、  &lt;p&gt;クラスとクラスのインスタンスは私＝実行ファイルの中にあるという解釈以外ありえないと思います。  &lt;p&gt;&amp;nbsp; &lt;p&gt;犬ではわかりにくいと思うので、もっとよくある例にしてみます。  &lt;p&gt;例えばファイル。  &lt;p&gt;ファイルは実行ファイルの外にありますが、アクセスする時には実行ファイルの中にクラス及びクラスのインスタンスを作成します。  &lt;p&gt;&amp;nbsp; &lt;p&gt;例えばユーザ。  &lt;p&gt;ユーザは、実行ファイルどころかPCの外にいますが、操作する時には実行ファイルの中にクラス及びクラスのインスタンスを作成します。  &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;私-犬の関係の時、私のなかに本当にクラス/クラスインスタンスができてるかも考えて見ます。  &lt;p&gt;人は、自分の中で世界を再構築し、その世界を通して行動しています。  &lt;p&gt;(単に目や耳をとおしてるというだけでもここでは十分かもしれませんがもう一歩)  &lt;p&gt;&amp;nbsp; &lt;p&gt;例えば犬がワンと鳴く時、その音は口から出ていると思いますよね。  &lt;p&gt;でも音だけ聞いただけだと、多分正確な位置はわからないでしょう。  &lt;p&gt;視覚情報と、聴覚情報が組み合わさって、つまり脳内で再構築するおかげで  &lt;p&gt;正しく口の位置から声が出ていると判断できるわけです。  &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;まとめます。  &lt;p&gt;クラス/クラスのインスタンスと、ここでいう犬(つまりリソース？）は、全く違うものであるということです。  &lt;p&gt;そしてそれはつまり、クラス/クラスのインスタンスがオブジェクトであれば、  &lt;p&gt;犬(つまりリソース？）は  &lt;p&gt;&amp;nbsp; &lt;p&gt;オ ブ ジ ェ ク ト で は な い  &lt;p&gt;&amp;nbsp; &lt;p&gt;ということです。  &lt;img src ="http://blogs.wankuma.com/alf/aggbug/163928.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>