Out of Memory

本ブログは更新を停止しました。Aerieをよろしくお願いいたします。

目次

Blog 利用状況

ニュース

2009年3月31日
更新を停止しました。引き続きAerieを御愛顧くださいませ。
2009年2月3日
原則としてコメント受付を停止しました。コメントはAerieまでお願いいたします。
詳細は2月3日のエントリをご覧ください。
2008年7月1日
Microsoft MVP for Developer Tools - Visual C++ を再受賞しました。
2008年2月某日
MVPアワードがVisual C++に変更になりました。
2007年10月23日
blogタイトルを変更しました。
2007年7月1日
Microsoft MVP for Windows - SDKを受賞しました!
2007年6月20日
スキル「ニュース欄ハック」を覚えた!
2006年12月14日
記念すべき初エントリ
2006年12月3日
わんくま同盟に加盟しました。

カレンダー

中の人

αετο? / aetos / あえとす

シャノン? 誰それ。

顔写真

埼玉を馬鹿にする奴は俺が許さん。

基本的に知ったかぶり。興味を持った技術に手を出して、ちょっと齧りはするものの、それを応用して何か形にするまでは及ばずに飽きて放り出す人。

書庫

日記カテゴリ

正方形 is a 長方形?

結論から言おう。答えはYes(の場合もある)。
どうも、そうではないと思っている人も結構いるらしい(どこのトンデモ本が言いふらしてるんだか知らないが)。
この答えがNoであると頑なに信じている人にモデリングはできない。

我々のよく知る数学は、「正方形は長方形の一種である」と言う。その通りだ。
しかし、オブジェクト指向で継承関係を考える際には、これは成り立たないと言う人が多い。それは違う。

このへん
http://www.objectclub.jp/community/memorial/homepage3.nifty.com/masarl/article/nifty-logs/circle-isa-rectangle.html
が有名だろうか。
さて、このページの間違いがわかるかな?

答えはここ。
> 普通、長方形クラスのユーザは縦の長さを変更しても横の長さが変わらないと期待するでしょう。
その期待が間違い。

数学的に「正方形は長方形の一種である」と言う時、この「長方形」の定義は何か。
それは「4つの角がすべて直角である四角形」である(別に3つでもいいけど、同じこと)。
そこには「縦と横の長さは独立している」などという要件はない。
数学的には、正方形は長方形の一種であるからという理由で継承関係にしているのに、数学にない期待をするからおかしくなる。

しかしながら、ここで言いたいことは「縦と横の長さを独立して変えられるような長方形クラスを作るべきではない」ということではない。

  • 数学的なアプローチが適切でないなら、そのような長方形クラスはあってもよいが、その場合は正方形をそこから派生させるべきではない
  • 数学的なアプローチが適切なら、正方形を長方形のサブクラスにするべきだが、それなら、縦と横の長さは独立しているという期待をすべきではない。

ということだ。

要約すると「答えは一つではない」ということである。
何が正解なのかは場合によって変わる。同じことだが、何が間違いなのかも場合によって変わる。
数学的なアプローチが適切な場合も、そうでない場合もある。非ユークリッド幾何学の世界では、「長方形とは4つの角が直角である四角形」という定義さえ歪む。
どんな場合にも正しい、あるいは間違えているモデルなんかない。
同じページには、
> 現実の世界の IS-A 関係とオブジェクト指向の IS-A 関係は違うこともあるんだ,ということを理解してもらわなければならないでしょう
とも書いてあるが、そもそも現実の世界のIS-A関係からして一通りではないということを理解するのが先である。

投稿日時 : 2007年1月19日 11:57

Feedback

# re: 正方形 is a 長方形? 2007/01/19 12:36 まきなす

<数学的には、長方形は正方形の一種

の部分が難しくてよくわかりません。
誤植じゃないですよね。

# re: 正方形 is a 長方形? 2007/01/19 12:39 シャノン

うん、誤植。
こっそり訂正しました。

# re: 正方形 is a 長方形? 2007/01/19 13:26 疑問です

この本はトンデモ本なんですか、
ちょうど購入しようか否か迷っているところなんです

# re: 正方形 is a 長方形? 2007/01/19 13:34 シャノン

実のところ、俺は持ってるんですが、買ったきり積んだままで読んでないのです。
巷では必読のバイブルのように言われていますし、読む価値はあると思いますが、俺が読むときは盲信しないように気をつけようと思っています。

# re: 正方形 is a 長方形? 2007/01/19 14:50 Chuki

>正方形 is a 長方形?
各角が各々直角という条件を欠格していれば例外を書く位のことは設計時に確認してよ...と斯くの如く思う次第であります。

# re: 正方形 is a 長方形? 2007/01/19 15:58 えムナウ

>(別に2つでもいいけど、同じこと)
ここにつっこみ。
2つじゃだめです。

# re: 正方形 is a 長方形? 2007/01/19 16:37 シャノン

うん、ほんとだ。3つないとダメですね。
修正しました。

# re: 正方形 is a 長方形? 2007/01/19 16:40 シャノン

