東方算程譚

Oriental Code Talk ── επιστημηが与太をこく、弾幕とは無縁のシロモノ。

目次

Blog 利用状況

ニュース

著作とお薦めの品々は

著作とお薦めの品々は
東方熱帯林へ。

あわせて読みたい

わんくま

  1. 東京勉強会#2
    C++/CLI カクテル・レシピ
  2. 東京勉強会#3
    template vs. generics
  3. 大阪勉強会#6
    C++むかしばなし
  4. 東京勉強会#7
    C++むかしばなし
  5. 東京勉強会#8
    STL/CLRによるGeneric Programming
  6. TechEd 2007 @YOKOHAMA
    C++・C++/CLI・C# 適材適所
  7. 東京勉強会#14
    Making of BOF
  8. 東京勉強会#15
    状態遷移
  9. 名古屋勉強会#2
    WinUnit - お気楽お手軽UnitTest

CodeZine

  1. Cで実現する「ぷちオブジェクト指向」
  2. CUnitによるテスト駆動開発
  3. SQLiteで組み込みDB体験(2007年版)
  4. C++/CLIによるCライブラリの.NET化
  5. C# 1.1からC# 3.0まで~言語仕様の進化
  6. BoostでC++0xのライブラリ「TR1」を先取りしよう (1)
  7. BoostでC++0xのライブラリ「TR1」を先取りしよう (2)
  8. BoostでC++0xのライブラリ「TR1」を先取りしよう (3)
  9. BoostでC++0xのライブラリ「TR1」を先取りしよう (4)
  10. BoostでC++0xのライブラリ「TR1」を先取りしよう (5)
  11. C/C++に対応した、もうひとつのUnitTestFramework ─ WinUnit
  12. SQLiteで"おこづかいちょう"
  13. STL/CLRツアーガイド
  14. マージ・ソート : 巨大データのソート法
  15. ヒープソートのアルゴリズム
  16. C++0xの新機能「ラムダ式」を次期Visual Studioでいち早く試す
  17. .NETでマンデルブロ集合を描く
  18. .NETでマンデルブロ集合を描く(後日談)
  19. C++/CLI : とある文字列の相互変換(コンバージョン)
  20. インテルTBBによる選択ソートの高速化
  21. インテルTBB3.0 によるパイプライン処理
  22. Visual C++ 2010に追加されたSTLアルゴリズム
  23. Visual C++ 2010に追加されたSTLコンテナ「forward_list」
  24. shared_ptrによるObserverパターンの実装
  25. .NETでマンデルブロ集合を描く(番外編) ── OpenCLで超並列コンピューティング
  26. StateパターンでCSVを読む
  27. 状態遷移表からStateパターンを自動生成する
  28. 「ソートも、サーチも、あるんだよ」~標準C++ライブラリにみるアルゴリズムの面白さ
  29. インテルTBBの同期メカニズム
  30. なぜsetを使っちゃいけないの?
  31. WPFアプリケーションで腕試し ~C++でもWPFアプリを
  32. C++11 : スレッド・ライブラリひとめぐり
  33. Google製のC++ Unit Test Framework「Google Test」を使ってみる
  34. メールでデータベースを更新するココロミ
  35. Visitorパターンで遊んでみたよ
  36. Collection 2題:「WPFにバインドできる辞書」と「重複を許す検索set」
  37. Visual C++ 2012:stateless-lambdaとSQLiteのぷち拡張
  38. 「Visual C++ Compiler November 2012 CTP」で追加された6つの新機能

@IT

  1. Vista時代のVisual C++の流儀(前編)Vista到来。既存C/C++資産の.NET化を始めよう!
  2. Vista時代のVisual C++の流儀(中編)MFCから.NETへの実践的移行計画
  3. Vista時代のVisual C++の流儀(後編) STL/CLRによるDocument/Viewアーキテクチャ
  4. C++開発者のための単体テスト入門 第1回 C++開発者の皆さん。テスト、ちゃんとしていますか?
  5. C++開発者のための単体テスト入門 第2回 C++アプリケーションの効率的なテスト手法(CppUnit編)
  6. C++開発者のための単体テスト入門 第3回 C++アプリケーションの効率的なテスト手法(NUnit編)

