<?xml version='1.0' encoding='Shift_JIS' ?>
<doc xml:lang='ja'>
	<body>
		<p>実装フェーズの目的は、設計モデルをBESP上でシミュレートできるプログラムとして実装することです。
			プログラムの実装ではJava言語を使います。 コンポーネントビルダーを使うことによって、大部分は自動生成されるので、
			Java言語がそんなに得意でなくても、基本的な知識があれば、実装できます。</p>
		<p>このフェーズで作成するのは以下のプログラムです。</p>
		<ul>
			<li>Typeを実装するクラス(1つ)</li>
			<li>情報を実装するクラス(設計された情報クラスの数)</li>
			<li>行動を実装するクラス(設計された行動クラスの数)</li>
			<li>シミュレーションを構成するクラス(1つ)</li>
		</ul>
		<p>本チュートリアルで紹介する全てのソースコードやコンパイル済みのコードはBESPパッケージをインストールすると
			最初からpluginsフォルダに入っています。.jarがコンパイル済みファイル、.zipがソースコードです。
			詳しいコードはそちらをご覧下さい。</p>
		<subsection title="パッケージの構成">
			<p>「パッケージ」という概念が分からない方は読み飛ばしてしまって構いません。</p>
			<p>基本的にパッケージの構成はモデル実装者にまかされていますが、チュートリアルで紹介するモデルの実装では、
				分かりやすいようにパッケージ構成されています。</p>
			<p>以下に、パッケージ構成の方針を示します。</p>
			<table style="width:100%" title="パッケージ構成の指針">
				<thead>
					<tr>
						<th>パッケージ</th>
						<th>命名規則</th>
						<th>具体例</th>
					</tr>
				</thead>
				<tbody>
					<tr>
						<td>基底パッケージ</td>
						<td>org.boxed_economy.[シミュレーション名]</td>
						<td>org.boxed_economy.marketforlemon</td>
					</tr>
					<tr>
						<td>モデルパッケージ</td>
						<td>[基底パッケージ].model</td>
						<td>org.boxed_economy.marketforlemon.model</td>
					</tr>
					<tr>
						<td>情報パッケージ</td>
						<td>[モデルパッケージ].information</td>
						<td>org.boxed_economy.marketforlemon.model.information</td>
					</tr>
					<tr>
						<td>行動パッケージ</td>
						<td>[モデルパッケージ].behavior</td>
						<td>org.boxed_economy.marketforlemon.model.behavior</td>
					</tr>
				</tbody>
			</table>
			<p>次に、ソースコードを参照する人のためにレモン市場の具体的なパッケージ構成を示します。</p>
			<table style="width:100%" title="レモン市場におけるパッケージ構成">
				<tbody>
					<tr>
						<td rowspan="6">org.boxed_economy.marketforlemon.model</td>
						<td colspan="2">MarketForLemonModel.java</td>
					</tr>
					<tr>
						<td colspan="2">MarketForLemonWorld.java</td>
					</tr>
					<tr>
						<td rowspan="2">information</td>
						<td>PriceRequestInformation.java</td>
					</tr>
					<tr>
						<td>PriceInformation.java</td>
					</tr>
					<tr>
						<td rowspan="2">behavior</td>
						<td>BuyLemonBehavior.java</td>
					</tr>
					<tr>
						<td>SellLemonBehavior.java</td>
					</tr>
				</tbody>
			</table>
		</subsection>
		<subsection title="Typeを実装する">
			<p>まず、シミュレーションで扱う全てのTypeを実装したクラスをつくります。 クラスの命名規則は(シミュレーション名)Modelです。
				例えば、レモン市場の場合は、MarketForLemonModelとなります。</p>
			<p>また、Type実装クラスは必ずBESPPluginインターフェイスを実装します。このインターフェイスのinitializePluginメソッド
				を実装することにより、BESP起動時に自動的にTypeがインストールされます。</p>
			<table style="width:100%" title="Type実装クラスの命名規則">
				<thead>
					<tr>
						<th>命名規則</th>
						<th>具体例</th>
					</tr>
				</thead>
				<tbody>
					<tr>
						<td>[シミュレーション名]Model</td>
						<td>MarketForLemonModel</td>
					</tr>
				</tbody>
			</table>
			<program title="Typeの実装(MarketForLemonModel.java)"
				src="src/model/MarketForLemonModel.java" normalizer="javasrc"
				javasrcSyntaxHilight="true" encoding="Shift_JIS"/>
			<dl>
				<dt>BESPPluginインターフェイスの実装</dt>
				<dd>implements BESPPluginと記述します。</dd>
				<dt>Typeの定義</dt>
				<dd>
					<p>Typeを定義します。他のクラスで利用するので、public staticにするのが慣例になっています。</p>
					<p>また、Type名は、設計フェーズでつけたものと同じものをつかいます。</p>
				</dd>
				<dt>initializePluginの実装</dt>
				<dd>
					<p>initializePlugin(BESPContainer container)は、特別なメソッドで、これを実装すると、
						BESP起動時に自動的にメソッドが呼ばれ、Typeのインストールをすることが出来ます。</p>
					<p>public static でなければならないことに注意してください。</p>
				</dd>
			</dl>
		</subsection>
		
		<subsection title="情報を実装する">
			<p>次に、情報を実装するクラスを作ります。基本的に、情報の実装方法は開発者にまかされています。
				ただ一つのきまりは、Informationインターフェイスを実装することです。</p>
			<p>レモン市場では、PriceRequestInformation, PriceInformationを実装することになります。</p>
			<p>まず、PriceRequestInformationからみていきましょう。</p>			
			
			<program
				title="PriceRequestInformationの実装(PriceRequestInformation.java)"
				src="src/model/information/PriceRequestInformation.java"
				normalizer="javasrc" javasrcSyntaxHilight="true"
				encoding="Shift_JIS"/>

			<p>このクラスは、属性も操作も持つ必要が無いので、空のクラスになっています。
				唯一ただの空のクラスではないのは、Informationインターフェイスを実装していることです。
				（ちなみに、このような空クラスを作る代わりに、Typeインスタンスのみを利用してクラスを作らない方法もあります。）</p>
			
			<p>レモン市場におけるもう１つの情報は、PriceInformationです。</p>
			<program title="PriceInformationの実装(PriceInformation.java)"
				src="src/model/information/PriceInformation.java"
				normalizer="javasrc" javasrcSyntaxHilight="true"
				encoding="Shift_JIS"/>
				
			<p>
				このクラス（価格情報）では、価格属性が必要なので、属性として加えられています。
			</p>
			<p>			
				今回の例では、簡単な例で説明しているので非常にシンプルですが、チュートリアルの後半では、
				もう少し複雑な例を見ることができるでしょう。
			</p>						
		</subsection>
		
		<subsection title="行動を実装する">
			<p>行動の実装には、コンポーネントビルダーを使用すると非常に便利です。
				Component Builderを使うと、設計フェーズで書いた状態遷移図からソースコードの
				スケルトンを自動生成することが出来ます。</p>
			<p>ここでは、コンポーネントビルダーを使って自動生成されたスケルトンに行動ロジックを書き込む方法を
				説明します。</p>
			<p>あなたが書いた状態遷移図が正しければ、あなたが実装しなければならないコードは次の部分のみです。</p>
			<ul>
				<li>アクション</li>
				<li>ガード条件</li>				
			</ul>
			<p>ここでは、レモン市場における、買い手と売り手（BuyLemonBehaviorとSellLemonBehavior）の取引を例に、
				簡単なアクションとガード条件の実装方法を説明します。</p>
			
			<subsubsection title="財を送る/受け取るアクションの実装">
				<program title="財を送る(BuyLemonBehavior.java)"
					javasrcKeyword="sendMoneyAction"
					src="src/model/behavior/BuyLemonBehavior.java"
					normalizer="javasrc" javasrcSyntaxHilight="true"
					encoding="Shift_JIS"/>
				<p>ここでは、レモンを買うためのお金を送信しています。</p>
				<ul>
					<li>まず、多くのアクションはAgentのメソッドを利用します。属するAgentのインスタンスを取得するためにはthis.getAgent()
						メソッドを利用します。
						</li>
					<li>
						<p>財を送るためには、財を取得する必要があります。財を取得する方法は２種類あります。</p>
						<ul>
							<li>Agentが持っている財を引き出す</li>
							<li>財を生成する</li>							
						</ul>
						<p>ここでは、Agentはお金をいくらか持っていると想定して、Agentが持っている財を引き出すという方法で
						財を取得しています。財を引き出すためには、Agentの
						removeGoods(種類[GoodsType], 量[double])メソッドを使用します。
						</p>
					</li>
					<li>財を送るには、sendGoods(送り先関係[Relation], 送り先行動{BehaviorType], 財[Goods])メソッドを使用します。
						これは、Behaviorのメソッドです。
					</li>
					<li>
						他のエージェントへの関係を取得するには、Agentが持つ、getRelation()メソッドを使用します。
					</li>
				</ul>
				
				<program title="財を受け取る(BuyLemonBehavior.java)"
					javasrcKeyword="receiveLemonAction"
					src="src/model/behavior/BuyLemonBehavior.java"
					normalizer="javasrc" javasrcSyntaxHilight="true"
					encoding="Shift_JIS"/>					
				<p>ここでは、お金と引き換えにレモンを受け取っています。</p>					
				<ul>
					<li>送られてきた財を参照するには、getReceivedGoods()メソッドを使用します。これはBehaviorのメソッドです。</li>
					<li>参照するだけでは受け取ったことにはなりません。
						送られてきた財をAgentの所有財として受け取るには、参照した財を、
						AgentのaddGoods(財[Goods])を使用して、所有財に加える必要があります。</li>
				</ul>
			</subsubsection>
			
			<subsubsection title="情報を送る/受け取るアクションの実装">
				<p>財の送受信が出来れば、情報の送受信を行うのは簡単です。
					BESPでは、全てのエージェント間のやり取りは、財のやり取りであると規定されています。
					つまり、情報は財に付随する情報として送信すればよいわけです。
				</p>
				<p>しかし、情報だけをやり取りすることが多いのは事実です。そのため、BESPでは、
					あたかも情報だけを送受信しているようにやり取りできる便利メソッドが用意されています。
					これらのメソッドを利用すると、自動的に無名の財が作られ、その財に付随する情報として
					情報が送受信されます。（具体的には実装リファレンスを参照して下さい）
				</p>	
					
				<program title="情報を送る(BuyLemonBehavior.java)"
					javasrcKeyword="sendPriceRequestAction"
					src="src/model/behavior/BuyLemonBehavior.java"
					normalizer="javasrc" javasrcSyntaxHilight="true"
					encoding="Shift_JIS"/>					
				<ul>
					<li>他のエージェントへ情報を送るには、
						sendInformation(送り先関係[Relation], 送り先行動[BehaviorType], 情報[Information])を使用します。
						これは、Behaviorのメソッドです。
					</li>
				</ul>
				
				<program title="情報を受け取る(BuyLemonBehavior.java)"
					javasrcKeyword="receivePriceInformationAction"
					src="src/model/behavior/BuyLemonBehavior.java"
					normalizer="javasrc" javasrcSyntaxHilight="true"
					encoding="Shift_JIS"/>
				<ul>
					<li>送られてきた情報を参照するには、getReceivedInformation()を使用します。</li>
				</ul>				
			</subsubsection>
			
			<subsubsection title="情報/財を送り返すアクションの実装">				
				<p>上記のアクションは、情報や財をはじめに送る側（つまり、話し掛ける側）でしたので、
					相手の関係や行動を明示して送る必要がありました。
					しかし、次の「売り手」の行動は、買い手から送られてきた財に対して、財を送り返す側
					（つまり、応答する側）です。
					このケースにおいて、送り返す側は、相手の関係や行動を明示する必要がありません。
					シンプルなsendGoods(財[Goods])や、sendInformation(情報[Information])メソッドを使うことによって、
					既に開かれた経路を使って財や情報を送り返すことが出来ます。
				</p>	
				
				<program title="情報を送り返す(SellLemonBehavior.java)"
					javasrcKeyword="sendPriceInformationAction"
					src="src/model/behavior/SellLemonBehavior.java"
					normalizer="javasrc" javasrcSyntaxHilight="true"
					encoding="Shift_JIS"/>
				<program title="財を送り返す(SellLemonBehavior.java)"
					javasrcKeyword="sendLemonAction"
					src="src/model/behavior/SellLemonBehavior.java"
					normalizer="javasrc" javasrcSyntaxHilight="true"
					encoding="Shift_JIS"/>
			</subsubsection>
			
			<subsubsection title="ガード条件の実装">
				<p>ガード条件の実装はシンプルで、条件判定のプログラムを記述し、
					真偽値を戻り値として戻す単純なメソッドを実装するだけです。
				</p>
				<p>ただし、注意しなければならないのは、ガード条件の判定プログラムは、「副作用があってはならない」
					ことです（これはUMLのガード条件の仕様に従っています）。
				</p>
				<p>「副作用があってはならない」というのは、ここでは「行動もしくはAgentの状態が変化する処理を行ってはならない」ということです。
					例えば、ガード条件の判定で、財の生成や財の送受信を行ったりしてはいけません。
					なぜなら、ガード条件メソッドは、同じ条件で何度も呼ばれる可能性があるからです。					
					その際に、必ず同じ値を返すという保証がいるわけです。
				</p>
				<program title="受け取った財を判定する(BuyLemonBehavior.java)"
					javasrcKeyword="isLemon"
					src="src/model/behavior/BuyLemonBehavior.java"
					normalizer="javasrc" javasrcSyntaxHilight="true"
					encoding="Shift_JIS"/>
				<p>ここでは、受け取った財がレモンかどうか判定しています。</p>
				<ul>
					<li>財の種類の識別には、Typeのequals(タイプ[Type])メソッドを使用します。</li>
				</ul>				
				<program title="受け取った情報を判定する(BuyLemonBehavior.java)"
					javasrcKeyword="isPriceInformation"
					src="src/model/behavior/BuyLemonBehavior.java"
					normalizer="javasrc" javasrcSyntaxHilight="true"
					encoding="Shift_JIS"/>
				<p>ここでは、受け取った情報が価格情報かどうか判定しています。</p>
				<ul>
					<li><p>情報の種類の識別は、少し骨が折れます。なぜなら、情報だけは、getTypeメソッドを持っていないためです。
						（これは情報が自由に設計できるようになっているためです。）</p>
						<p>情報のTypeを取得するには、WorldクラスのgetInformationType(情報[Information])メソッドを利用します。</p>
						<p>Typeが取得できれば、比較の方法は全てのType共通ですので、財の場合と同様になります。</p>
					</li>
				</ul>			
				<p>上記２つの場合とも、情報の参照のみ行っているので、副作用はありません。</p>				

			</subsubsection>
		</subsection>
		
		<subsection title="世界を実装する">
			<p>さて、ここまでで一通りの実装が終わりました。
				最後に、このモデルをBESPで動かすために、シミュレーションの初期設定を行うクラスを実装します。
				世界の命名規則は、（シミュレーション名）Worldです。レモン市場の世界は、MarketForLemonWorldとなります。</p>			
			<p>世界クラスはWorldクラスを継承します。このクラスのinitializeWorldメソッド
				をオーバーライドすることにより、世界読み込み時に特定の条件で初期化することが出来ます。</p>
				
			<table style="width:100%" title="世界クラスの命名規則">
				<thead>
					<tr>
						<th>命名規則</th>
						<th>具体例</th>
					</tr>
				</thead>
				<tbody>
					<tr>
						<td>[シミュレーション名]World</td>
						<td>MarketForLemonWorld</td>
					</tr>
				</tbody>
			</table>
							
			<program title="世界の実装(MarketForLemonWorld.java)"
				src="src/model/MarketForLemonWorld.java" normalizer="javasrc"
				javasrcSyntaxHilight="true" encoding="Shift_JIS"/>
				
			<p>世界の実装において注意すべきことは、以下の３点です。</p>
			<ul>
				<li>Worldクラスを継承すること。</li>
				<li>mainメソッドを作ること。これがないと、次の実行フェーズでBESPを起動することができません。</li>
				<li>initializeWorld()メソッドをオーバーライドすること。
					ここに、シミュレーションの初期化プログラムを書きます。</li>
			</ul>
			
			<p>シミュレーションごとに異なるのは、initializeWorld()で行う初期化プログラムの内容です。
				レモン市場では、
			</p>
			<ul>
				<li>initializeClock()でシミュレーション時計を設定し、</li>
				<li>createSeller()で、売り手を一人生成し、</li>
				<li>最後にcreateBuyer()で、買い手を複数人生成しています。</li>
			</ul>
			<p>また、エージェントの生成プログラムでは、行動を追加したり、買い手と売り手に関係を結ぶという初期化も行っています。</p>			
			<p>さて、以上で実装は終わりです。さあ！実行してみましょう！</p>						
		</subsection>
		
	</body>
</doc>
