<?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>Nm</title><link>http://blogs.wankuma.com/alf/</link><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></channel></rss>