<?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/shannon/category/870.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/shannon/archive/2008/07/17/149365.aspx</link><pubDate>Thu, 17 Jul 2008 16:05:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2008/07/17/149365.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/149365.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2008/07/17/149365.aspx#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/149365.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/149365.aspx</trackback:ping><description>&lt;P&gt;なんだかぱっとしないタイトル。&lt;BR&gt;ここで言う「インターフェイス」とは、多重継承できるあの interface じゃなくて、もっと一般的な意味でのそれです。約束事、みたいな。&lt;/P&gt;
&lt;P&gt;例えば、メソッドの引数に何かコレクションを受け取るとして、その型はどう宣言すべきか、と。&lt;BR&gt;IEnumerable&amp;lt;T&amp;gt; か、ICollection&amp;lt;T&amp;gt; か、IList&amp;lt;T&amp;gt; か、はたまた T[] か。&lt;/P&gt;
&lt;P&gt;極めて単純無思考には T[] 。&lt;BR&gt;しかし、T[] のほとんどの特性は IList&amp;lt;T&amp;gt; も備えているため、俺は個人的に IList&amp;lt;T&amp;gt; を好む傾向にある。&lt;BR&gt;多次元配列なんかは、もはや配列をそのまんま使うんじゃなくて、何らかのクラスを作ったほうがいいと思う。&lt;/P&gt;
&lt;P&gt;しかし、ランダムアクセスの必要が無ければ、IEnumerable&amp;lt;T&amp;gt; でも十分ではある。&lt;BR&gt;そういう時、IEnumerable&amp;lt;T&amp;gt; とすべきか否か。&lt;/P&gt;
&lt;P&gt;ちょっと引っかかるのは、ICollection&amp;lt;T&amp;gt; や IList&amp;lt;T&amp;gt; は無限リストを許容しないが、IEnumerable&amp;lt;T&amp;gt; は許容するというところ。&lt;BR&gt;ということは、IEnumerable&amp;lt;T&amp;gt; を引数に取るメソッドは、すべからく無限リストに対応すべし、ということになるか？&lt;BR&gt;遅延処理を意図したロジックならいいが、そうでない場合もあるだろう。&lt;BR&gt;IEnumerable&amp;lt;T&amp;gt;.Count() なんかは ICollection&amp;lt;T&amp;gt;.Count でもよかったんじゃないだろうか。無限リストに使ったらオーバーフローしたぞ。&lt;BR&gt;まぁ、ICollection&amp;lt;T&amp;gt; や IList&amp;lt;T&amp;gt; を受け取ったとして、要素数が Int32.MaxValue 個ある場合にちゃんと処理できなければならない、というのもなかなか酷ではあるのだが。&lt;/P&gt;
&lt;P&gt;また、これは感覚的な問題でもあるが、用途としては IEnumerable&amp;lt;T&amp;gt; で十分であっても、IList&amp;lt;T&amp;gt; を使いたいという心情もあると思う。&lt;BR&gt;ちょっと前の var 論争でもあった意見だが、「IEnumerable&amp;lt;T&amp;gt; ではコレクションのような気がしない。IList&amp;lt;T&amp;gt; ならコレクションであるという意図が込められる」みたいな。&lt;/P&gt;
&lt;P&gt;また別問題ではあるが、独自のデータ構造を作るか否かという問題もある。&lt;BR&gt;例えば、Pair&amp;lt;T, U&amp;gt; という既存の型があった場合、あらゆる2値の組み合わせは Pair&amp;lt;T, U&amp;gt; で事足りるか、ということ。&lt;BR&gt;Pair&amp;lt;T, U&amp;gt; は、それぞれの値の意味を理解しないので、.First とか .Second とかいうメンバ名にならざるを得ない。&lt;BR&gt;人の名前を表すのに、FirstName と LastName というメンバを持つクラスを作るか、Pair&amp;lt;string, string&amp;gt; で済ませるか、とか。&lt;BR&gt;独自のデータ型を作らずに既存の型を最大限活用した場合、&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;メンバの意味がわかりにくくなる &lt;/LI&gt;
&lt;LI&gt;ジェネリックの入れ子が深くなる&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;という問題が発生するわけだが、どうよ？　という。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/149365.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>シャノン</dc:creator><title>車なんて…っ！</title><link>http://blogs.wankuma.com/shannon/archive/2008/07/09/148138.aspx</link><pubDate>Wed, 09 Jul 2008 13:56:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2008/07/09/148138.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/148138.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2008/07/09/148138.aspx#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/148138.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/148138.aspx</trackback:ping><description>&lt;P&gt;思わずこんなタイトルをつけてしまったが、車ではなくてオブジェクト指向のお話。&lt;/P&gt;
&lt;P&gt;車はガソリンがなければ動きません（ディーゼル他、非ガソリン車はとりあえず置いといて）。最近高いですね、ガソリン。&lt;BR&gt;ご存知のように、ガソリンにはレギュラーと&lt;STRIKE&gt;廃屋&lt;/STRIKE&gt;ハイオクがあります。&lt;BR&gt;レギュラー用のエンジンにハイオクを入れても大丈夫ですが、ハイオク用のエンジンにレギュラーを入れると壊れてしまいます。&lt;/P&gt;
&lt;P&gt;面倒なのでコードは載せません。各々補完してください。&lt;/P&gt;
&lt;P&gt;車クラスとガソリンクラスがあります。&lt;BR&gt;車クラスには、ガソリンのインスタンスを引数に取る給油メソッドがあります。&lt;BR&gt;車クラスから、ハイオク専用車クラスを派生させます。&lt;BR&gt;このハイオク専用車クラスの給油メソッドの引数は、多くの言語ではガソリンになりますが、実際にはガソリンから派生したハイオクガソリンを渡さないと壊れてしまいます。&lt;/P&gt;
&lt;P&gt;I車インターフェイスではなく車クラスから派生させるのは、レギュラー用エンジンを積んでいる車には（悪質なものでない限り）どんなガソリンを入れても大丈夫だからです。この点において、レギュラー車はハイオク車より抽象的です。&lt;BR&gt;ハイオク専用車も車の一種には違いなく、ハイオクガソリンもガソリンの一種には違いないのに、車とガソリンに結合が関係があるとき、これらを継承関係にするとうまく行きません。&lt;/P&gt;
&lt;P&gt;よくある「ペンギンは鳥か？」論によれば、いくつかの結論のパターンがあります。&lt;BR&gt;たとえば、&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;現実世界がどうであれ、このプログラム中では、どんなガソリンでも給油できるものを車と定義したのだから、ハイオク専用車はその意味では車ではなく、車クラスから派生させることは不適当である&lt;/LI&gt;
&lt;LI&gt;ハイオク専用車の給油メソッドでは、実際に給油されたガソリンの動的な型を判別して、ハイオクガソリンでなければ例外を投げればよい。&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;というような。&lt;/P&gt;
&lt;P&gt;1は、「ペンギンは鳥か？」論でもそうですが、常識的に考えて「そんな馬鹿な」と言いたくなります。&lt;BR&gt;まして、ペンギンと鳥は実際にも姿形も生態も大きく異なるのに対し、今回の例では、より違いが少ないだけになおさらです。&lt;BR&gt;2は現実的な解かもしれません。しかし、極論を言ってしまえば、型のエラーをコンパイル時に検出できないなんて、静的型システムに何の意味があるというのでしょうか？&lt;BR&gt;もちろん、完璧主義に走るべきではなく、完全に検出できないからと言って全く役に立たないわけではないという意見は一理あります。&lt;BR&gt;しかし、完璧を求めてうまく行く方法があるとしたら、それを求めないのは罪というものです。&lt;/P&gt;
&lt;P&gt;さて、お題です。&lt;BR&gt;このような状況下でも、静的な型チェックを機能させる方法はあるのでしょうか？&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;こういう仕様の新しい言語を作ればうまく解決できる&lt;/LI&gt;
&lt;LI&gt;既存の言語にこういう拡張を施せばうまく解決できる&lt;/LI&gt;
&lt;LI&gt;実は拡張しなくても既存の言語でうまく解決できる&lt;/LI&gt;
&lt;LI&gt;そもそも問題設定に無理があって、どうやっても解決は無理、または不要&lt;/LI&gt;
&lt;LI&gt;だから動的言語を使えっつってんだろ&lt;/LI&gt;
&lt;LI&gt;他&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;既成概念に囚われない答えを募集します。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/148138.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>シャノン</dc:creator><title>喜ぶべきか悲しむべきか</title><link>http://blogs.wankuma.com/shannon/archive/2008/06/08/142229.aspx</link><pubDate>Sun, 08 Jun 2008 13:03:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2008/06/08/142229.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/142229.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2008/06/08/142229.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/142229.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/142229.aspx</trackback:ping><description>&lt;P&gt;オブジェクト指向を突き詰めていくと、どうしても動的言語に行き着いてしまう気がする。&lt;BR&gt;考えれば考えるほど、「基底クラスと派生クラスの関係」と「クラスとインスタンスの関係」に違いがないように思えてくる。&lt;BR&gt;「静的型チェック」は「プログラミング」に要請されることではあるが、「オブジェクト指向」に要請されることではないものなぁ。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/142229.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>シャノン</dc:creator><title>ぶっくまーく</title><link>http://blogs.wankuma.com/shannon/archive/2008/05/10/137157.aspx</link><pubDate>Sat, 10 May 2008 15:44:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2008/05/10/137157.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/137157.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2008/05/10/137157.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/137157.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/137157.aspx</trackback:ping><description>&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://d.hatena.ne.jp/minekoa/20080506"&gt;コンパイル時ダックタイピング&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://d.hatena.ne.jp/NyaRuRu/20080504/p2#c"&gt;中の人がどう思っているかと，外からどう思われているか&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.kmonos.net/wlog/85.html#_0905080505"&gt;Structural C++&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://d.hatena.ne.jp/haru-s/20080508/1210226387" name=1210226387&gt;C++ と Structural Polymorphism と型推論&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://d.hatena.ne.jp/minekoa/20080502/1209695216"&gt;LLとOO&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;面倒になったので列挙ストップ。あとは各ページのリンクなりトラックバックなりを辿るべし。&lt;BR&gt;しかし、何が書いてあるんだかさっぱり理解できねぇじゃねーかちくしょうめ。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/137157.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>シャノン</dc:creator><title>眠れぬ夜の空想</title><link>http://blogs.wankuma.com/shannon/archive/2008/05/01/135994.aspx</link><pubDate>Thu, 01 May 2008 12:09:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2008/05/01/135994.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/135994.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2008/05/01/135994.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/135994.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/135994.aspx</trackback:ping><description>&lt;P&gt;これはなかなか寝付けない夜にとりとめもなく考えていた空想であり、そのまま考えていては朝になってしまうので強制的に打ち切った思考の断片である。&lt;/P&gt;
&lt;P&gt;人間を、年齢層と性別で分けることを考える。&lt;/P&gt;
&lt;TABLE style="empty-cells: show" border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH colSpan=2 rowSpan=2&gt;&lt;/TH&gt;
&lt;TH colSpan=5&gt;年齢層&lt;/TH&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;10歳未満&lt;/TD&gt;
&lt;TD&gt;10代&lt;/TD&gt;
&lt;TD&gt;20代&lt;/TD&gt;
&lt;TD&gt;30代&lt;/TD&gt;
&lt;TD&gt;&amp;#8230;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TH rowSpan=2&gt;性別&lt;/TH&gt;
&lt;TD&gt;男&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;A&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;女&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;B&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;この表全体を「人間クラス」としたとき、AおよびBは何か。&lt;/P&gt;
&lt;P&gt;まず、年齢層や性別を人間クラスのプロパティとし、AやBが入っている表のセルをインスタンスであると考えてみる。&lt;BR&gt;すると、こうなる。&lt;/P&gt;&lt;PRE&gt;enum 年齢層 { 10歳未満, 10代, 20代, 30代, 以下略 }
enum 性別 { 男, 女 }
class 人間 { 年齢層 age, 性別 sex }

