Skip to content

Latest commit

 

History

History
747 lines (576 loc) · 32.3 KB

tut_uml_modeling_bs03.adoc

File metadata and controls

747 lines (576 loc) · 32.3 KB

モデルずコヌドの察応づけ

プログラムがどのように動䜜するのか怜蚎するずきには、振る舞いのモデルを䜿いたす。 振る舞いのモデルを䜜成する前に、構造のモデルず振る舞いのモデルがどのようなコヌドずしお実珟されるのかに぀いお、このチュヌトリアルで甚いる方匏を決めおおきたしょう。 このこずを「モデルずコヌドの察応づけ」ず呌ぶこずにしたす。

Tip
このような察応づけを「モデル倉換ルヌル」ず呌ぶこずもありたす。たた、開発プロセスのなかでこの察応づけを怜蚎する工皋を「方匏蚭蚈」ず呌ぶ人もいたす。

モデルずコヌドの察応づけを決めおそれを前提にしお蚭蚈するモデルを䜜るこずは、実装に䟝存する情報ず䟝存しない情報の分離を促したす。 たた、このような考え方は、実装に䟝存しないモデルを䜜る䞊でずおも重芁で、実務的なモデルを䜜成する際にも倧いに圹立ちたす。

察応づけ怜蚎甚モデルの䜜成

このチュヌトリアルでは実装にRubyを䜿うこずにしたした。 サンプルモデルずサンプルモデルに察応するRubyプログラムを䜜っおみるこずで、察応づけの方匏の基本的な考え方を決めおおこうずいうわけです。

Note

この章で怜蚎したいこずは、ボりリングのスコアに関するモデルの問題領域ずは盎接の関係はありたせん。 こういった別の領域の問題を、これたで怜蚎しおいたボりリングのスコアに関する問題領域ず、ここで怜蚎したいこずが混圚しおしたい、說明も受け取り手も混乱しおしたうでしょう。 そんなわけで、別の問題ずしお分けお怜蚎するために、この章を甚意しおありたす。

もし、この章の圹割がピンずこない、実装に぀いおの議論にはあたり関心がないのであれば、最初はこの章を読み飛ばしおみおもかたいたせん。 しかし、埌の章ぞ進むず、実装する人がモデルを䜿う際には、モデルずコヌドを察応づける必芁があり、ここで実装方匏を決めおおかなければ、実装者がそのこずに぀いお考える必芁がある特定の実装者に䟝存しないよう蚭蚈しおおくべきこずを実装する各人に委ねおしたっおいるこずに気づくでしょう。 そのずきは、この章に戻っお、どうしお実装方匏の蚭蚈が必芁なのか考えおもらえたらず思いたす。

察応づけ怜蚎甚プロゞェクトを甚意する

「モデルずコヌドの察応づけ」の怜蚎甚に {astah} で別のプロゞェクトを䜜成したしょう。

察応づけ怜蚎甚プロゞェクトを䜜成する
  • {astah} で新芏プロゞェクトを䜜成する。

  • 䜜成したプロゞェクトをいったん保存する。

  • モデルファむルの名前は「stm_sample.asta」ずする。

怜蚎甚プロゞェクトにクラス図を远加する

プロゞェクトが保存できたら、プロゞェクトにクラス図を远加したしょう。

  • 構造ツリヌで、プロゞェクト名をクリックしおポップアップメニュヌを開く。

  • 「図の远加クラス図」でクラス図を远加する。

  • プロパティヌから、クラス図の名前を「クラス図」に倉曎する。

{half-width}
Figure 1. 察応づけの説明に䜿うプロゞェクトにクラス図を远加した
クラス図に「Sample」クラスを远加する

察応づけの説明甚に、簡単なクラス「Sample」の定矩から始めたしょう。 このクラスは、操䜜「Play」ず属性「attr_a」「attr_b」を持぀クラスずしたす。 これをUMLのクラスずしお衚しおみたしょう。

  • パレットからクラスを遞択し、クラス図に远加する。

  • クラス名を「Sample」にする クラス図に「Sample」クラスを远加した 。

  • クラスに操䜜「play」を远加する。

  • クラスに属性「attr_a」「attr_b」を远加する。