AWARDS


Microsoft MVP
for Visual Developer - Visual C++


Wankuma MVP
for いぢわる C++


Nyantora MVP
for こくまろ中国茶

Xbox

Links

記事カテゴリ

書庫

日記カテゴリ

むかしばなし

昔々、です。
まだヒヨッコだった僕が覚えたてのオブジェクト指向をレクチャしてたとき…

たとえば、だ。 "鳥"ってクラスを考える。
"鳥"は飛ぶけど、その飛び方はスズメとカモメじゃ違うな。
そんなとき、virtual てーのを使うんだ:

class 鳥 {
public:
  virtual void 飛ぶ() =0;
  ...
};

ん? ああ、ケツについた =0 ね。これは"鳥"は抽象的なもので、
これ自体は飛べない。"鳥"から導出した"スズメ"とか"カモメ"とか、
具体的なクラスでないと"本当に飛ぶ"ことはできない。
"飛ぶ"ってふるまいを宣言だけしとく、ってことだな。

ここで質問の手が挙がる。
ペンギンはどうしましょう?」 ← (なかばお約束の質問)

…ヒヨコだった当時の僕は答に窮しました。
でも今なら自信をもって答えられます。

「"飛ぶ"というふるまいを持つものを"鳥"と定義したのだ。
 だからこの世界においてペンギンは鳥じゃない

今になって考えるに、これこそがモデリングってやつだよなって思う。

投稿日時 : 2006年11月23日 22:44

コメントを追加

# re: むかしばなし 2006/11/23 23:31 中博俊

いや、あれは鳥です。
Is羽毛はTrueだし、卵を温め()ます。
なので、実際には


virtual void 飛ぶ()
{
throw new NotInplementException();
}

virtual bool Is空を飛ぶ()
{
return false;
}
なのです。

# re: むかしばなし 2006/11/23 23:49 επιστημη