人間 A = new 人間(); A.age = 年齢層.30代; A.sex = 性別.男;
人間 B = new 人間(); B.age = 年齢層.10代; B.sex = 性別.女;&lt;/PRE&gt;
&lt;P&gt;表の列も行もセルも、すべてクラスであると考えると、こうなる。&lt;/P&gt;&lt;PRE&gt;class 人間 {}
class 10歳未満の人間 : 人間 {}
class 10代の人間 : 人間 {}
class 20代の人間 : 人間 {}
class 30代の人間 : 人間 {}
class 男 : 人間 {}
class 女 : 人間 {}
class 10歳未満の男 : 10歳未満の人間, 男 {}
class 10歳未満の女 : 10歳未満の人間, 女 {}
中略
class 30代の男 : 30代の人間, 男 {} // A
class 10代の女 : 10代の人間, 女 {} // B&lt;/PRE&gt;
&lt;P&gt;ただし、これは素朴には、こういうことがありうる。&lt;/P&gt;&lt;PRE&gt;class 矛盾した人間 : 10代の人間, 20代の人間, 男, 女 {}&lt;/PRE&gt;
&lt;P&gt;先にずらずらと列挙した例では、例えば「20代の男」は「20代、かつ、男」であった。&lt;BR&gt;すると、この矛盾した人間は、「10代であり20代、かつ、男であり女」になってしまう。&lt;BR&gt;現在の多重継承が可能な言語では、こういうクラスを作ることができてしまう。&lt;BR&gt;だが、意図したところは、「年齢層から１つ、性別から１つを多重継承する」である。&lt;/P&gt;
&lt;P&gt;コンパイルエラーにするにはまだ練り足りないが、もう少しだけ意図を追加してみる。&lt;BR&gt;例えば C# の属性風に。&lt;/P&gt;&lt;PRE&gt;// 人間の具象派生クラスは、年齢層と性別から１つずつを多重継承すること！
abstract class 人間 {}