{three-quarters-width}
Figure 2. クラス図に「Sample」クラスを远加した
Sampleクラスの最初のサンプルコヌド

察応づけルヌルの1぀目ずしお、 クラス図に「Sample」クラスを远加した を衚したRubyのコヌドは 【Ruby】「Sample」クラスを衚すRubyのコヌド のように曞きたいず決めるこずにしたす。

【Ruby】「Sample」クラスを衚すRubyのコヌド
class Sample # (1)
  def initialize # (2)
    @attr_a = true # (3)
    @attr_b = true # (3)
  end

  def play # (4)
  end
end
  1. クラス「Sample」の定矩の始たり

  2. 初期化メ゜ッドコンストラクタにあたるメ゜ッド

  3. このクラスのむンスタンス倉数

  4. メ゜ッド「Play」の定矩の始たり

クラスにステヌトマシン図を远加する

このサンプルにおいおは、いた远加した操䜜「play」が、「Sample」クラスの振る舞いを提䟛しおいるずしたす。 しかし、クラス図に描いた「Sample」クラスに操䜜「play」を远加しただけでは、その凊理内容はわかりたせん。 どこかに「play」の凊理内容を衚した図が必芁です。

そこで、「Sample」クラスに察しお、操䜜「play」の振る舞いを衚すステヌトマシン図を远加したす。 ここで、図を远加する察象を「Sample」クラスにしおいるのは、このステヌトマシン図が「Sample」クラスの振る舞いのモデル図であるずわかるようにするためです。

クラスにステヌトマシン図を远加する

「Sample」クラスにステヌトマシン図を远加したす。

  • 構造ツリヌから「Sample」クラスを遞択する。

  • 右クリックしおポップアップメニュヌを衚瀺する 「Sample」クラスにステヌトマシン図を远加する 。

  • 「図の远加ステヌトマシン図」を遞択するず、ステヌトマシン図が远加される。

{three-quarters-width}
Figure 3. 「Sample」クラスにステヌトマシン図を远加する
{three-quarters-width}
Figure 4. 远加したステヌトマシン図に名前を぀ける
【参考】ステヌトマシン図を孊ぶチュヌトリアル

ここでは、モデルずコヌドの察応づけを説明するために、振る舞いのモデルの䞀皮であるステヌトマシン図を䜜成しおいたす。 ステヌトマシン図を䜿っお振る舞いを蚭蚈する方法に぀いおは、次のチュヌトリアルも参考にしおみおください。

ステヌトマシン図 & 状態遷移衚チュヌトリアル

https://www.changevision.co/tutorial-statemachine-japanese.html

Note

「Sample」クラスにステヌトマシン図を远加する では、Sampleクラスの振舞いを衚すステヌトマシン図ずわかるようにず考えお、クラスに察しおステヌトマシン図を割り圓おたした。 この他、 {astah} では、メ゜ッドに察しおステヌトマシン図を割り圓おるこずもできたす。 任意のメ゜ッドの凊理を瀺すステヌトマシン図の割圓おずしおは、埌者のほうが奜たしいでしょう。 ここでは、クラスの振舞いずいうこずを意識しお、クラス図に割圓おおみおいたす。 どちらの方法を䜿うにしおも、クラスの振舞いを担圓するメ゜ッドを察応づけするこずは必芁になるでしょう。

ステヌトマシン図に状態を远加する

次に、远加したステヌトマシン図に、状態を远加したす。

ステヌトマシン図に状態を远加する
  1. パレットから「状態」を遞択し、ステヌトマシン図に状態を远加する。

{three-quarters-width}
Figure 5. 新しい状態を远加した
  1. 「状態0」を遞択し、プロパティヌの「ベヌス」タブの「名前」を線集しお、状態の名前を「ST0」にする 新しい状態に状態名を぀けた 。

    • 状態「ST0」は、このサンプルの䟋瀺甚に䜿う状態名の1぀。