そうくると思った (^^

virtual void 飛ぶ() {
 throw new NotInplementException();
}

これは "飛べば失敗する" であって
"飛ばない/飛べない" ではないよな。

つまりは"鳥"設計者が"飛ぶ"を如何に考えているか、なんだけど。
"(ちゃんと)飛ぶ"ことが鳥の必要条件であるなら、ペンギンは鳥じゃない。

さもなくば"飛ぶ"は鳥の必要条件ではなく、
interface 飛べる { void 飛ぶ(); }
class 鳥 { ... }
class ペンギン : 鳥 { ... }
class スズメ : 鳥, 飛べる { ... }

# re: むかしばなし 2006/11/24 0:25 かるあ

ペンギンの場合
飛ぶという遺伝子は残っているけれど飛べないと考えると、中さんのほうがしっくりくるんですがどうでしょう。

# re: むかしばなし 2006/11/24 1:38 まどか

抽象化工程の話と抽象クラスを利用する話とがあり

>"(ちゃんと)飛ぶ"ことが鳥の必要条件であるなら、ペンギンは鳥じゃない。

は、ペンギンが鳥を利用できるか?っていう話ではないですかね?
鳥が飛ぶを持つか持たないかは抽象化設計の結果なので
話にその背景が無いとあーだこーだに是非は無いんではないかと。。。
#実際に抽象化対象の業務オブジェクトにペンギンがいたかどうか。

# re: むかしばなし 2006/11/24 1:50 RUN

>Is羽毛はTrueだし、卵を温め()ます。
つカモノハシ

まぁ、それはおいといて、ペンギンだと

virtual bool Is水の中を飛ぶ()
{
return true;
}

ってとこかな?

# 挨拶忘れてたorz 2006/11/24 1:51 RUN

と言うことで、前後しますが。
初めましてRUNと申します。

# re: むかしばなし 2006/11/24 2:18 恣意の

>interface 飛べる { void 飛ぶ(); }
>class 鳥 { ... }
>class ペンギン : 鳥 { ... }
>class スズメ : 鳥, 飛べる { ... }

ふとHONDAを思い出した(ぇー
(「バイクに羽をくっつけて~」って奴でふ)

モデリングに関しては何にも言えない・・・
まず"鳥"がどデカイカテゴリだから全員が納得する回答って難しそうなんだもの

# クソ真面目に"界/門/綱/目/科/属/種"から定義すりゃ何とかなる?
# んでもRUNさんの"カモノハシ"は"哺乳類"なのに"卵"を産む矛盾もあるしなぁ

# re: むかしばなし 2006/11/24 6:25 επιστημη

全員が納得するのは無理っちゃ無理ですわね。
モデルを創ったデザイナの視点でしかないんだから。

スズメだろがカモメだろが雛は飛べないし卵産まない。
ある一定の条件を満たしたとき、飛べる/卵産むようになる。
雛も鳥だと認めるならば"飛ぶ"の実装はこんな:

void 飛ぶ() {
 if ( 飛べない ) {
  throw new ごめんなさい飛べないの;
 }
 ...
}

してみるとペンギンは"飛べない"フラグがtrue固定と
考え、やはりペンギンは鳥とすることもできる。

けども、ここでの"飛べない"はインスタンスの属性
であるのに対し、ペンギンの"飛べない"はクラスの属性。
この二つを同一視するのは問題かとも思う。

…おもろいおもろい。議論になるなこりゃ (^^

# re: むかしばなし 2006/11/24 6:49 επιστημη

> 鳥が飛ぶを持つか持たないかは抽象化設計の結果なので
> 話にその背景が無いとあーだこーだに是非は無いんではないかと。。。
> #実際に抽象化対象の業務オブジェクトにペンギンがいたかどうか。

ごもっともです。
モデラーが構築する世界にペンギンはいない(飛ばない鳥は存在しない)なら
"ペンギンはどーよ?"って問いそのものが無意味ですしね。

# re: むかしばなし 2006/11/24 7:12 επιστημη

RUNさんはじめまして、ドゾよろしく。

>> Is羽毛はTrueだし、卵を温め()ます。
>> つカモノハシ

自然界にアナロジーを求めることの限界を感じますね。
多くの場合に"例外"が見つかりますから。

オブジェクト指向を教えるのに哺乳類だの犬だの猫だのを引き合いに出すことはよぉやられます。
卑近な例だしほとんどの人が共通認識をもっているからアナロジーのネタとしては便利なのだけど、
それがかえって"オブジェクト指向ワッカンネー"の理由のひとつになってるようにも思います。

# re: むかしばなし 2006/11/24 7:35 rinda

オブジェクト指向白帯ですが交ぜてくださいっ!

紅の豚は飛行機によって飛べますが(クラス鳥)、飛べなくなったらただの豚(クラス豚)になってしまいますか?

それとも飛べない豚も紅の豚(鳥クラス)にすべきなのでしょうか。

# re: むかしばなし 2006/11/24 7:50 かるあ

> rinda さん
紅の豚の場合飛べますが、卵は産まないし、
クラス豚を継承 して インターフェース飛ぶ を実装しているんですかね。

# re: むかしばなし 2006/11/24 7:57 rinda

飛ぶというふるまいをするものが鳥 と定義した場合でも"紅の豚"は鳥ではないのですか?

そもそも鳥は卵を産むという定義はどこから来たのでしょうか?

# re: むかしばなし 2006/11/24 8:03 επιστημη

おもしれー♪

「"飛ぶ"責務さえ履行できれば"鳥"」ならば、
"紅の豚"は"鳥"なんだろな。

「飛べなくなったらただの豚か?」難しい。
"飛べない"がインスタンスの状態ならば、
"羽根を怪我して飛べないスズメ"や
"ガス欠の飛行機"と同じやね。

# re: むかしばなし 2006/11/24 8:24 rinda

飛ぶ豚も、飛ばない豚も、豚クラスなのでしょうか。

"飛ぶふるまいをするものが鳥"と定義した場合に、豚の定義に"飛ぶふるまいをしないものが豚"とあればうまくいきますかね?

その場合なら、
紅の豚は鳥クラス。飛べない豚は、豚クラス。になりますね。

# re: むかしばなし 2006/11/24 8:34 rinda

なんかごっちゃになってきましたがさらにごっちゃにしてもいいですか(笑

飛べない豚が、「ただの」豚とするなら、飛べる豚は「ただではない」豚という要素を持つことになるような気がします。

豚クラスを基底クラスとして、"ただの豚クラス"と"ただではない豚"クラスを作るとします。

ただの豚の定義は "飛べない"
ただではない豚の定義は "飛べる"
とします。

紅の豚はどうなりますかね・・・

紅の豚は飛べるので"ただではない豚クラス"ですよね、しかし飛べるので"鳥クラス"とも言えますよね?多重継承!?

これで、あの名台詞、「飛べない豚はただの豚だ」が実装できたことになるでしょうか?

# re: むかしばなし 2006/11/24 8:37 rinda

「飛べない豚はただの豚だ」

じゃあ飛べる豚は?





鳥!?

オブジェクト指向って楽しいですね(笑

# re: むかしばなし 2006/11/24 9:12 taka

鳥のクラスに「飛ぶ」があって,そこから派生した具体的「個別鳥種」で「Can飛ぶ」がdefaultでtrueでもよいですが,その個別鳥種のひとつひとつのインスタンスのなかには,怪我をしてたりして "Can飛ぶ" がfalseな子もいるのではないでしょうか.

ペンギンは鳥から派生するけれど,"Can飛ぶ"がdefaultでfalseとなる個別鳥種とするのに一票です.

# re: むかしばなし 2006/11/24 9:30 かるあ

ずいぶん話が進んでいますねw
>飛ぶというふるまいをするものが鳥 と定義した場合でも"紅の豚"は鳥ではないのですか?
確かにどんな手続きをしても飛ぶことができるものを鳥とすれば、"紅の豚"も鳥になりますね。

そうすると、飛行機を操縦したりする人間も。。。鳥?

> これで、あの名台詞、「飛べない豚はただの豚だ」が実装できたことになるでしょうか?
マルコの飛ぶという行為はクラス飛行機に委譲しているような気がしないでもない。

# re: むかしばなし 2006/11/24 10:27 επιστημη

> ペンギンは鳥から派生するけれど,"Can飛ぶ"がdefaultでfalseとなる個別鳥種とするのに一票です.

当然ながら意見の分かれるとこなんだろうと思う。
その"Can飛ぶ"はペンギンの場合クラスの属性でねぇの? インスタンスの属性ではなく。

"飛べない鳥などいない/飛びさえすりゃ鳥"世界をモデリングしているなら、
クラス"鳥"は"飛ぶ"責務を必ず持つし、紅の豚も竹トンボも鳥でありペンギンは鳥じゃない。

が、"飛べない鳥も鳥は鳥"世界なら"鳥"に"飛ぶ"責務を与えちゃならん。
"飛べる?()"メソッド/プロパティは飛ぶことが前提であるもののインスタンスの状態なんだと思う。
その世界においては:

interface 飛べる { void 飛ぶ(); bool 飛べる?(); }
class 鳥 { ... }
class ペンギン : 鳥 { ... }
class 白鳥 : 鳥, 飛べる { ... }
class 紅の豚 : 飛べる { ... }

なんだべな。

# 正解はないのよ。モデラーが創造する世界なんだから。
# "メリケン粉まぶして揚げて食えれば鳥"とする世界だって創れるしー

# re: むかしばなし 2006/11/24 10:37 刈歩 菜良

しらないうちにとっても楽しいことになってるやん!!
いまさらだけど、混ぜて混ぜて!

紅の豚に飛べるインターフェイスを継承さしちゃうのに反対!!
なぜなら紅の豚は自力飛行ぢゃないから。

class 飛行機{...}
class 豚{...}

飛行機 my飛行機 = new 飛行機();
豚 紅の豚 = new 豚();
my飛行機.pilot = 紅の豚;

てのはどう?

> # 正解はないのよ。モデラーが創造する世界なんだから。
そうですよね。だからオブジェクト(の話)はおもろい!

# re: むかしばなし 2006/11/24 10:42 囚人

乗り遅れた。さらにまぜてやる!

そもそも継承を使うシーンじゃない。包含です、包含。そして「飛ぶ」はインターフェースだ。

「飛ぶ」なんてかなり実装が難しいメソッドをいちいち実装してらんない。しかも鳥によって飛び方は微妙に違うから完全コピペもしくは実装継承というわけにもいかん。しかも豚は飛行機を使うときたもんだ。

「飛ぶメソッド」で「羽クラス」まはた「飛行機クラス」に委譲したらよろし。ペンギンクラスは「バタ足クラス」に委譲する。

# re: むかしばなし 2006/11/24 10:57 επιστημη

> 紅の豚に飛べるインターフェイスを継承さしちゃうのに反対!!
> なぜなら紅の豚は自力飛行ぢゃないから。

ふふふ、それはどうかな。 囚人さんの移譲案を使えば:

class 飛行機 : 飛べる { ... }
class 紅の豚 : 飛べる { ... }

void 紅の豚.飛ぶ() {
 飛行機 my飛行機 = new 飛行機();
 my飛行機.pilot = this;
my飛行機.飛ぶ(); // つか"飛べ!"
}

かもよー♪

# re: むかしばなし 2006/11/24 11:07 επιστημη

あ、こーゆーのもある。

飛行機は飛べない。パイロットがいなければ。
パイロットは飛べない。翼をもたないから。
けども、"パイロットと飛行機のペア"は飛べる。

"関係もクラスとなる"ってやつね。

# re: むかしばなし 2006/11/24 11:34 επιστημη

「せやけどな、紅の豚なんちゅークラスに意味あんのんかい」
「なんでやねんな」
「つまりな、紅の豚クラスこさえたところでインスタンスは
 宮崎なんとかはんのこさえた一個だけやろ」
「せやな。そないなクラス/インスタンスを'シングル豚'ゆーねん」

いまεπιがうまいこと言った!

# re: むかしばなし 2006/11/24 11:35 とりこびと

はじめまして。とりこびとと申します。
寄せられているコメントを含めまして、実に興味深く拝見させていただいておりました。

># 正解はないのよ。モデラーが創造する世界なんだから。
># "メリケン粉まぶして揚げて食えれば鳥"とする世界だって創れるしー

これを見たときに初心ながらいままでモヤモヤしていた部分が晴れた思いでした。ありがとうございます。と、押し付けがましく御礼に参った次第です。

#あ、から揚げはとても好きです。

# re: むかしばなし 2006/11/24 12:01 とっちゃん

あ、もうオチが付いてるのか。

面白く拝見しましたw

えー、顧客から、こんな要望が

ダチョウを食べるから、鳥に入れろと
希少種を保護しなければ、いけないからヤンバルクイナも鳥に入れろとw
でもって、唐揚げの基本は鶏だから、鳥に入れろとw

#ユーザーとは書くもわがままなものなりw

※ダチョウ/ヤンバルクイナ...走ることに特殊化された鳥
※鶏...個体により飛ぶことを「放棄」した鳥

#燃料投下完了w

# re: むかしばなし 2006/11/24 12:32 επιστημη

とりこびとさん、どもども。ちったーお役に立てましたかしら。

とっちゃん遅いって。せっかくのオチが霞んで見えんくなっちまったやんかー

# 週末のPageViewハネ上がるんだろーなー。
# "飛ぶ鳥"を落とす勢いってやつで。
# ↑ここ! ここでウケて!

# re: むかしばなし 2006/11/24 12:52 かずくん

乗り遅れた... orz

トビウオも飛んでるじゃねーか!とのクレームが出てますw。

# re: むかしばなし 2006/11/24 13:19 επιστημη

乗り遅れてますねぇ ^^;
そろそろ第二便出発の模様です
話題はもはや"飛ぶ"から"食う"へ。

モデラーが陳健一シェフならば、
四足は椅子とテーブル以外、ハネのあるもんなら飛行機以外なんでも"食いもん"です(きっと)。

# 帰りにちょっと呑もっと。
# ハツとカシラ二本づつ塩で。
# …ほら、豚も鳥だ(焼けば)!

# re: むかしばなし 2006/11/24 13:24 とっちゃん

受けたw
επιστημηさんに座布団一枚あげて

>とっちゃん遅いって
いやぁ。。。夜のPC稼働状況は、DDO一色なのでw<おい!

#これでも、朝の巡回ルートではトップのほうなんですがねぇ...w

# re: むかしばなし 2006/11/24 14:34 ghost_shell

完全に入るの遅いですね。

継承は分かりやすく、手続き型言語にはない特徴であるため、どの本でも解説される。

けど、囚人さんが書いているコンポジションによる委譲というやり方を別の手段として教えているのは割と少ないと思う。

正しい設計が存在すると限らなければ、正しい設計が最適ではないことも結構多いっていうのが難しいところだと思う。

>けども、ここでの"飛べない"はインスタンスの属性
>であるのに対し、ペンギンの"飛べない"はクラスの属性。
>この二つを同一視するのは問題かとも思う。

これについてのエレガントな解決策があれば知りたいですね。

# re: むかしばなし 2006/11/24 16:11 かずくん

> けど、囚人さんが書いているコンポジションによる委譲というやり方を別の手段として教えているのは割と少ないと思う。

以前から、継承はis-a、リレーション、コンポジションはhas-a
っていう解説は割と見るけどなぁ。

Effective C++には、そこいら辺のことがきちっと解説してありますね。

# re: むかしばなし 2006/11/24 18:48 rinda

おお!かなり伸びてる(笑

深いですねー・・・もっと勉強せねばっ!

# re: むかしばなし 2006/11/24 22:06 Jitta

あ・・・
昼に書いておいたのだが、(__;

# re: むかしばなし 2006/11/25 2:43 RUN

ペンギンがから揚げや焼き鳥にして食べれるかどうかはおいといて、
シングルトンそういう意味だったのか( ..)φメモメモ(違

# re: むかしばなし 2006/11/25 15:46 アクア

まったくの脱線ですけど、『紅の豚』の主人公の名前はマルコだったのか…
今までポルコだと思っていた。(ーー;)
ポルコならポルトガル語で『豚』と言う意味なのですが…。

# re: むかしばなし 2006/11/27 0:18 かるあ

> アクアさん
豚になる前の名前が マルコ なだけで
空飛ぶ豚は ポルコ で間違いないっす。

ウィキペディア
http://ja.wikipedia.org/wiki/%E7%B4%85%E3%81%AE%E8%B1%9A

# Visual Basic で○○を作ってみよう。その2。 - クラスとかつくってみたらええやん。- 2007/05/01 10:24 とりこびと ぶろぐ。

Visual Basic で○○を作ってみよう。その2。 - クラスとかつくってみたらええやん。-

# Great looking website. Presume you did a bunch of your very own coding. 2021/11/03 16:33 Great looking website. Presume you did a bunch of

Great looking website. Presume you did a bunch of
your very own coding.

# Love the site-- really user friendly and great deals to see! 2021/11/04 21:58 Love the site-- really user friendly and great dea

Love the site-- really user friendly and great deals to see!

タイトル
名前
URL
コメント