連載
開発をもっと楽にするNAgileの基本思想

第1回 アジャイル開発ではドキュメントを書かないって本当?

福井コンピュータ株式会社 小島 富治雄(Microsoft MVP 2006 − Visual C#)
2006/02/22


アジャイルで重視しとる「コミュニケーション」いうのは、こういうことやないねん。なにコメントで世間話しとんねん。

 紙のドキュメントを使うにしろ、フェイス・トゥ・フェイスでやるにしろ、大事なことは、

「伝えるべき情報をきっちり伝える」

いうことや。

 参考までに、わいが書いたもうちっとだけましな、同じ「マウスでクリックされたときにカーソルに近い直線を選択状態にする」のソース・コードを見せたるわ。

namespace 幾何
{
  public class 点 // (x, y)
  {
    double x, y;

    public double X座標 { get { return x; } }
    public double Y座標 { get { return y; } }

    public double 絶対値
    {
      get { return Math.Sqrt(x * x + y * y); }
    }

    public 点(double x, double y)
    {
      this.x = x;
      this.y = y;
    }
  }

  public class 直線 // (ax + by + c = 0)
  {
    double a, b, c;

    public double A { get { return a; } }
    public double B { get { return b; } }
    public double C { get { return c; } }

    public 直線(double a, double b, double c)
    {
      if (a == 0.0 && b == 0.0)
        throw new ArgumentException("直線やない");
      this.a = a;
      this.b = b;
      this.c = c;
    }
  }

  public static class 共通
  {
    public static double 距離(直線 line, 点 point)
    {
      Debug.Assert(line.A != 0.0 || line.B != 0.0,
        "あり得へん直線");

      // 点と直線の距離の公式:
      // 点(x1,y1)と直線(ax+by+c=0)の距離
      //
      // |ax1+by1+c|
      // -----------
      // (a2 + b2)
      return Math.Abs(line.A * point.X座標
        + line.B * point.Y座標 + line.C)
        / new 点(line.A, line.B).絶対値;
    }
  }
}

namespace CAD
{
  abstract class デバイス
  {
    ……中略……
  }

  abstract class 図形
  {
    private bool isSelected = false;

    public bool 選択中
    {
      get { return isSelected; }
      set { isSelected = value; }
    }

    public abstract double 距離(幾何.点 aPoint);
    public abstract void 描画(デバイス aDevice);
  }

  class 直線図形 : 図形
  {
    幾何.直線 line = null;

    public 幾何.直線 座標
    {
      get { return line; }
      set { line = value; }
    }

    public 直線図形(幾何.直線 aLine)
    {
      line = aLine;
    }

    public override double 距離(幾何.点 aPoint)
    {
      return 幾何.共通.距離(座標, aPoint);
    }
    public override void 描画(デバイス aDevice)
    {
      ……中略……
    }
  }

  class 図面
  {
    List<図形> figures = new List<図形>();

    public List<図形> 図形群
    {
      get { return figures; }
    }
  }

  abstract class コマンド
  {
    public abstract void クリック時の処理(デバイス aDevice, 幾何.点 clickedPoint, 図面 aDrawing);
  }

  class 選択コマンド : コマンド
  {
    public override void クリック時の処理(デバイス aDevice, 幾何.点 clickedPoint, 図面 aDrawing)
    {
      ある点から最も近い図形の選択(aDevice, clickedPoint, aDrawing);
    }

    void ある点から最も近い図形の選択(デバイス aDevice, 幾何.点 aPoint, 図面 aDrawing)
    {
      図形 nearestFigure =
        ある点から最も近い図形の検索(aPoint, aDrawing);
      if (nearestFigure != null)
      {
        nearestFigure.選択中 = true;
        nearestFigure.描画(aDevice);
      }
    }

    図形 ある点から最も近い図形の検索(幾何.点 aPoint, 図面 aDrawing)
    {
      図形   result          = null;
      double minimumDistance = double.MaxValue;
      foreach (図形 aFigure in aDrawing.図形群)
      {
        double distance = aFigure.距離(aPoint);
        if (distance < minimumDistance)
        {
          result          = aFigure;
          minimumDistance = distance;
        }
      }
      return result;
    }
  }

  ……中略……
}
良いソース・コードの例(長すぎないメソッド)
「クリックされたときにマウス・カーソルの近くにある直線を選択状態にする」というC#のプログラム。テスト・コードは省略。
 
【参考】点と直線の距離の公式
   

前者のソース・コードは、なんぼ読んだかて、どんな設計なんかよう分からへんようなしろもんや。

 アカウンタビリティ、すなわち説明責任を果たしとらんのや。そんなソース・コードやったら確かにドキュメントの代わりにはならんやろ。そうやないねん。

 ソース・コードには、設計を語らせなあかん。「ソース・コード=設計モデルに関するドキュメント」やないとあかんねん。ソース・コードには、設計モデルに関するアカウンタビリティがあんねん。ソース・コードにそれを果たさしたってくれ、いうことや。

 つまり、わいが声を大にしていいたいのはやな、

「アカウンタビれ!」

いうことや。すなわち説明責任を果たせと。もっともっとアカウンタビったらんかい!

 

【ポイントやで!】
アカウンタビったってな。ほんま頼むわ。

 「アジャイルやったらドキュメント不要」やないねん。な? 分かるやろ?

 「より高品質なコミュニケーションは何か?」いうことやねん。

 テスト・コードもソース・コードもドキュメントのうちなんや。開発者同士のコミュニケーション・ツールとして、テスト・コードとソース・コードいうのが、めっちゃ強力なんや。記述力あるねん。せやからドキュメントとして「それも使おな」いうてるだけやねん。

 

 INDEX
  開発をもっと楽にするNAgileの基本思想
  第1回 アジャイル開発ではドキュメントを書かないって本当?
    1.アジャイル開発ではドキュメントを書かないの?
    2.アカウンタビリティは大切
  3.ソース・コードのアカウンタビリティとは?
    4.ソース・コードにアカウンタビリティを持たせよう!
    5.モデリングのコツ
 
インデックス・ページヘ  「開発をもっと楽にするNAgileの基本思想」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間