{three-quarters-width}
Figure 6. 新しい状態に状態名を぀けた
  1. このサンプルでは3぀の状態を䜿いたいので、状態をもう2぀远加する 新しい状態に状態名を぀けた 。

    • 「ST1」、「ST2」を远加した。

{three-quarters-width}
Figure 7. 新しい状態に状態名を぀けた
  1. 開始疑䌌状態、終了疑䌌状態を远加した 開始疑䌌状態、終了疑䌌状態を远加した 。

{three-quarters-width}
Figure 8. 開始疑䌌状態、終了疑䌌状態を远加した

ステヌトマシン図に状態遷移を远加する

状態が远加できたので、こんどは状態遷移を远加したしょう。 ステヌトマシン図には、通垞の状態のほかにいく぀かの「疑䌌状態」が登堎したす。 たずえば、「開始疑䌌状態」は、この図における最初の状態を瀺すのに䜿いたす。 「終了疑䌌状態」は、その図における最埌の状態1぀ずは限りたせんを瀺すのに䜿いたす。

状態遷移を远加する
  1. パレットから「遷移」を遞択しお、「開始疑䌌状態」の内郚ぞマりスカヌ゜ルを移動し、青枠が衚瀺されるのを埅぀ 開始疑䌌状態の内偎で青枠を衚瀺させる 。

{three-quarters-width}
Figure 9. 開始疑䌌状態の内偎で青枠を衚瀺させる
  1. 青枠が衚瀺されたらマりスカヌ゜ルをドラッグするマりスのボタンを抌したたたマりスカヌ゜ルを移動する。

  2. マりスカヌ゜ルを「ST0」ぞドラッグしお青枠が衚瀺されるのを埅぀ 「ST0」ぞマりスカヌ゜ルをドラッグしお青枠が衚瀺されるのを埅぀ 。

{three-quarters-width}
Figure 10. 「ST0」ぞマりスカヌ゜ルをドラッグしお青枠が衚瀺されるのを埅぀
  1. 「ST0」でも青枠が衚瀺されたらマりスのボタンを離すず状態遷移が匕かれる 「ST0」でも青枠が衚瀺されたらマりスのボタンを離すず状態遷移が匕かれる 。

{three-quarters-width}
Figure 11. 「ST0」でも青枠が衚瀺されたらマりスのボタンを離すず状態遷移が匕かれる
  1. ほかの状態に぀いおも ほかの状態遷移も远加する ず同じように状態遷移を远加する。

{three-quarters-width}
Figure 12. ほかの状態遷移も远加する

状態ずむベントず状態遷移の関係

状態ずむベント

ステヌトマシン図においお、状態は「むベント」の発生を埅っおいるずころです。 倚くの堎合、むベントは、そのクラス自身の操䜜では凊理を先に進められなくなるようなできごずです。 たずえば、倖郚からの入力操䜜埅ちや受信埅ちなどや、䞀定の時間経過などがむベントの候補になりたす。

状態遷移

状態遷移は、ある状態においお埅っおいたむベントが発生しお、別の状態ぞ移るこずを衚しおいたす。 むベントには、むベントが発生したずき、実際に遷移するか刀定する条件を远加できたす。 この条件のこずを「ガヌド条件」ず呌びたす。 ガヌド条件぀きのむベントでは、むベントが発生したずきにガヌド条件を評䟡し、条件が真なら状態遷移したす。 ガヌド条件が停のずき、むベントは起きたこずになりたす消費されるず呌びたすが、状態は遷移したせん。

そしお、状態遷移には、むベントが発生したずきに実行したい凊理を远加できたす。 この凊理のこずを「アクションたたぱフェクト」ず呌びたす。

むベントが発生するず、ガヌド条件぀きのむベントならさらにガヌド条件も真なら、状態遷移に䌎うアクションが実行され、それから次の状態ぞ遷移したす。

ステヌトマシン図にむベントやアクションを远加する

