東方算程譚

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

記事カテゴリ

書庫

日記カテゴリ

自然界のモデリングは如何に困難か

ネタ元 → 多重継承について問うてみた

// C#が多重継承できたと思いねぇ
class 子 : 父, 母 { ... }

...違う、こうじゃないハズ。

interface I♂ {}
interface I♀ {}
interface I親 { IEnumerable<I子> 子供たち { get; } }
interface I父 : I親, I♂ {}
interface I母 : I親, I♀ {}
interface I子 {
  I父 おとぉたま { get; }
  I母 おかぁたま { get; }
}
interface I男の子 : I子, I♂ {}
interface I女の子 : I子, I♀ {}

...ダメなんだよね。
これじゃ子供はどんなに成長しようとも親になれない、お家断絶です。
生物としての親とか子とかは生物の属性あるいは状態なワケよ。
子ができたとたんに親状態に遷移するのよね。
# 性別はインスタンス生成時に固定されるけどさ。

なので自然界のアナロジーでオブジェクト指向を語るココロミは
極めて狭い枠組みに制限しないとあちこちボロが出る
この例だと"成長/繁殖しない"という"ありえない制限"を与えにゃなりません。

わんくま東京勉強会で物議をかもした(?) 「ドラえもんモデル」では
ドラえもん は クラスなのかインスタンスなのかが揺れてたように思えます。
インスタンスとしてのドラえもん は クラスとしてのドラえもん の
シングルトン・インスタンス であったのかなー、とか。

投稿日時 : 2008年2月26日 10:21

コメントを追加

# re: 自然界のモデリングは如何に困難か 2008/02/26 11:07 シャノン

> 生物としての親とか子とかは生物の属性あるいは状態なワケよ。

しかしながら、「結婚して子供を作る」「煙草を吸う」「酒を飲む」という操作というものあって。
「可能かどうか」という属性を bool で持たせることはできるけど、その場合、子供.煙草を吸う() はコンパイルエラーにならないけど例外が出るという不恰好な実装になる(ペンギン.飛ぶ() みたいだ)。
操作自体を動的に追加・削除するのは、静的型付けの言語じゃ無理。

いや、「生物として」の属性を言うなら、赤ん坊でも煙草を吸うことはできるのよね。

ただ、クラスというのは、そのインスタンスのある側面だけを見たものであって、そのインスタンスの全てを記述するわけではない、とも言える。
自然界にあっても、成人するというような区切りを境に別のものとして見られるようになるのであれば、例えば…

I大人 子供.元服();

でクラスチェンジ、とか?

# re: 自然界のモデリングは如何に困難か 2008/02/26 11:12 επιστημη

> I大人 子供.元服();
> でクラスチェンジ、とか?

うん、その瞬間 I子供を実装したインスタンスの
参照: 子供 が消えてなくならんといかんよねー...

ホントはそじゃなくてー、インスタンス子供が元服
した途端にI子供からI大人に切り替わんなきゃいけなくて。

# re: 自然界のモデリングは如何に困難か 2008/02/26 11:16 なちゃ

なんか未来の話で大量生産されてたような気がしないでもない<ドラえもん

# re: 自然界のモデリングは如何に困難か 2008/02/26 11:18 シャノン

むー。

子供たち、おとぉたま、おかぁたまは、生物としての属性か?
場合によっちゃ、

I人間[] I人間.おとぉたまs{ get; }

というケースも…これは社会的なものだけど。

class Iヒト
{
 Iヒト 生物学的おとぉたま{ get; }
}

class I人間 : Iヒト
{
 I人間[] 社会的おとぉたまs{ get; }
 bool Add社会的おとぉたま( I男 newおとぉたま );
}

…生々しいよぉ。

# re: 自然界のモデリングは如何に困難か 2008/02/26 11:22 επιστημη

占い師「あなたには...三人のお子さんがいらっしゃいます」
男「なんだとこのインチキ占い師。俺の子供は二人だぞ!」
占い師「それはあなたがそう思ってるだけです」

# re: 自然界のモデリングは如何に困難か 2008/02/26 11:25 επιστημη

> なんか未来の話で大量生産されてたような気がしないでもない<ドラえもん

だとすればドラえもんはシングルトンですらなく、
のび太くんちに来たのは"ドラえもん型ロボット"の"いちインスタンス"ですなー。

# re: 自然界のモデリングは如何に困難か 2008/02/26 11:38 えムナウ

interface I♂ {}
interface I♀ {}
interface I人間
{
List<機能> 能力;
List<I人間> 子供;
}

機能はスタティックデリゲートかな。
子供を産める機能・産ませる機能があってそれを能力としてもつ。
I人間 の実体が無くなっても子供の I人間 は消えない。

