何となく 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
広告

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

その他

わんくま同盟

同郷

 

再帰によるスタックオーバーフロー?(C# と VB.NET の質問掲示板)より:


//再帰処理部分。
private bool checkloop(string grp, string ffiscalyr, int fperiod)
{
    int Row;
    string wkKOgrp;

    //パラメタで渡されたコードが親コードとしてもつ行の行数を取得。ない場合は-1
    Row = Find(dtSet, grp, ffiscalyr, fperiod
        , 0 ,int.Parse(dtSet.Tables[0].Rows.Count.ToString())-1);

    while (Row > -1)
    {
        wkKOgrp = dtSet.Tables[0].Rows[Row].ItemArray[1].ToString();

        //一番おおもとの比較値と比較
        if (SerchTarget == wkKOgrp)
        {
            return true;
        }
        else
        {
            //自身を再度呼び出す
            if(checkloop(wkKOgrp,ffiscalyr,fperiod) == false)
            {
                //現在の行数以降で、パラメタで渡されたコードが親コードとしてもつ行の行数を取得。ない場合は-1
                Row = Find(dtSet, grp, ffiscalyr, fperiod
                    , Row + 1, dtSet.Tables[0].Rows.Count - 1);
            }
            else
            {
                return true;
            }
        }
    }

    return false;
}

//子コードが一致したデータの行数を返す関数
private int Find(DataSet ds, string GRP, string ffiscalyr, int fperiod
    , int startrow, int endrow)
{
    int i;

    for (i = startrow ; i <= endrow ; i++)
    {
        if ((ds.Tables[0].Rows[i].ItemArray[0].ToString() == GRP)
            && (ds.Tables[0].Rows[i].ItemArray[2].ToString() == ffiscalyr)
            && (int.Parse( ds.Tables[0].Rows[i].ItemArray[3].ToString()) == fperiod))
        {
            return i;
        }
    }

    return -1;
}

ん。。。呼び出し側に書かれたコメントは、親コードとしてもつ行の行数。実際の定義に書かれたコメントは、子コードが一致したデータの行数

親コードが一致するのか、子コードが一致するのか?

人間、自分が読めるもの、つまり日本語にまず目がいく。すると、呼び出し側と定義側で違うことが書いてある。まず、とまどう。

そうすると、コードを読まないといけない。ここが、本当にしたいことをしているのかわからないから。日本語を読むのと、コードを読むのと。どっちが時間がかかるだろう?あるいは、1行の日本語を読むのと、数行のコードを読むのと、どっちが時間がかかるだろう?


そして、Find メソッドがしていること。

引数 ds の0番目に定義されているテーブルを、startrow 番目(0起点)から検索を初めて、endrow 番目までに、0列が GRP、2列が ffiscalyr、3列が fperiod である行があれば、その行番号を返す。


「行数」を返しているわけではない、と。


コメントに「行数」と書いてあるので、「行の数」が返ると思って「行数」と、「行番号」は、一致しないですよね?とコメントしたのだけれど、「行番号」を期待して、「行番号」が返っている。コードを、すこ~ししか読んでいなかったので、間違った返信をしてしまった。


質問に対する返信だから、まだいい。私がこのコードを直す役を負っていたら、間違いなく呼び出し側に修正をかけている。そして、バグを作り込み、慌てて元に戻すことになっている。あるいは、コードを読んで違いに気がつき、「どっちやねん!」と叫ぶことになる。これもまた大変で、他から呼びされていないか確認し、呼び出されていればそれらが期待しているものをコードから読み取る羽目になる。「global って、便利なの?」も参照。

たま~~~に、メンテナンスされていないコメントを見かけます。メンテしてください。コメントの間違いは、バグに等しいのです。

投稿日時 : 2008年6月6日 23:27
コメント
タイトル
名前
Url
コメント