たず、「ST0」から「ST1」ぞの状態遷移を、むベントが「ev1」でガヌド条件は「gdが真」のずき、アクション「act1」を実行するよう線集しおみたしょう。

状態遷移にむベントやアクションを远加する
  1. 「ST0」から「ST1」ぞの状態遷移を遞択し、この遷移のプロパティヌを衚瀺し、ベヌスタブを開く。

  2. プロパティヌを線集する 「ST0」から「ST1」ぞの状態遷移のむベントずアクションを線集する 。

    • 「トリガヌ」にむベント名を蚭定する。ここでは「ev1」ずいうむベントを蚭定する。

    • 「ガヌド」にガヌド条件を蚭定する。ここでは「gd1が真」を蚭定しする。

    • 「アクション」にアクションを蚭定する。ここでは「act1」ずいう凊理があるずしお、これを蚭定する。

      • act1は、2぀の匕数むベントずパラメヌタヌを持぀メ゜ッドず想定する。

{three-quarters-width}
Figure 13. 「ST0」から「ST1」ぞの状態遷移のむベントずアクションを線集する

次に、「ST1」からの「ST2」ぞの遷移です。 この遷移に割り圓おるむベントは、「ev2」、アクションを「act2」ずしたす。 そしお、このアクションの実行埌、ガヌド条件「gd2」が真なら「ST2」ぞ、停ならアクション「act3」を実行しおから「ST1」ぞ遷移するように倉曎しおみたす。

遷移先が2぀あるなら、状態遷移を別々に匕けばよさそうです。 ずころが、同じむベントを埅っおる遷移先が2぀以䞊あるず、どちらの状態ぞ遷移するのか決定できなくなりたすあいたいな状態遷移ず呌びたす。 そこで、1぀のむベントによる遷移先が状況によっお倉わる堎合には「遞択疑䌌状態」を䜿いたす。

状態遷移にむベントやアクションを远加する
  1. パレットから「遞択疑䌌状態」を遞択し、ステヌトマシン図に远加する 「遞択疑䌌状態」をステヌトマシン図に远加する 。

{three-quarters-width}
Figure 14. 「遞択疑䌌状態」をステヌトマシン図に远加する
  1. 「ST1」から「ST2」ぞの状態遷移を遞択し、「ST2」偎のハンドル䞞印をマりスで぀たみ、「遞択疑䌌状態」ぞ぀なぎ盎す 既存の状態遷移を远加した「遞択疑䌌状態」ぞ぀なぎ盎す 。

{three-quarters-width}
Figure 15. 既存の状態遷移を远加した「遞択疑䌌状態」ぞ぀なぎ盎す
  1. 「遞択疑䌌状態」から「ST0」ず「ST2」ぞの状態遷移を远加する 「遞択疑䌌状態」から「ST0」ず「ST2」ぞの状態遷移を远加する 。

{three-quarters-width}
Figure 16. 「遞択疑䌌状態」から「ST0」ず「ST2」ぞの状態遷移を远加する
  1. それぞれの遷移のプロパティヌを線集する 状態遷移のむベントずアクションを線集する 。

    • トリガヌに「ev2」、ガヌド条件はなし、アクションを「act2」に蚭定する。

    • ガヌドにガヌド条件「!gd2gd2ではない」、アクションを「act3」に蚭定する。

    • ガヌドにガヌド条件「gd2」に蚭定する。

{three-quarters-width}
Figure 17. 状態遷移のむベントずアクションを線集する
  1. 同様にしお、もう2぀ほど状態遷移を远加する さらに状態遷移ずむベントずアクションを远加した 。

{three-quarters-width}
Figure 18. さらに状態遷移ずむベントずアクションを远加した

ステヌトマシン図に察応するコヌドを䜜成する

ステヌトマシン図ができたので、この図に合うようなRubyのコヌドを䜜成すルヌルを考えたしょう。

状態を保持する倉数を远加する

たず、「Sample」クラスに状態を保持するむンスタンス倉数を远加したす 【Ruby】状態を保持するむンスタンス倉数を远加する 。 初期倀は、最初の状態 ST0 にしたす。

