東方算程譚

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

記事カテゴリ

書庫

日記カテゴリ

教え方を教わる

改めてわんくま勉強会ネタ。

毎回感心するのですよ ぢゃま いかを 氏のセッションに、
セッション内容よりその"教え方"の巧さに。

今回のは今まで以上にビビッドでした。
クラスの実体はどこか知らんが別のメモリ上に配置されてて、
変数にはその参照(すなわち実体の在り処:位置情報)が収められてる、と。

ここまではいいとして
クラスのメソッドもクラス実体の中にあるんだ
と言い切ってしまうってー"理解のためならウソも方便"
てぇとこに衝撃を覚えました。

class Foo {
  int value;
  public int getValue() { return value; }
}

たとえば↑こんなので メソッドgetValue()もvalueと一緒に
どっかのメモリ領域にまとめて置いてある

だから return value; が正しく(どのvalueか迷うことなく)valueを
返せるんだぞ、と。なるほどねぇ。

ただ、これがウソであることを何時/どのように教えてあげるのか、
がヒジョーに気になります。ヨソで知ったかぶって話して周りから
フルボッコにされはしないだろうかとか、ふと手にした技術書で
本当のことを知り愕然としないだろうか、とか。

ここらへんのデリケートなとこを ぢゃま氏 に問いただそうとするも
セッション終わるといつの間にかいなくなってる。
かるぼタンに訊くと「ついさっき帰った」ってゆーし。
新宿OST屋上にチャーターしたヘリが待ってるらしいのね。
 

投稿日時 : 2007年10月9日 11:04

コメントを追加

# re: 教え方を教わる 2007/10/09 12:14 シャノン

ぶっちゃけた話、それについてホントのことを知っていたところで、(ILを読み下すってんなら別として)何も徳は無いような…

# re: 教え方を教わる 2007/10/09 12:18 ぽぴ王子

ワタクシ、思いました。

ぢゃまさんは「本当のことを一緒に教えてしまうとわけわからんくなる」と言っていた気がするので
たぶん
「『本当のことはあとで自分で調べてね』方式でもってそのときには教えない」
というのと
「『これは便宜上こういう風に覚えておいたほうが楽だからこう説明するね』方式として便宜上の説明をする」
てのが同居するんじゃないかと。

ここで一気に説明してもいいんですけどぉ、一気に説明しちゃうときっと頭が爆発五郎に
なってしまうんでぇ、クラスのメソッドもぉ、クラスの中に実体があるっていうことでぇ
理解してもらってぇ、本当のところはあとで皆さんで調べてもらうとしてぇ…
(申し訳なさそうに)じゅうきゅうまんはっせんえーん
# フランス語で読んでください

という感じで説明なさるんじゃないでしょうか。
さすがにウソっぱちを本当だと言って説明してしまうと、EU各地で指名手配的なものになってしまうんじゃ
ないかと思うので。
ウソっていうか「一応こんな感じなんですけど」的な、泉アツノ的な?料理をしたつもりになってあらかじめ
調理してあったものが棚の下から出てくるような、キューピー3分クッキング的な?簡易的説明でその辺は
納得してもらってるんじゃないのかなあ、と。

というのは僕が勝手に考えた妄想なので、確かに本当のところを ぢゃま さんに教えていただきたいですね。
きっとわんくま勉強会の1327回目ぐらいで教えてくれると期待しているので、それまで通わなきゃですよ。

# re: 教え方を教わる 2007/10/09 12:22 凪瀬

教育における「嘘も方便」はアフターフォローが大事なんで小心者の自分は恐くてなかなか使えませんw

そういえば疑似科学の話を思い出した。
菊池誠教授がNHKの「視点・論点」で疑似科学についての批判をしていたのだけど、
科学の正確を期するゆえの曖昧さ、歯切れの悪さに対し、
疑似科学の心地よい断言ぶりが、人を惹きつけるのではないかということをおっしゃっていました。

教え方を考えるとき、正確を期するがゆえの曖昧な表現より
嘘も方便で断言する方が初学者にはわかりやすいのでしょうね。

# re: 教え方を教わる 2007/10/09 12:26 IIJIMAS

