何となく Blog by Jitta
Microsoft .NET 考

目次

Blog 利用状況
  • 投稿数 - 761
  • 記事 - 18
  • コメント - 37042
  • トラックバック - 222
ニュース
  • IE7以前では、表示がおかしい。div の解釈に問題があるようだ。
    IE8の場合は、「互換」表示を OFF にしてください。
  • 検索エンジンで来られた方へ:
    お望みの情報は見つかりましたか? よろしければ、コメント欄にどのような情報を探していたのか、ご記入ください。
It's ME!
  • はなおか じった
  • 世界遺産の近くに住んでます。
  • Microsoft MVP for Visual Developer ASP/ASP.NET 10, 2004 - 9, 2011
広告

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

その他

わんくま同盟

同郷

 

元ネタ:

「どうやってるか」ではなく「ナニをやってるか」を読み解くのなら。

私も過去に、責務毎にクラス分割されたコードを他チームからきたメンバにレクチャーした際に、「いろんなところに処理が飛んでわかりづらいですね。」「switch文で処理を分けたほうが読みやすいですね。」なんていう風にチクッといわれました。

まさに、これではまってます。。。

引き継いだプロジェクトについて、客先でイベント ログにエラーが上がっているんだけど、そのエラーがどういうときにでるのか調べて、と言われました。

エラー自体は、GetLastError で採っているそうなので、SetLastError をしているところを探せばすむ話です。grep で、SetLastError とエラー コードを探せば、該当箇所はでます。

で、それは出たんだけど。

エラー コードのうち下位1バイトが、何をやっている処理か、を表しているもんだから、さぁ大変。「どういう条件で、どのコード」を調べなきゃならなくなった。。。

で、「どうやってるか」が解りやすいコードが、並んでいるわけだ。

今欲しいのは「なにをやっているか」で、それを知るためにはコードを解析して行かなきゃいけないわけだ。

しかも、増改築が繰り替えさえたコード。バージョン管理ツールは、今回(次のプロジェクト)から適用だ!!よって、過去の修正がコメントアウトされて残っているぜ!!

いろんなケースが if 文で連結されている。このコードを出すための条件はなんだ?ってのを調べるために、ず~~っと上までコードを読み登って行かなきゃならん。



これで、本当に、オブジェクト指向より生産性が高いと思いますか?

一部 Device Driver Kit なので、ベタ C なのですが。。。もし、構造化された例外処理が使えるなら、処理コードではなく、処理をそのまま文字列としてメッセージが作れることに、気がつかれているでしょうか?例外的状況を整理し、例外クラスを使い分けることで、なんの作業をしているから一目瞭然なことは、おわかり頂けるでしょうか?

コミュニティにおける、「エラーになりました」という質問に対し、多くの場合「どういうエラーが出ましたか?」「例外の種類は?」と聞くのは、例外の種類だけでもわかれば、何をしようとしてどうなったのか、想像しやすいからなんです。

投稿日時 : 2006年11月14日 22:23
コメント
  • # re: 飛ぶから見にくいのか?続くから見にくいんじゃない?
    Jitta
    Posted @ 2006/11/14 22:36
    DDK って、Driver Development Kit だっけ?
    SDK が、Softweare Development Kit だから、そうだよね、きっとorz
  • # re: 飛ぶから見にくいのか?続くから見にくいんじゃない?
    とっちゃん
    Posted @ 2006/11/15 11:28
    DDK は Device Driver Kit の略ですね。
    MSDN内を検索したらKBにそうかいてありましたw

    ところで、エラーコードを enum or define で定義していないのでしょうか?

    ダブりとか大丈夫なのかな?と邪推してしまうw

    うちは、数字だけであってもエラー定義はDOSの時代から一括してヘッダーに定義されてました(エラー定義ヘッダーがあった)。
    新人教育の際にも、エラー定義は一括して enum なりを使うように徹底されてたし。
    もちろん、内部の独自エラーで、生Cベースの場合です<C++なら例外なげるのでw
  • # re: 飛ぶから見にくいのか?続くから見にくいんじゃない?
    Jitta
    Posted @ 2006/11/15 22:57
    とっちゃんさん、コメントありがとうございます。

    > エラーコードを enum or define で定義していないのでしょうか?
    さすがにそれくらいはされていますって(^-^;

    もちろん、コードをヘッダファイルから探して、define 名をコードから grep かけたんですよ。
    でもね。

    #define HOGE_ERROR 0x2000
    と、定義して。

    if (...) {
      SetLastError(HOGE_ERROR + 0x01);
    } else if (...) {
      SetLastError(HOGE_ERROR + 0x02);
    ...

    もちろん、ひとつの if ブロックは数十行。。。とか。

    DWORD errorCode = HOGE_ERROR;
    errorCode += 0x01;
    // 何かの処理
    errorCode += 0x01;
    // 次の処理
    errorCode += 0x01;
    // さらに次の処理
    errorCode += 0x01;
    // まだあるのさ
    errorCode += 0x01;
    // 当然、まだまだ続く
    ...

    なんて使い方されているのです。。。


    いや、12-3年前は、そんなことした記憶はある。。。
  • # re: 飛ぶから見にくいのか?続くから見にくいんじゃない?
    とっちゃん
    Posted @ 2006/11/17 11:55
    おわー。。。足し算エラーっすか...orz
    うちはこれ禁止されてます。

    定義では、結構ありますけどねw

    なので、上記パターン(ifのほう)でも
    enum
    {
    HOGE_ERROR_BASE=0x2000,
    HOGE_ERROR,
    HOGEHOGE_ERROR,
    };

    if( ... ){
    SetLastError( HOGE_ERROR );
    }
    else{
    SetLastError( HOGEHOGE_ERROR );
    }
    ですね。
    下のほうなら
    enum{
    BlockID_Start;
    BlockID_Init,
    BlockID_2nd,
    ...
    };
    BOOL bError = false;
    int blockID = BlockID_Start;
    blockID++;
    //なにがしか
    if( えらー? ){
    bError = true;
    goto END_WORK;
    }
    blockID++;
    //次の処理
    ...

    END_WORK:
    if( bError ){
    switch( blockID ){
    case BlockID_Init:
    SetLastError( INIT_ERROR );
    ...
    }
    return FALSE;
    }
    とかw

    もちろん、例外を使えない(あるいは、実行コスト的に使いたくない)パターンの場合の例ですw

    最近じゃぁ例外の実行コストを気にすることはなくなっちゃいましたけどねw
タイトル
名前
Url
コメント