[ ClassCategory( "年齢層" ) ] abstract class 10歳未満の人間 : 人間 {}
[ ClassCategory( "年齢層" ) ] abstract class 10代の人間 : 人間 {}
[ ClassCategory( "年齢層" ) ] abstract class 20代の人間 : 人間 {}
[ ClassCategory( "年齢層" ) ] abstract class 30代の人間 : 人間 {}
[ ClassCategory( "性別" ) ] abstract class 男 : 人間 {}
[ ClassCategory( "性別" ) ] abstract class 女 : 人間 {}
class 10歳未満の男 : 10歳未満の人間, 男 {}
class 10歳未満の女 : 10歳未満の人間, 女 {}
中略
class 30代の男 : 30代の人間, 男 {} // A
class 10代の女 : 10代の人間, 女 {} // B&lt;/PRE&gt;
&lt;P&gt;さらに C# の延長として、System.Type から複数の親クラス情報を、カテゴリ別に取得できると想定してみよう。&lt;/P&gt;&lt;PRE&gt;Type type = typeof( 30代の男 );
Type ageType = type.BaseTypes[ "年齢層" ]; // ageType == typeof( 30代の人間 );
Type sexType = type.BaseTypes[ "性別" ]; // sexType == typeof( 男 );&lt;/PRE&gt;
&lt;P&gt;ここで唐突に、C# から JavaScript にターゲットを変えてみる。&lt;BR&gt;といっても、これまでの流れから明らかなように、JavaScript チックな実在しない空想言語である。 
&lt;P&gt;JavaScript では、実行時にプロトタイプを変更することができる。&lt;BR&gt;これは、C# のような静的型付けの言語では、親クラスの変更に相当するだろう。&lt;BR&gt;では、多重継承に相当するように、プロトタイプを複数持つことができたとしたら？　ついでに、それが JavaScript お得意の名前つきマップだとしたら？&lt;BR&gt;こんな形になるんじゃないだろうか。&lt;/P&gt;&lt;PRE&gt;（面倒なのでクラス定義を一部省略した）
function 人間() {}