>ヨソで知ったかぶって話して周りから
>フルボッコにされはしないだろうかとか、ふと手にした技術書で
>本当のことを知り愕然としないだろうか、とか。

結局知るんですから心配無用かと。

# re: 教え方を教わる 2007/10/09 12:28 刈歩 菜良

επιさんにそこまで持ち上げられちゃうと、恐縮至極でございます。
_(_^_)_

> ここらへんのデリケートなとこを ぢゃま氏 に問いただそうとするも
> セッション終わるといつの間にかいなくなってる。
> かるぼタンに訊くと「ついさっき帰った」ってゆーし。
え~~~!!
めっちゃ悪もんになってる。
こんな会話なかったぢゃないですかぁ~。

# と、一応わたしをリアルで知らない人向けにフォローをしておいてと...

ま、シャノンさんがおっしゃるとおりなのですが...

詳しくは記事にしますねん。
# めっさ、長くなっちゃったんで。

# ご来場ありがとうございました&神々へのフォロー 2007/10/09 12:43 むりせず♪なまけず? ~ぷろくらすてぃねいたーの言い訳雑記~

ご来場ありがとうございました&神々へのフォロー

# re: 教え方を教わる 2007/10/09 14:22 Chuki

論理的には「一緒になってると思いねぇ」でいいやないかなぁ、なんて^^;
実装に興味を持ち始めたら、いずれ分ることですし。
論理的なカプセル化と実装の話って一緒にするとワケわからんようになりそう。

このあたり、オブ熱で暑く騙って欲しい気がしますです。

#ひょっとして、メモリ配置とか、物理的なお話されてたのかな。やと、このコメントはズレまくりスマソです m(_ _(m

# re: 教え方を教わる 2007/10/09 15:06 επιστημη

んー、僕がRealにこだわってるだけのことかも知れんけど。
いやね、僕らプログラマはIdeal世界をReal世界で表現するのがお仕事やないですか。
そんな役目を仰せつかってる身であるからにはRealを知らんでは済まされんと思うわけですよ。
メモリやCPU,デバイスに至るまでRealを求めてはいないけど、
IdealをReal化するに必要なReal:"準Real"までは理解してなあかんだろうと。
で、そう考えたときに「メソッドもインスタンスの中」って理解でも"準Real"と言えるんだろか...てな思いなんですよね。

うー、わけわからんくなってきたか。

# re: 教え方を教わる 2007/10/09 16:24 Fujiwo

だから (謎)「仕組み」の話と「概念」の話は別の話としてそれぞれ重要だとあれほど (謎)……

# re: 教え方を教わる 2007/10/09 16:50 シャノン

> 「メソッドもインスタンスの中」って理解でも"準Real"と言えるんだろか

十分だと思いますけどねぇ。

# re: 教え方を教わる 2007/10/09 17:42 シャノン