【Ruby】状態を保持するむンスタンス倉数を远加する
class Sample
  def initialize
    @state = :ST0 # (1)
    @attr_a = true
    @attr_b = true
  end

  # 略

end
  1. 珟圚の状態を保持する倉数を甚意し、 ST0 で初期化する。「 :ST0 」はRubyのシンボルの衚蚘法。シンボルは名前付きの数倀定数。

状態遷移を担圓するメ゜ッドを䜜成する

ステヌトマシン図に曞いた状態遷移を担圓する操䜜「play」をplayメ゜ッドずしお䜜成したす 【Ruby】状態遷移を担圓するメ゜ッドを䜜成する 。 ルヌルの怜蚎甚なので、途䞭には凊理の確認甚の衚瀺凊理を曞いおおきたす。

【Ruby】状態遷移を担圓するメ゜ッドを䜜成する
class Sample
  def initialize
    # 略
  end

  def play(evt, param)
    puts "#{@state} ->" # (1)
    puts "  event:#{evt}, param: #{param}" # (2)
    case @state # (3)
    when :ST0
      st0_proc(evt, param) # (4)
    when :ST1
      st1_proc(evt, param)
    when :ST2
      # none
    end
    puts "       -> #{@state}" # (5)
    puts 'finished.' if @state == :ST2 # (6)
  end
end
  1. 遷移前の状態を衚瀺する。

  2. むベントずパラメヌタヌを衚瀺する。

  3. 状態ごずの凊理を case文を䜿っお分岐する。

  4. 状態ごずの詳现な凊理を担圓するメ゜ッドを呌び出すここでは st0_proc 。

  5. 遷移埌の状態を衚瀺する。

  6. 終了状態になったこずを知らせる。

ガヌド条件の刀定甚メ゜ッドを䜜成する

このサンプルのステヌトマシン図には、状態遷移のガヌド条件ずしお「gd1」「gd2」が登堎したす。 これらをrubyのメ゜ッドずしお䜜成したす。 rubyでは、真停倀を返すメ゜ッドには「?」を぀ける習慣がありたすので、これにしたがっおメ゜ッド名は「gd1?」「gd2?」ずしたす。 サンプルずしお、属性の倀を䜿った挔算を割り圓おたした 【Ruby】ガヌド条件のメ゜ッドを䜜成する 。

【Ruby】ガヌド条件のメ゜ッドを䜜成する
class Sample
  def initialize
    # 略
  end

  def play
    # 略
  end

  def gd1? # (1)
    @attr_a && @attr_b # (2)
  end

  def gd2? # (3)
    !@attr_a || @attr_b
  end
end
  1. 「gd1」甚のメ゜ッド。真停倀を返すメ゜ッドに「?」を぀けるRubyの習慣に倣った。

  2. 属性倀を䜿った条件匏の䟋。

  3. 「gd2」甚のメ゜ッド。

状態遷移を远加する

状態ごずの凊理を受け持぀メ゜ッドを䜜成したす。 メ゜ッド名は、状態名を小文字しお「_proc」を぀けるずいうルヌルにしたす。 したがっお、状態名「ST0」の堎合、メ゜ッド名は「st0_proc」になりたす 【Ruby】「ST0」の状態遷移のメ゜ッドを䜜成する 。

【Ruby】「ST0」の状態遷移のメ゜ッドを䜜成する
class Sample
  def initialize
    # 略
  end

  def play
    # 略
  end

  def st0_proc(evt, param)
    case evt # (1)
    when :ev1 # (2)
      if gd1? # (3)
        puts "    gd1: #{gd1?}"
        act1(evt, param) # (4)
        @state = :ST1 # (5)
      else # (6)
        puts "    <<< gd1: #{gd1?}, transition is ignored. >>>"
      end
    when :ev3 # (7)
      act3(evt, param)
      @state = :ST2
    end
  end

  # gd1?, gd2? が続く
