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

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

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

 
Imports System
Imports NUnit.Framework
Imports DesignPatterns.Core.Composite

Namespace DesignPatterns.Tests.Composite

  ' Taskのテスト・クラス
  <TestFixture()> Public Class TaskTest

    Private _target As Task

    <SetUp()> Public Sub対象クラスのインスタンスを生成する()
      _target = New Task(1)
    End Sub

    <Test()> Public Sub シンプルなタスクを生成する()
      _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, _
        "タスクの内容が違います。")
    End Sub

    <Test()> Public Sub 実測ポイントが予定ポイントを上回るとポイントオーバー()
      _target.ActualPoint = 2.0F
      _target.EstimatedPoint = 1.5F

      Assert.IsTrue(_target.IsOverPoint(), "ポイントオーバーのはずです。")
    End Sub

  End Class

End Namespace
Taskクラスのテスト・コード(VB.NET)
 
Imports System

Namespace DesignPatterns.Core.Composite

  ' Taskクラス
  Public Class Task

    Private _no As Integer
    Private _storyNo As Integer
    Private _actualPoint As Single
    Private _estimatedPoint As Single
    Private _content As String

    ' コンストラクタ
    Public Sub New(ByVal no As Integer)
      Me._no = no
    End Sub

    ' タスク番号

    Public ReadOnly Property No() As Integer
      Get
        Return _no
      End Get
    End Property

    ' ストーリー番号
    Public Property StoryNo() As Integer
      Get
        Return _storyNo
      End Get
      Set(ByVal value As Integer)
        _storyNo = value
      End Set
    End Property

    ' タスクの実測ポイント
    Public Property ActualPoint() As Single
      Get
        Return _actualPoint
      End Get
      Set(ByVal value As Single)
        _actualPoint = value
      End Set
    End Property

    ' タスクの予定ポイント
    Public Property EstimatedPoint() As Single
      Get
        Return _estimatedPoint
      End Get
      Set(ByVal value As Single)
        _estimatedPoint = value
      End Set
    End Property

    ' タスクの内容
    Public Property Content() As String
      Get
        Return _content
      End Get
      Set(ByVal value As String)
        _content = value
      End Set
    End Property

    ' ポイントがオーバーしているかどうか
    Public Function IsOverPoint() As Boolean
      Return _estimatedPoint - _actualPoint < 0
    End Function

  End Class

End Namespace
Taskクラスの実装コード(VB.NET)
 
Imports System
Imports NUnit.Framework
Imports DesignPatterns.Core.Composite

Namespace DesignPatterns.Tests.Composite

' Storyのテスト・クラス
  <TestFixture()> Public Class StoryTest

    Private _target As Story

    <SetUp()> Public Sub対象クラスのインスタンスを生成する()
      _target = New Story(1)
    End Sub

    <Test()> Public Sub シンプルなストーリーを生成する()
      _target.Priority = 5
      _target.Content = "ストーリーをXMLで出力する。"

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

    <Test()> Public Sub 追加したタスクにはストーリー番号が設定される()
      _target.Add(New Task(1))

      Assert.AreEqual(1, _target.TaskCount, "タスク数が違います。")
      Assert.AreEqual(1, _target(0).StoryNo, _
        "ストーリー番号が設定されていません。")
    End Sub

    <Test(), ExpectedException(GetType(ArgumentOutOfRangeException))> _
    Public Sub 存在しないタスクを指定すると例外が発生する()
      _target.Add(New Task(1))
      Dim invalidTask As Task = _target(1)
    End Sub

    <Test()> Public Sub 保持するタスクを列挙できる()
      _target.Add(New Task(1))
      _target.Add(New Task(2))

      Dim en As IEnumerator = _target.GetEnumerator()

      Assert.IsTrue(en.MoveNext(), "次のタスクは存在するはずです。")
      Assert.AreEqual(1, (CType(en.Current, Task)).No, "タスクが違います。")
      Assert.IsTrue(en.MoveNext(), "次のタスクは存在するはずです。")
      Assert.AreEqual(2, (CType(en.Current, Task)).No, "タスクが違います。")
      Assert.IsFalse(en.MoveNext(), "次のタスクは存在しないはずです。")
    End Sub

  End Class

End Namespace
Storyクラスのテスト・コード(VB.NET)
 
Imports System
Imports System.Collections