> 各角が各々直角という条件を欠格していれば例外を書く位のことは設計時に確認してよ

直角でないのは長方形ですらないわけですが…
何か、直角でない図形を引数に取れるくせに長方形を期待するメソッドでもありました?

# re: 正方形 is a 長方形? 2007/01/19 17:40 Hirotow

例のボードゲームだと正方形のサイズをなんと呼ぶかで迷ったなあ。
結局Sizeにしたけど。

# re: 正方形 is a 長方形? 2007/01/19 18:24 えムナウ

正方形は長方形でひし形でもあるのだが、
それは表現できない多重継承。

# re: 正方形 is a 長方形? 2007/01/19 18:55 Chuki

>メソッドでもありました?
失礼しました、単に言葉遊びです。

ただ、継承先でヘンテコなメソッドを追加されないためにはどうしたものかなぁ、というのは常々気をつけてます。

>現実の世界のIS-A関係からして一通りではない
まさにその通りで私がイメージして設計したIS-Aの関係が工程を経るごとにすごいことになってることも……

>直角でないのは長方形ですらないわけですが…
いつの間にか長方形を継承した正方形のさらに継承として角度を変えるメソッドが増えたひし形ができてたりとか……
#OOというかはマネジメントの問題ですが^^;

# re: 正方形 is a 長方形? 2007/01/19 19:01 シャノン

どうして?
表現できますよ。

# re: 正方形 is a 長方形? 2007/01/19 19:02 シャノン

> #OOというかはマネジメントの問題ですが^^;

ま、そうでしょうねぇ。
#最初OOって何の伏字かと思ったw

# re: 正方形 is a 長方形? 2007/01/19 22:29 がんふぃーるど

>>非ユーグリッド幾何学の世界では~
なるほど、そういう考えもありますね。さしずめこの問題は正方形や長方形と言った図形をオブジェクト指向という軸に射影した場合、どのように抽象化ないしグルーピングすれば良いかってことですかね。

# re: 正方形 is a 長方形? 2007/01/20 11:50 とおりすがり

丸1日考えてもどうも違和感が。

長方形の変形について定義されていなければ
楯と横の長さが独立でもなんら問題ない気がします。

確かに答えが一つではないという部分は正しいですが
例題がよくない気がしてならないです。

# そもそも数学的な定義なら、縦と横ではなく
# 4つの辺の長さを定義してから制約をかけるべき
# なんて野暮なことを・・・。

# re: 正方形 is a 長方形? 2007/01/20 15:18 シャノン

> さしずめこの問題は正方形や長方形と言った図形をオブジェクト指向という軸に射影した場合、どのように抽象化ないしグルーピングすれば良いかってことですかね。

その通りです。
抽象化、モデリングの方法は一つではなく、唯一の正解も唯一の間違いも無いということです。
#もちろん、場合によって適切解、不適切解はありますが。

また、この「抽象化」という作業は、プログラミングに限らず、生活の中で日常的に行っているということも興味深いです。

# re: 正方形 is a 長方形? 2007/01/20 15:52 シャノン

> 長方形の変形について定義されていなければ
> 楯と横の長さが独立でもなんら問題ない気がします。

どういうことでしょう?
「数学は長方形の変形について定義していないから、縦と横の長さが独立な長方形クラスを作っても、それも『数学的な長方形』と呼んでよい」ということですか?
だとすればそれは違います。
「独立である」と「独立であってもなくてもいい」はイコールではありません。

縦と横の長さが独立な長方形を作ることは可能であり、それが適切な場合はそうすべきであることは、本文中にも書いたとおりです。
では、そのような長方形(独立長方形とでも呼びましょうか)と、「数学的な長方形」の関係はどうなるでしょうか?
ちょっと考えれば、独立長方形は、数学長方形のサブクラスになることがわかります。
サブクラスとスーパークラスはイコールではありません。

# re: 正方形 is a 長方形? 2007/01/22 21:59 Jitta

引用しているページ、違和感。。。
「縦と横」というところが、変。「直交する2辺」だろうに。「長方形から正方形を継承する」のではなく、「四角形に、長方形、正方形か検査するメソッド」じゃないかなぁ?長方形は四角形を継承しているはずで、四角形に「縦と横」なんて、ないはず。

# re: 正方形 is a 長方形? 2007/01/23 9:03 シャノン

> 「四角形に、長方形、正方形か検査するメソッド」じゃないかなぁ?

そのメソッドを四角形に持たせるのは違和感が。
基底クラスは派生クラスに関知すべきではない。

> 四角形に「縦と横」なんて、ないはず。

それも分析次第。
長方形は四角形を継承してもよく、継承しなくてもよい。

# hBzoLWflQqRroLv 2021/07/03 3:50 https://www.blogger.com/profile/060647091882378654

no easy feat. He also hit Nicks for a four-yard TD late in the game.

# bEqpRyiUWtRqmIgOPEh 2022/04/19 13:27 johnansaz

http://imrdsoacha.gov.co/silvitra-120mg-qrms

タイトル
名前
Url
コメント