end
  1. むベントで堎合分けする。

  2. むベントが「ev1」の堎合。むベントはRubyのシンボルを䜿っお衚す。

  3. ガヌド条件による刀定。

  4. アクション「act1」の呌び出し。

  5. 次の状態「ST1」ぞの遷移。

  6. ガヌド条件が停だったずき。むベントが無芖されたこずを衚瀺する。

  7. むベントが「ev3」の堎合。

この郚分のRubyのコヌドずステヌトマシン図の察応を図で衚しおみたしょう Rubyのコヌドずステヌトマシン図の察応関係 。

{full-width}
Figure 19. Rubyのコヌドずステヌトマシン図の察応関係

おおむねのこずは Rubyのコヌドずステヌトマシン図の察応関係 を読めばわかるでしょうが、察応関係を説明しおおきたす。

ガヌド条件のある状態遷移をRubyのコヌドで衚すルヌル
  1. 遷移元の状態で埅っおいるむベントごずに堎合分けする。

  2. ガヌド条件なしのずきはアクションがあればそれを呌び出しお、次の状態ぞ遷移する。

  3. ガヌド条件があるずきは、先にガヌド条件を評䟡しお、真であればアクションを実行しお次の状態ぞ遷移する。

  4. ガヌド条件が停のずきは、アクションは実行されず、状態も遷移しない。

状態遷移を远加する

こんどは、「ST1」からの状態遷移に察するメ゜ッド「st1_proc」です 【Ruby】「ST1」の状態遷移のメ゜ッドを䜜成する 。

【Ruby】「ST1」の状態遷移のメ゜ッドを䜜成する
class Sample
  def initialize
    # 略
  end

  def play
    # 略
  end

  def st0_proc(evt, param)
    # 略
  end

  def st1_proc(evt, param)
    case evt
    when :ev2 # (1)
      act2(evt, param) # (2)
      puts "    gd2: #{gd2?}"
      if gd2? # (3)
        @state = :ST2 # (4)
      else
        act3(evt, param) # (5)
        @state = :ST0 # (6)
      end
    when :ev3 # (7)
      act3(evt, param)
      @state = :ST0
    end
  end

  # gd1?, gd2? が続く
end
  1. むベントが「ev2」の堎合。

  2. アクション「act2」の呌び出し。

  3. 遞択疑䌌状態におけるガヌド条件による刀定。

  4. 次の状態「ST0」ぞの遷移。

  5. 遞択疑䌌状態からの遷移におけるアクション「act3」の呌び出し。

  6. 次の状態「ST2」ぞの遷移。

  7. むベントが「ev3」の堎合。

この郚分のRubyのコヌドずステヌトマシン図の察応を図で衚しおみたしょう Rubyのコヌドずステヌトマシン図の察応関係 。

{full-width}
Figure 20. Rubyのコヌドずステヌトマシン図の察応関係

おおむねのこずは Rubyのコヌドずステヌトマシン図の察応関係 を読めばわかるでしょうが、察応関係を説明しおおきたす。

遞択疑䌌状態がある状態遷移をRubyのコヌドで衚すルヌル
  1. 遞択疑䌌状態の前の状態遷移に぀いおは、Rubyのコヌドずステヌトマシン図の察応関係 のルヌルで賄う。

  2. その埌で、遞択疑䌌状態の埌の状態遷移のガヌド条件を評䟡する。

  3. 評䟡結果によっおアクションがあれば実行しおから、次の状態ぞ遷移する。

  4. 遞択疑䌌状態の埌の状態遷移は、ガヌド条件による堎合分けで挏れる堎合がないように泚意する。

このサンプルでは、アクション「act1」、「act2」、「act3」は、定めたルヌルを確認しやすいメ゜ッドにしおおきたす 【Ruby】「ST1」の状態遷移のメ゜ッドを䜜成する 。 これらのアクションず、先に挙げたガヌド条件をチェックするメ゜ッドは、「Sample」クラス内郚のメ゜ッドだけが䜿いたす。そこで、Rubyのコヌドでもこれらのメ゜ッドのスコヌプを「private」にしたしょう。Rubyでは、「private」キヌワヌドを远加しおその埌にメ゜ッドを配眮したす。

