連載
.NETで始めるデザインパターン

第5回 Compositeパターンを導き出すための準備

太陽システム株式会社 中西 庸文
Microsoft MVP 2005 - Solutions Architect)
2005/06/08

■Taskクラスのテスト・コード

using System;
using NUnit.Framework;
using DesignPatterns.Core.Composite;

namespace DesignPatterns.Tests.Composite
{
  // Taskのテスト・クラス
  [TestFixture] public class TaskTest
  {
    private Task target;

    [SetUp] public void 対象クラスのインスタンスを生成する()
    {
      target = new Task(1);
    }

    [Test] public void シンプルなタスクを生成する()
    {
      target.StoryNo = 1;
      target.ActualPoint = 1.5f;
      target.EstimatedPoint = 1.5f;
      target.Content = "StoryWriterを作成する。";

      Assert.AreEqual(1, target.No, "タスク番号が違います。");
      Assert.AreEqual(1, target.StoryNo, "ストーリー番号が違います。");
      Assert.AreEqual(1.5, target.ActualPoint, "実測ポイントが違います。");
      Assert.AreEqual(1.5f, target.EstimatedPoint, "予定ポイントが違います。");
      Assert.AreEqual("StoryWriterを作成する。", target.Content,
        "タスクの内容が違います。");
    }

    [Test] public void 実測ポイントが予定ポイントを上回るとポイントオーバー()
    {
      target.ActualPoint = 2.0f;
      target.EstimatedPoint = 1.5f;

      Assert.IsTrue(target.IsOverPoint(), "ポイントオーバーのはずです。");
    }
  }
}
Taskクラスのテスト・コード(C#)

■Taskクラスの実装コード

using System;

namespace DesignPatterns.Core.Composite
{
  // Taskクラス
  public class Task
  {
    private int no;
    private int storyNo;
    private float actualPoint;
    private float estimatedPoint;
    private string content;

    // コンストラクタ
    public Task(int no)
    {
      this.no = no;
    }

    // タスク番号
    public int No
    {
      get { return no; }
    }

    // ストーリー番号
    public int StoryNo
    {
      get { return storyNo; }
      set { storyNo = value; }
    }

    // タスクの実測ポイント
    public float ActualPoint
    {
      get { return actualPoint; }
      set { actualPoint = value; }
    }

    // タスクの予定ポイント

    public float EstimatedPoint
    {
      get { return estimatedPoint; }
      set { estimatedPoint = value; }
    }

    // タスクの内容
    public string Content
    {
      get { return content; }
      set { content = value; }
    }

    // ポイントがオーバーしているかどうか
    public bool IsOverPoint()
    {
      return estimatedPoint - actualPoint < 0;
    }
  }
}
Taskクラスの実装コード(C#)

■Storyクラスのテスト・コード

using System;
using System.Collections;
using NUnit.Framework;
using DesignPatterns.Core.Composite;

namespace DesignPatterns.Tests.Composite
{
  // Storyのテスト・クラス
  [TestFixture] public class StoryTest
  {
    private Story target;

    [SetUp] public void対象クラスのインスタンスを生成する()
    {
      target = new Story(1);
    }

    [Test] public void シンプルなストーリーを生成する()
    {
      target. Priority = 5;
      target.Content = "ストーリーをXMLで出力する。";

      Assert.AreEqual(1, target.No, "ストーリー番号が違います。");
      Assert.AreEqual(5, target.Priority, "優先度が違います。");
      Assert.AreEqual("ストーリーをXMLで出力する。", target.Content,
        "ストーリーの内容が違います。");
    }

    [Test] public void 追加したタスクにはストーリー番号が設定される()
    {
      target.Add(new Task(1));

      Assert.AreEqual(1, target.TaskCount, "タスク数が違います。");
      Assert.AreEqual(1, target[0].StoryNo,
        "ストーリー番号が設定されていません。");
    }

    [Test]
    [ExpectedException(typeof(ArgumentOutOfRangeException))]
    public void 存在しないタスクを指定すると例外が発生する()
    {
      target.Add(new Task(1));
      Task invalidTask = target[1];
    }

    [Test] public void 保持するタスクを列挙できる()
    {
      target.Add(new Task(1));
      target.Add(new Task(2));

      IEnumerator en = target.GetEnumerator();

      Assert.IsTrue(en.MoveNext(), "次のタスクは存在するはずです。");
      Assert.AreEqual(1, ((Task) en.Current).No, "タスクが違います。");
      Assert.IsTrue(en.MoveNext(), "次のタスクは存在するはずです。");
      Assert.AreEqual(2, ((Task) en.Current).No, "タスクが違います。");
      Assert.IsFalse(en.MoveNext(), "次のタスクは存在しないはずです。");
    }
  }
}
Storyクラスのテスト・コード(C#)

■Storyクラスの実装コード

using System;
using System.Collections;

namespace DesignPatterns.Core.Composite
{
  // Storyクラス
  public class Story : IEnumerable
  {
    private int no;
    private int priority;
    private string content;
    private ArrayList tasks = new ArrayList();

    // コンストラクタ
    public Story(int no)
    {
      this.no = no;
    }

    // ストーリー番号
    public int No
    {
      get { return no; }
    }

    // 優先度
    public int Priority
    {
      get { return priority; }
      set { priority = value; }
    }

    // ストーリーの内容
    public string Content
    {
      get { return content; }
      set { content = value; }
    }

    // 対象のタスク
    public Task this [int index]
    {
      get { return (Task) tasks[index]; }
    }

    // タスク数
    public int TaskCount
    {
      get { return tasks.Count; }
    }

    // タスクを追加する
    public void Add(Task task)
    {
      task.StoryNo = no;
      tasks.Add(task);
    }

    // Storyを反復処理できる列挙子を取得する
    public IEnumerator GetEnumerator()
    {
      return tasks.GetEnumerator();
    }
  }
}
Storyクラスの実装コード(C#)

■Storiesクラスのテスト・コード

using System;
using System.Collections;
using NUnit.Framework;
using DesignPatterns.Core.Composite;

namespace DesignPatterns.Tests.Composite
{
  // Storiesのテスト・クラス
  [TestFixture] public class StoriesTest
  {
    private Stories target;

    [SetUp] public void対象クラスのインスタンスを生成する()
    {
      target = new Stories();
    }

    [Test] public void ストーリーを追加できる()
    {
      target.Add(new Story(1));

      Assert.AreEqual(1, target.StoryCount, "ストーリー数が違います。");
    }

    [Test]
    [ExpectedException(typeof(ArgumentOutOfRangeException))]
    public void 存在しないストーリーを指定すると例外が発生する()
    {
      target.Add(new Story(1));
      Story invalidStory = target[1];
    }

    [Test] public void 保持するストーリーを列挙できる()
    {
      target.Add(new Story(1));
      target.Add(new Story(2));

      IEnumerator en = target.GetEnumerator();

      Assert.IsTrue(en.MoveNext(), "次のストーリーは存在するはずです。");
      Assert.AreEqual(1, ((Story) en.Current).No, "タスクが違います。");
      Assert.IsTrue(en.MoveNext(), "次のストーリーは存在するはずです。");
      Assert.AreEqual(2, ((Story) en.Current).No, "タスクが違います。");
      Assert.IsFalse(en.MoveNext(), "次のストーリーは存在しないはずです。");
    }
  }
}
Storiesクラスのテスト・コード(C#)

■Storiesクラスの実装コード

using System;
using System.Collections;

namespace DesignPatterns.Core.Composite
{
  // Storiesクラス
  public class Stories : IEnumerable
  {
    private ArrayList stories = new ArrayList();

    // コンストラクタ
    public Stories()
    {}

    // 対象のストーリー
    public Story this [int index]
    {
      get { return (Story) stories[index]; }
    }

    // ストーリー数
    public int StoryCount
    {
      get { return stories.Count; }
    }

    // ストーリーを追加する
    public void Add(Story story)
    {
      stories.Add(story);
    }

    // Storiesを反復処理できる列挙子を取得する
    public IEnumerator GetEnumerator()
    {
      return stories.GetEnumerator();
    }
  }
}
Storiesクラスの実装コード(C#)
 
インデックス・ページヘ  「.NETで始めるデザインパターン」


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 記事ランキング

本日 月間