東方算程譚

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パターンの実装

@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

記事カテゴリ

書庫

日記カテゴリ

ちがうだろぉ!?

ネタ元 → ぼけ損ねたエントリにつっこみ損ねた件

イベントハンドラ名は
 イベント センダ名、アンダースコア、およびイベント名を組み合わせた
 標準名前付け規則を使用します。(あくまで推奨です。)
 例: Private Sub member_DisplayNameChanged(....)

ゴーマンかますのを許していただけるなら、
こんなケッタイな名前付け規則を推奨すんなよ」と。

たとえば、だ。腕をマムシに噛まれたとするわ。

class 兵士 : 国民 {
  public 兵士() {
    腕.Onマムシに噛まれた += new 噛まれたハンドラ(腕_マムシに噛まれた);
  }
  private void 腕_マムシに噛まれた() {
    傷口をナイフで切り裂き
    急いで口で吸え
  }
}

...違うだろ。そのメソッド名は違うだろ
メソッド名は"なにをする"かを表す名前であるべきで、
"デキゴト"の名前であってあっちゃならんだろ。

class 兵士 : 国民 {
  public 兵士() {
    腕.On毒蛇に噛まれた += new 噛まれたハンドラ(対毒蛇応急処置); // ※
  }
  private void 対毒蛇応急処置() {
    傷口をナイフで切り裂き
    急いで口で吸え
  }
}

でなくちゃならんだろ。
こうしておけば腕噛まれようが太腿噛まれようが、
マムシが噛もうががハブが噛もうがメソッド名は安定するわな。

"デキゴト"とそれが起きたら"なにをする"かの対応は
イベントとハンドラを対応付けたんとこで表現されてるやんか。

void ボタン_押された() { 歌う }

なんてコード書いといて、お客さんのわがままで歌わす条件が
コロコロ変わるたんびにメソッド名を書き換えろってか!?

# と、キレーゴトを抜かしてみる ^^;

投稿日時 : 2007年10月24日 13:15

コメントを追加

# re: ちがうだろぉ!? 2007/10/24 13:23 とりこびと

正直なところ・・・自分でも違和感バリバリです。>名前付け規則

おっしゃられるとおり「何をするか」がメソッド名であってほしいと思っています。

といいつつも Visual Studio が自動生成するコードのメソッド名を変更しないことがおおい現実。orz

# re: ちがうだろぉ!? 2007/10/24 13:38 επιστημη

うんうん。

さりとてIDEが"なにをする"かを察してくれるほど
賢くも薄気味悪くもないので:

class 兵士 : 国民 {
 public 兵士() {
  腕.Onマムシに噛まれた +=
   new 噛まれたハンドラ(腕_マムシに噛まれた);
 }
 private void 腕_マムシに噛まれた() {
  対マムシ応急処置();
 }
 private void 対マムシ応急処置() {
  傷口をナイフで切り裂き
  急いで口で吸え
 }
}

ってなワンクッションかますことがしばしば。

# re: ちがうだろぉ!? 2007/10/24 14:26 シャノン

ちなみに、この命名規則は(C#も)VB6をひきずっていて、VB6にはHandles句が無かったので、イベントハンドラ名だけがオブジェクトとメソッドを結びつけるものでした。…たぶん。

# re: ちがうだろぉ!? 2007/10/24 15:39 とりこびと

おや?消えてる?w

# re: ちがうだろぉ!? 2007/10/24 15:58 επιστημη

ふぇ?

# re: ちがうだろぉ!? 2007/10/24 17:05 とりこびと

あ、じゃんぬさんのコメントありませんでしたっけ?(^^;

# re: ちがうだろぉ!? 2007/10/24 17:30 επιστημη

あー、バケバケのがくっついてたんで消したんですけど、
じゃんぬさんには失礼なことしちまったかすら。
再投下よろしくっす > じゃんぬさん

# re: ちがうだろぉ!? 2007/10/24 19:08 Imabeppu

イベントハンドラとか、コールバック関数とかは、
漠然とそういう名前の方がしっくりきてしまいます。
( おかしいんだろうか…… ^^; )

「背中をぽんとたたかれたら走ってね」というとき、
その人には「背中をたたかれた」ということが知らされて、
それを受けて「走れ」と指令を自分自身に出すような。
そうしとくと、「背中をぽんとたたかれたら走ったあとに歌ってね」もできるし。

最初の例ならこんな感じかしら。

class 兵士 : 国民 {
public 兵士() {
腕.Onマムシに噛まれた += new 噛まれたハンドラ(腕_マムシに噛まれた);
}
private void 腕_マムシに噛まれた() {
対毒蛇応急処置();
}
private void 対毒蛇応急処置() {
傷口をナイフで切り裂き
急いで口で吸え
}
}

# re: ちがうだろぉ!? 2007/10/24 19:32 RUN

そもそも、リアクション(イベント)とメソッド(アクション)を同列に扱おうと言う事が全ての間違いと言う気もします。

イベントってのはそもそも、発生した事象(トリガー)を受け取る事が目的でそれに対するリアクションを決める場所で、アクションそのものをする場所ではないよね?(間違ってたらゴメン)

VB表記になるけどこんな感じ?(シグネチャ省略)

private sub 咬まれた() Handles 咬んだのはマムシ,噛んだのは小島よ○お
dim 気分 as string = 痛みを我慢(痛さ)
call 治療する(気分)
end sub

private function 痛みを我慢(どの位の痛さ) as string
Select どの位の痛さ
case とても痛い
return "我慢できない"
case すこし痛い
return "我慢できる"
case へたこいた~
return "でもそんなの関係ねぇ~"
case else
return "実は痛くない"
End Select
end function

private sub 治療する(気分)
Select 気分
case "我慢できない"
call 病院へ行く()
……
case "我慢できる"
call 薬を塗る()
……
case "でもそんなの関係ねぇ~"
call オッパッピ~()
……
case else
……
End Select
end sub

# re: ちがうだろぉ!? 2007/10/24 19:59 επιστημη

んむ、そぉね。
少なくともイベントハンドラそれ自体にイベントセンダ名をくっつけちゃうのはヤですねぇ。
複数のイベントを捕まえるハンドラに名前が付けられんくなるし。

どこを噛まれたか・どう噛まれたかはハンドラの引数で判断できるだろから、ハンドラ名は(名前の重複が起こらぬならば) "噛まれた" でいいよねぇ。

# re: ちがうだろぉ!? 2007/10/24 21:08 Imabeppu

んだんだ。 > RUNさん

# re: ちがうだろぉ!? 2007/10/24 21:13 Imabeppu

どうするのがよいのか、なんだかもやもやします。

ハンドラ名は「噛まれた」でいいのかどうか。

電卓はボタンが押されたハンドラは「押された」なのか。
数字ボタンと電源ボタンのハンドラはやっぱり分けた方がよいのではないのか。
そうすると、「数字押された」「電源押された」になってしまうのか。
おもちゃのような電卓があって、押された数字によっていろいろなことが起こるのなら、「[1] 押された」「[2] 押された」になってしまうのか。

ここらへんが「名前の重複が起こらぬならば」になりますか?
もやもや

# re: ちがうだろぉ!? 2007/10/24 22:03 επιστημη

んー、そこらへんは各人のもやもや次第なんかも知れません。

ぶっちゃけWin32-message-loopみたく:

private void なにかが起こった(Msg m) {
 switch ( m.WPARAM ) {
 case WM_COMMAND:
  ...
}

でもいいわけだし。

タイトル  
名前  
URL
コメント