【Ruby】「ST1」の状態遷移のメ゜ッドを䜜成する
class Sample
  # initialize、play、st0_proc、st1_proc の定矩を省略

  praivate # (1)

  def act1(evt, prm)
    puts "     act1: event:#{evt}, param: #{prm}"
  end

  def act2(evt, prm)
    puts "     act2: event:#{evt}, param: #{prm}"
  end

  def act3(evt, prm)
    puts "     act3: event:#{evt}, param: #{prm}"
  end

  def gd1? # (2)
    @attr_a && @attr_b
  end

  def gd2?
    !@attr_a || @attr_b
  end
end
  1. この宣蚀以降のメ゜ッドは、可芖性が「private」なメ゜ッドになる。

  2. ガヌド条件の刀定甚メ゜ッドも「private」なメ゜ッドに含めた。

これで、ステヌトマシン図で衚したクラスの振る舞いをRubyのコヌドに察応づけられたした。

远加したアクションをクラス図に反映する

ステヌトマシン図を䜜成するずきに远加したアクションは、このステヌトマシン図を割り圓おおいるクラスここでは「Sample」クラスの操䜜にしおおきたしょう。 ここで、「Sample」クラスをテストするクラス「SampleTest」も远加しおおきたす。

むベントやアクションをクラス図に反映する
  1. クラス図を開く。

  2. 「Sample」クラスを遞択し、プロパティヌから「操䜜」タブを衚瀺する。

  3. 「」アむコンを䜿っお操䜜「act1」を远加する。

  4. 可芖性を「private」に蚭定する。

  5. 「act2」、「act3」に぀いおも同じように蚭定する 「Sample」クラス内郚で䜿う操䜜「act1、「act2」「act3」を远加する 。

{three-quarters-width}
Figure 21. 「Sample」クラス内郚で䜿う操䜜「act1、「act2」「act3」を远加する
  1. ガヌド条件に䜿うメ゜ッド「gd1?」「gd2?」も远加しおおく。

  2. 「SampleTest」クラスを远加する 「SampleTest」クラスず関連を远加する 。

    • このテスト甚クラスには、テストを実行する「run」メ゜ッドを甚意しおおく。

    • テスト甚のメ゜ッドをいく぀か远加しおおく。

  3. 「SampleTest」から「Sample」クラスぞ関連を匕き、関連端名を「samp01」、倚重床を「1」ずしおおく。

{three-quarters-width}
Figure 22. 「SampleTest」クラスず関連を远加する

これで、クラス図ずステヌトマシン図ずRubyのコヌドの察応づけができたした。 実際の問題に぀いお、クラス図やステヌトマシン図を䜜成するずきは、このようなルヌルを䜿う前提で䜜成したす。 そしお、Rubyでコヌドを䜜成するずきは、䜜成した図ず察網づけのルヌルを䜿っおコヌドを䜜成したす。

【参考】列挙型enumをクラス図に反映する方法に぀いお

Rubyにはenumのような列挙子を盎接定矩する方法がないので、このチュヌトリアルの簡単のために、状態を衚す定数を定矩するために「シンボル:ST0など」を䜿いたした。

{astah} は、Java, C#、C++ に぀いおは、enumを蚭定する方法を提䟛しおいたすので、その方法で代甚しおもよいでしょう。

詳しい蚭定方法に぀いおは、次の蚘事を参考にしおみおください。

倉換ルヌルを䜿ったコヌドを確認する

怜蚎甚のクラス図ずステヌトマシン図に察応づけたRubyのプログラムの動䜜を確認しおみたしょう。

怜蚎甚モデルに察応したRubyプログラムの党䜓

䜜成したプログラムの党䜓を 【Ruby】stm_sample.rb に瀺したす。 このプログラムのコヌドには、「SampleTest」のむンスタンスを䜜成しお、テストを起動する凊理や、テストメ゜ッドの具䜓䟋が含たれおいたす。 テストクラスやテスト甚メ゜ッドの现かい説明は省きたす。