拡張メソッドが絡むとややこしいかもしれない。
拡張メソッドは(C#の文法上も明確に)オブジェクト自体とは別に定義されるのだから、非拡張メソッドも同じように教えるべきだと言うか、逆に、拡張メソッドも非拡張メソッドも使う側からは区別しないのだから、どちらの場合でも区別しなくてよいと言うか…

# re: 教え方を教わる 2007/10/09 18:23 刈歩 菜良

ふぅ、やっとこさちょっとコメントできます。

クラスの概念から言うと、「データとそれにまつわる処理が一塊になっている」という部分を理解するには処理(メソッド)はインスタンスの中になきゃいけません。

でも、実装でそれをやっちゃうと無駄が多いので、実際の処理は共通化されて別個で取られています。

でも、それは実装の都合であって、クラスの概念とは関係ない世界のお話なのです。

だから、例えば、私の書く俺流メモリー図のように各インスタンスがメソッドの処理コードを持っている実装を作っても、他のところでつじつまが合えば、間違えではないわけなのです。

C++でいうところの、inlineキーワードなんていうのは、まさに関数呼び出しの形をしていながら、実際にはコードのコピペで、さらには、実際にinline化されているかどうかは関数の中身やらコンパイラの最適化レベルやら環境やらなどなどで、どう実装されるかは少なくともソースコードレベルだけでは分からない訳です。

これと同じと考えてみると、いかがでしょうか?

# re: 教え方を教わる 2007/10/09 18:25 刈歩 菜良

あ、↑のコメントはC++をご存知の方向け(かつ、inlineキーワードをご存知の方向け)のコメントです。
わからない方ごめんなさい。
_(_^_)_

# re: 教え方を教わる 2007/10/09 18:26 刈歩 菜良

予断ですが、
こういう議論できるって、ちょーーーたのすぃーーー!!
\(●^o^●)/

# re: 教え方を教わる 2007/10/09 18:27 刈歩 菜良

s/予断/余談/

# 連投すみません。_(_^_)_

# re: 教え方を教わる 2007/10/09 18:50 シャノン

ちなみに最近、.NETやらJavaやらであっても、「CPUの仕組みを知っているといないとでは差が出る」とかいうコメントを聞いて、「そりゃ差が出る局面が絶対に無いとは言わないけど、普通は知ってる必要は無いだろ」と思っていたりします。

# re: 教え方を教わる 2007/10/09 19:40 Chuki

でも、やっぱり知ってて欲しいのよねぇ。
#自己矛盾^^;

# 異国の人のほうが日本語が達者♪(←多分エントリタイトルとして間違っている。) 2007/10/09 20:23 とりこびと ぶろぐ。

異国の人のほうが日本語が達者♪(←多分エントリタイトルとして間違っている。)

# re: 教え方を教わる 2007/10/09 21:07 Gushwell

マジレスです。
もし、僕がC言語しか知らなくて、オブジェクト指向についてもまったく知識がないときに聞いても、
「そんなバカなはずは無いっ」て、疑問に思うと思うんです。
だから、そういった教え方はどうなのかなぁ?

アセンブラを勉強しろ、とは言わないけど、
CPUの基本的な仕組みは知るべきだとおもうなー

# re: 教え方を教わる 2007/10/09 21:44 επιστημη

C知ってるヒトには違和感ばりばりっしょーね。
そんときゃ"隠れた引数this"を持ち出すんでねぇのかなやっぱ。

# re: 教え方を教わる 2007/10/10 0:20 やまだ

出遅れました。
最初、値型と参照型を区別してるのに、どうしてメソッドだけ区別がないのだと、そこが引っかかりましたね。
刈歩さんの「データとそれにまつわる処理が一塊になっている」というのはわかるのですが、でもそれだと、this.method() と super.method() を呼び分けられる理由が説明できないような。
やはりメソッド自体も参照型になっている、という考えの方がしっくりくるような。

>結局知るんですから心配無用かと。
いやっ、それは違うぞIIJIMASさんっ!
知ったときの混乱を最小限にし、いかにソフトランディングさせるか、というのは大事だと思う。

あとεπιさんと刈歩さんの言葉の使い方にちょっとだけ違和感。
「クラス実体」というと初心者にとっては「realクラス」のイメージで解釈されたりしないかと。
「インスタンス」というのも「クラス」に対する相対概念であって、単独で用いる場合には「オブジェクト」の方が適当ではないか。
とか思ったりします。

# 嘘も方便と単なる嘘と言葉足らず 2007/10/10 9:16 ユビキタス世界までの道の駅

嘘も方便と単なる嘘と言葉足らず

# re: 教え方を教わる 2007/10/10 21:02 Gushwell

>そんときゃ"隠れた引数this"を持ち出すんでねぇのかなやっぱ。

Cやってたときは、構造体のポインタを第1引数に渡すってのが、僕の関数設計のパターンでした。

なので、拡張メソッドの話を聞いたときには、
古いものと新しいものの組み合わせで、発明をするってののとても良い例だなーって関心しました。

# re: 教え方を教わる 2007/10/12 15:28 刈歩 菜良

あっ!
こっちまだ続いてたんですね。
すんません。いまさら気づいちゃいました。

> でもそれだと、this.method() と super.method() を呼び分けられる理由が説明できないような。

そんなことはないのです。
詳しくは、最終回で。
(^v^)

# ちなみに、C#だとsuperではなくてbaseですね。

タイトル
名前
URL
コメント