function 30代の人間() {}
30代の人間.prototype = new 人間();

function 男(){}
男.protptype = new 人間();

function 30代の男() {}
30代の男.prototypes[ "年齢層" ] = new 30代の人間();
30代の男.prototypes[ "性別" ] = new 男();&lt;/PRE&gt;
&lt;P&gt;この JavaScript モドキのコードと、一番最初に挙げた C# モドキのコードを見比べてみる。&lt;BR&gt;ちょっと変更して再掲しよう。&lt;/P&gt;&lt;PRE&gt;人間 30代の男 = new 人間();
30代の男.age = 年齢層.30代;
30代の男.sex = 性別.男;&lt;/PRE&gt;
&lt;P&gt;実によく似た形をしている。&lt;/P&gt;
&lt;P&gt;&amp;#8230;というところまで考えて寝た。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/135994.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>シャノン</dc:creator><title>制約</title><link>http://blogs.wankuma.com/shannon/archive/2008/03/18/128309.aspx</link><pubDate>Tue, 18 Mar 2008 14:16:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2008/03/18/128309.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/128309.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2008/03/18/128309.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/128309.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/128309.aspx</trackback:ping><description>「どんなデータでなければならないか」をプログラミング言語で書くのは容易だが、「どんな処理をしなければならないか」を書くのは困難である。&lt;BR&gt;「その処理をした後にデータはどうなっていなければならないか」なら書けるが、それでは「どんな処理をしなければならないか」を完全に代替できない。&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/128309.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>シャノン</dc:creator><title>System.Drawing.Point</title><link>http://blogs.wankuma.com/shannon/archive/2008/02/17/123457.aspx</link><pubDate>Sun, 17 Feb 2008 00:53:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2008/02/17/123457.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/123457.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2008/02/17/123457.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/123457.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/123457.aspx</trackback:ping><description>&lt;P&gt;２次元座標を表す、おなじみの&lt;A href="http://msdn2.microsoft.com/ja-jp/library/system.drawing.point.aspx"&gt;Point構造体&lt;/A&gt;。&lt;BR&gt;こいつがSystem.Drawing名前空間にあることは、ちょっとした不満である。&lt;/P&gt;
&lt;P&gt;理由は簡単で、２次元座標とは、何も描画するときだけに使うものではないからだ。&lt;BR&gt;たとえば&lt;A href="http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.control.location.aspx"&gt;Control.Locationプロパティ&lt;/A&gt;に使われるが、Locationプロパティを設定することは、何かを描画しているという意識なく行われるだろう。&lt;BR&gt;だが、Windowsはウィンドウの移動を裏で描画しているわけだし、また、ピクセル単位での座標指定に使うものであると拡大解釈して、なんとか自分を納得させてきた。&lt;/P&gt;
&lt;P&gt;だが、つい先ほど、ひょんなことから、&lt;A href="http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.datagridview.currentcelladdress.aspx"&gt;DataGridView.CurrentCellAddress&lt;/A&gt;というプロパティを知ってしまった。&lt;BR&gt;この型はPointであるが、単位はピクセルではない。DataGridViewのアクティブセルの行および列のインデックスである。&lt;BR&gt;また、DataGridViewは、この座標を用いて何かを描画することもない。&lt;BR&gt;ここへきて完全に、PointがDrawing名前空間にあることを正当化する理由は消えた。&lt;/P&gt;
&lt;P&gt;だが、いくら文句を言ったところで、Point構造体がDrawing名前空間を脱することはないだろう。&lt;BR&gt;だから、ここから先は妄想の域を出ない話だ。&lt;/P&gt;
&lt;P&gt;そもそも、Point構造体を、座標の単位を意識せずに、単なる２つの座標のペアとして扱うことは正しいのだろうか。&lt;BR&gt;それとも、表すものの単位ごとに異なるデータ型を用意すべきだったのだろうか。&lt;BR&gt;あるいはまた、２次元座標であるという意味さえ捨てて、Pair&amp;lt;int, int&amp;gt;のようなもので統一してしまうことは是なのだろうか。&lt;BR&gt;なかなか難しい問題ではないかと思うが、どうだろう。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/123457.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>シャノン</dc:creator><title>同値関係</title><link>http://blogs.wankuma.com/shannon/archive/2007/12/11/112462.aspx</link><pubDate>Tue, 11 Dec 2007 10:38:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2007/12/11/112462.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/112462.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2007/12/11/112462.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/112462.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/112462.aspx</trackback:ping><description>&lt;P&gt;あるインスタンスnがある。このインスタンスの真の型（動的な型）は問わないものとする。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;反射律：nの静的な型がAであるならば、nをAにキャストできる。 
&lt;LI&gt;対称律：nの静的な型がAであり、これをBにキャストできるならば、再度Aにキャストできる。 
&lt;LI&gt;推移律：nの静的な型がAであり、これをBにキャストしてからCにキャストできるならば、直接AからCにキャストできる。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;この特徴は、特にCOMのQueryInterfaceにおいて顕著である。&lt;BR&gt;余談だが、COMのキャスト規則も書いておく。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;反射律：nの静的な型がIFooであるならば、n-&amp;gt;QueryInterface( IID_IFoo,&amp;nbsp;&amp;amp;m ); は成功する。 
&lt;LI&gt;対称律：nの静的な型がIFooであり、n-&amp;gt;QueryInterface( IID_IBar, &amp;amp;m ); が成功するならば、m-&amp;gt;QueryInterface( IID_IFoo, &amp;amp;o ); は成功する。 
&lt;LI&gt;推移律：nの静的な型がIFooであり、n-&amp;gt;QueryInterface( IID_IBar, &amp;amp;m ) が成功し、かつ m-&amp;gt;QueryInterface( IID_IPoo, &amp;amp;o ); が成功するならば、n-&amp;gt;QueryInterface( IID_IPoo, &amp;amp;o ); は成功する。 
&lt;LI&gt;nの型に関わらず、n-&amp;gt;QueryInterface( IID_IUnknown, &amp;amp;m ); は常に成功する。&lt;BR&gt;かつ、m の値は何度実行しても必ず同じになる（IUnknown 以外へのキャストの場合は同じになるとは限らない）。 
&lt;LI&gt;n-&amp;gt;QueryInterface( IID_IFoo, &amp;amp;m ); が一度成功したならば、何度実行しても必ず成功する。&lt;BR&gt;逆に、一度失敗したならば、何度実行しても必ず失敗する。&lt;/LI&gt;&lt;/UL&gt;&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/112462.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>シャノン</dc:creator><title>集合の集合　リベンジ</title><link>http://blogs.wankuma.com/shannon/archive/2007/11/21/109595.aspx</link><pubDate>Wed, 21 Nov 2007 10:53:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2007/11/21/109595.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/109595.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2007/11/21/109595.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/109595.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/109595.aspx</trackback:ping><description>&lt;P&gt;&lt;A href="http://blogs.wankuma.com/shannon/archive/2007/10/22/103225.aspx"&gt;以前書いたエントリ&lt;/A&gt;で、「集合の集合」がよくわかんねぇ、とか言ってた。&lt;BR&gt;で、いろいろな方からヒントを頂いて、正直なところ、「あれ？　俺が悩んでたのはそんなことだったんだっけ？」と思った。&lt;/P&gt;
&lt;P&gt;で、&lt;A href="http://blogs.wankuma.com/shannon/archive/2007/11/20/109380.aspx"&gt;昨日のエントリ&lt;/A&gt;を書いたことで、当初の疑問を思い出した。&lt;/P&gt;
&lt;P&gt;クラスとは、インスタンスの集合であるとする。&lt;BR&gt;派生クラスとは、基底クラスの部分集合であるとする。&lt;/P&gt;
&lt;P&gt;クラスの継承関係は、基本的には抽象度に着目して行うべきだ。&lt;BR&gt;基底クラスは派生クラスよりも情報量が少なく、抽象度が高い。&lt;BR&gt;これは、別の言い方をすれば「内包が小さく、外延が大きい」とも言う。&lt;/P&gt;
&lt;P&gt;では、クラスとインスタンスの関係はどうか？&lt;BR&gt;クラスとインスタンスの関係も、抽象度の違いがあるはずだ。&lt;BR&gt;よく使われるたとえ話に「犬クラスと、そのインスタンスであるポチ」がある。&lt;BR&gt;犬クラスは、個々の犬の名前を捨象している。&lt;/P&gt;
&lt;P&gt;ここで「ポチクラスを作ろう」というのではない。逆だ。&lt;/P&gt;
&lt;P&gt;昨日の話では、XMLクラスの派生クラスとしてXHTMLやXAMLを置き、そのインスタンスとして、それらの言語で書かれた文書を挙げた。&lt;BR&gt;だが、XHTMLやXAMLといった言語を、XMLクラスのインスタンスとしてもよかったのではないか？　と思うわけだ。&lt;BR&gt;そうしたとき、個別言語は、XMLクラスのインスタンスであると同時に、各文書のクラスでもある。&lt;BR&gt;集合論の言い方をすれば、XMLクラスは「クラスの集合」であり、「集合の集合」であることになる。&lt;/P&gt;
&lt;P&gt;現在、主流のオブジェクト指向言語では、クラスのクラスを記述できない。&lt;BR&gt;Java の ClassLoader とか .NET の System.Type は、ある意味で「クラスのクラス」だが、XML の例とは抽象化の方向性が違うように思う。&lt;/P&gt;
&lt;P&gt;うまくまとまらない。むーん。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/109595.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>シャノン</dc:creator><title>オブジェクト指向バックエンド</title><link>http://blogs.wankuma.com/shannon/archive/2007/11/19/109169.aspx</link><pubDate>Mon, 19 Nov 2007 14:19:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2007/11/19/109169.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/109169.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2007/11/19/109169.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/109169.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/109169.aspx</trackback:ping><description>&lt;P&gt;なんつーか。&lt;/P&gt;
&lt;P&gt;数学とか、哲学とか、言語学とか、論理学とか、心理学とか。&lt;BR&gt;そういった学問ってのは、古くは紀元前の昔からあったわけです。&lt;BR&gt;で、極めて大雑把に言えば、それらはある意味、現実世界のモデル化を行うわけです（それ以外にもいろいろやるだろうけど）。&lt;/P&gt;
&lt;P&gt;それでですね。&lt;BR&gt;オブジェクト指向っていうのも、現実世界をコンピュータの中にモデル化する手法なわけで。&lt;BR&gt;共通点があるんですね。&lt;/P&gt;
&lt;P&gt;別の側面から見てみると、例えばデザインパターン。&lt;BR&gt;Template Method なんてのは、そうと知らなくても使っていたりしますよね。&lt;BR&gt;デザインパターンってのは、要するにノウハウ集なわけです。&lt;BR&gt;デザインパターンが偉大なのは、その暗黙知を明文化して整理して、なにより命名したという点にあります。&amp;#8230;が、それは置いといて。&lt;/P&gt;
&lt;P&gt;学問とオブジェクト指向の共通点を調べてみると、学問は知らなかったけれど、それに相当するオブジェクト指向上のノウハウは知っていた、とかあるわけですよ。学問版の Template Method みたいにね。&lt;BR&gt;現場で積み重ねた経験と、学問上のセオリーが同じ形をしていた、というか。&lt;BR&gt;そういう時、明文化された学問の方を知っているのといないのでは、出来上がりにちょっとは差が出てくるんじゃないかな？　と思うわけです。&lt;/P&gt;
&lt;P&gt;デザインパターンだけ本で勉強しても、現場の経験が無ければプログラムは作れない。&lt;BR&gt;デザインパターンを知らなくても、現場の経験があればそこそこのものが作れる。&lt;BR&gt;デザインパターンを知っていて、かつ、現場の経験があれば、すばらしいものが作れる。&lt;BR&gt;この文中の「デザインパターン」を「諸学問」に置き換えても、同じことが成り立つと思うのですよ。&lt;/P&gt;
&lt;P&gt;そういった、オブジェクト指向（に限らなくてもいいけど）に応用できるような学問を、オブジェクト指向に応用するために、という視点で、贅沢を言えば分野横断的に勉強できればナァ&amp;#8230;という思いが、もう結構長いこと燻ってまして。&lt;BR&gt;金をためて会社辞めて大学へ行くことを真剣に考えてます。&lt;/P&gt;
&lt;P&gt;そういう切り口で書いてあるモノを読んでみたいと思っているのですが、誰か書かない？&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/109169.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>