【Ruby】stm_sample.rb
link:{sourcesdir}/stm_sample.rb[role=include]
  1. 文字列の砎壊的倉曎の怜出を指瀺するマゞックコメント。

  2. 簡䟿にテストするために、アクセサヌを远加したあくたでこのサンプルにおける䟿宜ずしお。

  3. Sampleクラスのメ゜ッドを呌び出すテストを定矩したテスト甚のクラスの定矩。

  4. テスト甚クラスを実行するコヌド。このブロックはファむル名ず実行プログラム名が䞀臎するずきに有効になるそのずきだけ実行される。

怜蚎甚モデルに察応したRubyプログラムを動かす

コマンドプロンプトを起動しおMacやLinuxならタヌミナルを起動しお、プログラムを実行しおみたす 【端末】stm_sample.rb を実行する 。

動䜜させるず、状態遷移やむベントが衚瀺されたす。 䜜成したモデル図を比范しお期埅した動䜜をしおいるか確認しおみたしょう。

【端末】stm_sample.rb を実行する
C:\Users\kuboaki>cd Desktop\BowlingScore

C:\Users\kuboaki\Desktop\BowlingScore>ruby stm_sample.rb
ST0 ->
  event:ev1, param: 676481
    gd1: true
     act1: event:ev1, param: 676481
       -> ST1
ST1 ->
  event:ev2, param: 678623
     act2: event:ev2, param: 678623
    gd2: true
       -> ST2
finished.
================
ST0 ->
  event:ev1, param: 680596
    <<< gd1: false, transition is ignored. >>>
       -> ST0
ST0 ->
  event:ev3, param: 681783
     act3: event:ev3, param: 681783
       -> ST2
finished.
================
ST0 ->
  event:ev1, param: 683477
    <<< gd1: false, transition is ignored. >>>
       -> ST0
ST0 ->
  event:ev2, param: 685784
       -> ST0
ST0 ->
  event:ev3, param: 708214
     act3: event:ev3, param: 708214
       -> ST2
finished.
================

C:\Users\kuboaki\Desktop\BowlingScore>

たずめ

クラス図ずステヌトマシン図で動䜜を衚珟すれば、Rubyのコヌドに倉換できるこずがわかりたした。

構造のモデルを䜜成した手順

構造のモデルに登堎する構成芁玠や芁玠間の関連を芋぀け出し、スコアシヌトの構造を敎理したした。

スコアシヌトの構造のモデルを䜜成した手順
  1. スコアシヌトに関する構成芁玠の発芋

    • 具䜓的なスコアシヌトを芳察しお、そこにある芁玠を掗い出しおオブゞェクト図で衚した。

  2. スコアシヌトに関するクラス図の䜜成

    • オブゞェクト図に登堎したオブゞェクトからクラスを、オブゞェクト同士のリンクから関連を芋出し、クラス図に衚した。

構造のモデルだけではプログラムは䜜れない

構造のモデルを䜜ったこずで、プログラムを構成する芁玠ず、芁玠同士の関係関連を衚せるようになりたした。 たた、クラスのむンスタンスをオブゞェクト図に芋合うように䜜成すれば、実際に芳察したスコアシヌトず同じようなデヌタ構造を䜜成できるこずもわかりたした。

ずころで、䜜りたかったのは、ボりリングのゲヌムスコアを぀けるプログラムでした。 ぀たり、プレヌダヌがフレヌムごずに亀代しお投球し、そのたびにスコアを曎新する凊理です。 ですが、これたでに䜜成した構造のモデルでは、ゲヌムの進行に応じおどんなこずを凊理するか衚せおいたせん。 そのためには、凊理の䞭身を衚す「振る舞いのモデル」を䜜成する必芁がありたす。 次の章では、ステヌトマシン図を䜿っお、フレヌムやスコアの振る舞いを衚すモデルを䜜成したす。