Namespace DesignPatterns.Core.Composite

  ' Storyクラス
  Public Class Story : Implements IEnumerable

    Private _no As Integer
    Private _priority As Integer
    Private _content As String
    Private _tasks As ArrayList = New ArrayList

    ' コンストラクタ
    Public Sub New(ByVal no As Integer)
      Me._no = no
    End Sub

    ' ストーリー番号
    Public Property No() As Integer
      Get
        Return _no
      End Get
      Set(ByVal value As Integer)
        _no = value
      End Set
    End Property

    ' 優先度
    Public Property Priority() As Integer
      Get
        Return _priority
      End Get
      Set(ByVal value As Integer)
        _priority = value
      End Set
    End Property

    ' ストーリーの内容

    Public Property Content() As String
      Get
        Return _content
      End Get
      Set(ByVal value As String)
        _content = value
      End Set
    End Property

    ' 対象のタスク

    Default Public ReadOnly Property Item(ByVal index As Integer) As Task
      Get
        Return CType(_tasks(index), Task)
      End Get
    End Property

    ' タスク数
    Public ReadOnly Property TaskCount() As Integer
      Get
        Return _tasks.Count
      End Get
    End Property

    ' タスクを追加する
    Public Sub Add(ByVal myTask As Task)
      myTask.StoryNo = _no
      _tasks.Add(myTask)
    End Sub

    ' Storyを反復処理できる列挙子を取得する
    Public Function GetEnumerator() As IEnumerator _
Implements IEnumerable.GetEnumerator
      Return _tasks.GetEnumerator()
    End Function

  End Class

End Namespace
Storyクラスの実装コード(VB.NET)
 
Imports System
Imports System.Collections
Imports NUnit.Framework
Imports DesignPatterns.Core.Composite

Namespace DesignPatterns.Tests.Composite

' Storiesのテスト・クラス

  <TestFixture()> Public Class StoriesTest

    Private _target As Stories

    <SetUp()> Public Sub対象クラスのインスタンスを生成する()
      _target = New Stories
    End Sub

    <Test()> Public Sub ストーリーを追加できる()
      _target.Add(New Story(1))

      Assert.AreEqual(1, _target.StoryCount, "ストーリー数が違います。")
    End Sub

    <Test(), ExpectedException(GetType(ArgumentOutOfRangeException))> _
    Public Sub 存在しないストーリーを指定すると例外が発生する()
      _target.Add(New Story(1))
      Dim invalidStory As Story = _target(1)
    End Sub

    <Test()> Public Sub 保持するストーリーを列挙できる()
      _target.Add(New Story(1))
      _target.Add(New Story(2))

      Dim en As IEnumerator = _target.GetEnumerator()

      Assert.IsTrue(en.MoveNext(), "次のストーリーは存在するはずです。")
      Assert.AreEqual(1, (CType(en.Current, Story)).No, "タスクが違います。")
      Assert.IsTrue(en.MoveNext(), "次のストーリーは存在するはずです。")
      Assert.AreEqual(2, (CType(en.Current, Story)).No, "タスクが違います。")
      Assert.IsFalse(en.MoveNext(), "次のストーリーは存在しないはずです。")
    End Sub

  End Class

End Namespace
Storiesクラスのテスト・コード(VB.NET)
 
Imports System
Imports System.Collections

Namespace DesignPatterns.Core.Composite

  ' Storiesクラス
  Public Class Stories : Implements IEnumerable

    Private _stories As ArrayList = New ArrayList

    ' コンストラクタ
    Public Sub New()

    End Sub

    ' 対象のストーリー
    Default Public ReadOnly Property Item(ByVal index As Integer) As Story
      Get
        Return CType(_stories(index), Story)
      End Get
    End Property

    ' ストーリー数
    Public ReadOnly Property StoryCount() As Integer
      Get
        Return _stories.Count
      End Get
    End Property

    ' ストーリーを追加する
    Public Sub Add(ByVal myStory As Story)
      _stories.Add(myStory)
    End Sub

    ' Storiesを反復処理できる列挙子を取得する
    Public Function GetEnumerator() As IEnumerator _
      Implements IEnumerable.GetEnumerator
      Return _stories.GetEnumerator()
    End Function

  End Class

End Namespace
Storiesクラスの実装コード(VB.NET)
 
インデックス・ページヘ  「.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 記事ランキング

本日 月間