# re: 自然界のモデリングは如何に困難か 2008/02/26 11:39 えムナウ

マツシバロボット工場にて大量生産型の子守用ネコ型ロボット1号機として誕生(0号機もいるので2機目)だそうです。

# re: 自然界のモデリングは如何に困難か 2008/02/26 11:52 アキラ

>操作自体を動的に追加・削除するのは、静的型付けの言語じゃ無理。

class Person {
map<string, function<void>> できることリスト;

public:
void Addできること(string できること, function<void> やること);

void Execute(string やること);
};


void funcたばこを吸う() {}

Person shannon;
shannon.Addできること("たばこを吸う", funcたばこを吸う);

shannon.Execute("たばこを吸う");

# re: 自然界のモデリングは如何に困難か 2008/02/26 12:05 シャノン

shannon.タバコを吸う() じゃないとやだー。
ま、俺は吸わない人ですけど。

# re: 自然界のモデリングは如何に困難か 2008/02/26 12:06 シャノン

そういえば、先日気がついたこと。
デリゲートをパブリックプロパティとして公開するとメソッドみたいに呼べる。
それだけ。

# re: 自然界のモデリングは如何に困難か 2008/02/26 12:08 アキラ

>shannon.タバコを吸う() じゃないとやだー。
んー、静的言語での動的追加ならこうなっちゃいますね
(引数はbindすればなんとでもなるし)

# re: 自然界のモデリングは如何に困難か 2008/02/26 12:37 IIJIMAS

そもそも、子と親の関係ってis-aとhas-aまたは別の関係(?)で紛らわしいと思います。

# re: 自然界のモデリングは如何に困難か 2008/02/26 13:18 επιστημη

> そもそも、子と親の関係ってis-aとhas-aまたは別の関係(?)で紛らわしいと思います。

です。生物的/社会的には子と親の関係ってのはrelationなのよね。

class 親子関係 {
public I♂ 父親;
public I♀ 母親;
public IEnumerable<Iヒト> 子供たち;
}

遺伝を継承のアナロジ(メタファ)として考えたあたりから
現実との乖離が始まるんであって。

# re: 自然界のモデリングは如何に困難か 2008/02/26 13:26 スーパーあんどちん

パパをnewしちゃイヤンとか思うわけですが。
社会的なパパならAddの中で親リストに参照を追加の方が自然に見えます。
#言語仕様上の問題?

煙草に関しては煙草オブジェクトを渡してインターフェース返すってので解決できませんかね?
shannon.あげる(煙草).吸う();
#吸わない人は渡したときに例外発生かな。
静的言語で動的に追加された未知のインターフェースのメソッドのプロトタイプってどうやって知るんだろ?

そうそう、大人と子供の違いって年齢が大きく影響すると思うので、年齢で挙動が変われば良いかと。
#マセた子供は...例外。

アドエスからなんで端折って書いてます。すいません。


# re: 自然界のモデリングは如何に困難か 2008/02/26 14:13 シャノン

> そうそう、大人と子供の違いって年齢が大きく影響すると思うので、年齢で挙動が変われば良いかと。
> #マセた子供は...例外。

「できない」と「やったら例外」にどういう違いを見出すか、という点でいつも紛糾するのですよねぇ。

# re: 自然界のモデリングは如何に困難か 2008/02/26 15:30 凪瀬

> 静的言語で動的に追加された未知のインターフェースのメソッドのプロトタイプってどうやって知るんだろ?

動的に未知のインターフェースを足す時点で静的言語のパラダイムじゃないような。
実装上はリフレクションとか、型安全ではない方法で実装可能だけど。

# re: 自然界のモデリングは如何に困難か 2008/02/26 19:36 出水

メンバ関数は一切合財なくして
全部デリゲートで実装ってのはダメですか?

# re: 自然界のモデリングは如何に困難か 2008/02/26 22:02 スーパーあんどちん

そういえば親と子供の関係であって大人と子供の関係ではなかったですね。
# ネタ元のくせに論点がわかってない。

>> 凪瀬さん
仰る通りですね。でも、タバコにしろヴァイオリンでもいいけど、特技、その人固有の行動って後で追加されるんですよね。それらをどう処理するのか?と疑問に思ったので。

# re: 自然界のモデリングは如何に困難か 2008/02/27 1:51 凪瀬

> 特技、その人固有の行動って後で追加されるんですよね。それらをどう処理するのか?と疑問に思ったので。

そんなややこしい仕様を要求されたら嫌だっていうなぁw
私なら、メソッドを意味するオブジェクトの集合をメンバとして持たせますかね。
抽象が過ぎるのでそういうプログラムをすると頭が痛くなるw

タイトル
名前
URL
コメント