diff --git a/courseA/EnvironmentAlgolike.html b/courseA/EnvironmentAlgolike.html index 0c67566..57429fe 100644 --- a/courseA/EnvironmentAlgolike.html +++ b/courseA/EnvironmentAlgolike.html @@ -13,7 +13,7 @@
Algolike の Github のリポジトリはこちらです.クローンしてお手元の開発環境でビルドをし,動作確認を行ってください.
+Algolike の Github のリポジトリはこちらです.クローンしてお手元の開発環境でビルドをし,動作確認を行ってください.
Algolike は Gradle プロジェクトとして作成しています.
MainTest.java では Algolike における以下の一連の動作をテストしています.
StockManagement の Github のリポジトリはこちらです.クローンしてお手元の開発環境でビルドをし,動作確認を行ってください.
+StockManagement の Github のリポジトリはこちらです.クローンしてお手元の開発環境でビルドをし,動作確認を行ってください.
StockManagement は Gradle プロジェクトとして作成しています.
+甲南大学知能情報学部のソフトウェア設計検証研究室です.
+この度は私共の実験にご協力頂きまして誠にありがとうございます.
+
+ これから行っていただく作業は,2個のリファクタリング課題とアンケートへの回答です.全体の作業時間としては,2~3時間程度を想定しています.
+ 対象となるJavaプログラムは2つあり,それぞれのプログラムに対して1つずつリファクタリングの課題に取り組んでいただきます.
+ リファクタリングの課題はお手元のPC上で手作業で行っていただき,課題を終えるたびに,アンケートにお答えいただきます.
+ これ以降お答えいただくアンケートは各リファクタリング課題の完了後と最後の計3個です.
+ アンケートへの回答が終わるたびに作業を中断していただいて構いません.
+ 作業はすべてWebおよびローカルのPC上で完結します.
+
+ 実験課題に取り組んでいただく前に,PUSH型のデータ転送とPULL型のデータ転送について説明します.
+
「Algolike」は,カードゲーム「algo」を基にしたゲームプログラムです.
+Algolikeでは,「0」から「11」までの数字が書かれた計12枚のカードを用いて,プレイヤーとCPUが対戦します.
+ + + ゲーム開始時,12枚のカードを裏向けにして山札を作り,これを「デッキ」とします.
+ そして,各プレイヤーにデッキからカードを2枚配り.それを各プレイヤーの最初の「手札」とします.
+ なお,各プレイヤーは自分から見て左側から数字が小さい順になるように,相手にわからないよう手札のカードを裏向けにして並べなければなりません.
+ 画面では,裏向きになっているカードは黒色で表示されます.(自分の手札は下側に表示されます)
+
+
ゲームはプレイヤーが交互に「アタック」という行動を繰り返して進行していきます.
+ アタックとは,相手の裏のカードを選んで,その数字を当てていくことをいいます.
+ 以下では,行動しているプレイヤーを「自分」,自分からみた相手プレイヤーを「相手」とします.




この時,相手は選ばれたカードと宣言された数字が一致しているかどうかを「Yes」か「No」で答えます.
+ もし「No」だった場合,アタックは失敗となり,アタックに使用した自分のカードを表にして数字順になるように自分の手札に加えます.
+ 画面では,表になったカードは白色で表示されます.
+


そして,ターンを相手に渡します.
+
+これを交互に繰り返します。
+ +プレイヤーの手札のカードが全て表になったとき、そのプレイヤーはゲームに敗北します。
+
+
+
+プレイヤーの手札のカードが全て表になったとき、そのプレイヤーはゲームに敗北します。
+ +次へ + + + diff --git a/courseB/DescriptionStockManagement.html b/courseB/DescriptionStockManagement.html new file mode 100644 index 0000000..7c05608 --- /dev/null +++ b/courseB/DescriptionStockManagement.html @@ -0,0 +1,60 @@ + + + +「StockManagement」は,ソフトウェア工学分野において共通問題として用いられる酒屋の在庫問題を一部簡略化し,
+ Javaを用いて実装したGUIアプリケーションです.
StockManagementでは,ある酒屋の倉庫に対するお酒の搬入処理と,出庫依頼を行うことができます.
+ + + お酒の在庫は,品名と数量で管理されます.StockManagementを起動するとどのお酒の在庫もない状態から始まります.
+ お酒の在庫の状態は画面下部左側に表形式で表示されています.
+ 倉庫にコンテナの搬入があった場合は,画面上部左側にコンテナ内のお酒の品名と数量を入力します.
+ 受付係が出庫依頼を受けた場合は,画面上部中央に依頼されたお酒の品名と数量を入力します.
+
+
以下,搬入処理と出庫依頼処理のそれぞれについて説明します.
+ +







Algolike の Github のリポジトリはこちらです.クローンしてお手元の開発環境でビルドをし,動作確認を行ってください.
+ + Algolike は Gradle プロジェクトとして作成しています.
+
Algolike のテストコードは /src/test/java/MainTest.java にあります.JUnitでテストすることができます.
+MainTest.java では Algolike における以下の一連の動作をテストしています. +
StockManagement の Github のリポジトリはこちらです.クローンしてお手元の開発環境でビルドをし,動作確認を行ってください.
+ + StockManagement は Gradle プロジェクトとして作成しています.
+
StockManagement のテストコードは /src/test/java/MainTest.java にあります.JUnitでテストすることができます.
+MainTest.java では StockManagement における以下の一連の動作をテストしています. +
+ 課題では,PUSH型のデータ転送をPULL型に変更するリファクタリング作業と,PULL型のデータ転送をPUSH型に変更するリファクタリング作業に取り組んでいただきます.
+ そこで,まずPUSH型とPULL型のデータ転送について解説します.
+
+ 本実験では,2つのオブジェクト間のメソッド呼び出しを介したデータのやり取りをデータ転送といいます.
+ オブジェクト間のメソッド呼び出しでは,引数を使ってデータを送る方法と,戻り値を使ってデータを受け取る方法があります.
+ 前者をPUSH型のデータ転送,後者をPULL型のデータ転送といいます.
+ 例えば,オブジェクトAからオブジェクトBにデータxを転送することを考えます.
+ このとき,オブジェクトAがオブジェクトBのメソッドを呼び出して,引数を使ってBにxを送信するのがPUSH型の転送,
+ オブジェクトBがオブジェクトAのメソッドを呼び出して,戻り値を使ってAからxを受信するのがPULL型の転送です.
+ PUSH型とPULL型で呼び出しの方向は逆になりますが,いずれの場合も,オブジェクトAからオブジェクトBにデータxが転送されていることには変わりありません.
+
+ 気温を華氏から摂氏に変換するプログラムを考えます.華氏から摂氏への変換式は以下の通りです. +
+ 摂氏[°C] = (華氏[°F] - 32) / 1.8 ++ 以下では,華氏の気温を保持するクラスを TempF,摂氏の気温を保持するクラスを TempC とします.
+ まずは,TempF のインスタンスから TempC のインスタンスに華氏の気温をPUSH型で転送するプログラム例を示します.
+ PUSH型のデータ転送の場合,転送元のオブジェクトが転送先のオブジェクトのメソッドを呼び出してデータを送信するため,
+ TempF のインスタンスが TempC のインスタンスを参照するようにします.
+ そのため,クラス図は以下のようになります.
+ 
+ ここで,新しい華氏の温度は,TempF クラスの setValue() メソッドで設定されるものとします.
+ このときPUSH型のデータ転送では,即座に更新された華氏の温度のデータが TempC のインスタンスに送信され,摂氏の温度も更新されます.
+ ここで華氏の温度データを送るために呼び出されるのが,TempC の updateTemp() メソッドです.
+ updateTemp() メソッドが呼ばれると送られてきた華氏の温度が即座に摂氏に変換され,TempC 内のフィールド value に記録されます.
+ この流れをシーケンス図で表すと以下のようになります.
+ 
+ 全体のソースコードを下記のリンク先に示します.
+
+ PUSH型転送の華氏摂氏変換プログラム(別タブで開きます) ++ +
+ 次に,TempF のインスタンスから TempC のインスタンスに華氏の気温をPULL型で転送するプログラム例を示します.
+ PULL型のデータ転送の場合,転送先のオブジェクトが転送元のオブジェクトのメソッドを呼び出してデータを戻り値として受け取るため,
+ 今度は TempC のインスタンスが TempF のインスタンスを参照するようにします(PUSH型と逆方向になります).
+ そのため,クラス図は以下のようになります.
+ 
+ PULL型の場合も新しい華氏の温度は,TempF クラスの setValue() メソッドで設定されるものとします.
+ しかしながらPULL型のデータ転送では,華氏の温度が更新された時点で摂氏の温度は更新されません.
+ 摂氏の温度を調べる TempC クラスの getValue() メソッドが呼ばれたタイミングで TempF クラスの getValue() メソッドが呼び出され,
+ 戻り値として返された最新の華氏の温度を元に摂氏の温度がその場で計算され,getValue() メソッドの戻り値として返されます.
+ そのため,TempC クラスの内部に最新の摂氏を記録するための value フィールドを持つ必要はありません.
+ この流れをシーケンス図で表すと以下のようになります.
+ 
+ 全体のソースコードを下記のリンク先に示します.
+
+ PULL型転送の華氏摂氏変換プログラム(別タブで開きます) ++ + +
+ それでは実験を始めます.
+ こちらからお進みください.課題A1に取り組む前に1つめのプログラムの概要の説明を行います.
+
- アンケート回答 + アンケート回答
- アンケート回答 + アンケート回答
+甲南大学知能情報学部のソフトウェア設計検証研究室です.
+この度は私共の実験にご協力頂きまして誠にありがとうございます.
+
+ これから行っていただく作業は,2個のリファクタリング課題とアンケートへの回答です.全体の作業時間としては,2~3時間程度を想定しています.
+ 対象となるJavaプログラムは2つあり,それぞれのプログラムに対して1つずつリファクタリングの課題に取り組んでいただきます.
+ リファクタリングの課題はお手元のPC上で手作業で行っていただき,課題を終えるたびに,アンケートにお答えいただきます.
+ これ以降お答えいただくアンケートは各リファクタリング課題の完了後と最後の計3個です.
+ アンケートへの回答が終わるたびに作業を中断していただいて構いません.
+ 作業はすべてWebおよびローカルのPC上で完結します.
+
+ 実験課題に取り組んでいただく前に,PUSH型のデータ転送とPULL型のデータ転送について説明します.
+
「Algolike」は,カードゲーム「algo」を基にしたゲームプログラムです.
+Algolikeでは,「0」から「11」までの数字が書かれた計12枚のカードを用いて,プレイヤーとCPUが対戦します.
+ + + ゲーム開始時,12枚のカードを裏向けにして山札を作り,これを「デッキ」とします.
+ そして,各プレイヤーにデッキからカードを2枚配り.それを各プレイヤーの最初の「手札」とします.
+ なお,各プレイヤーは自分から見て左側から数字が小さい順になるように,相手にわからないよう手札のカードを裏向けにして並べなければなりません.
+ 画面では,裏向きになっているカードは黒色で表示されます.(自分の手札は下側に表示されます)
+
+
ゲームはプレイヤーが交互に「アタック」という行動を繰り返して進行していきます.
+ アタックとは,相手の裏のカードを選んで,その数字を当てていくことをいいます.
+ 以下では,行動しているプレイヤーを「自分」,自分からみた相手プレイヤーを「相手」とします.




この時,相手は選ばれたカードと宣言された数字が一致しているかどうかを「Yes」か「No」で答えます.
+ もし「No」だった場合,アタックは失敗となり,アタックに使用した自分のカードを表にして数字順になるように自分の手札に加えます.
+ 画面では,表になったカードは白色で表示されます.
+


そして,ターンを相手に渡します.
+
+これを交互に繰り返します。
+ +プレイヤーの手札のカードが全て表になったとき、そのプレイヤーはゲームに敗北します。
+
+
+
+プレイヤーの手札のカードが全て表になったとき、そのプレイヤーはゲームに敗北します。
+ +次へ + + + diff --git a/courseC/DescriptionStockManagement.html b/courseC/DescriptionStockManagement.html new file mode 100644 index 0000000..7c05608 --- /dev/null +++ b/courseC/DescriptionStockManagement.html @@ -0,0 +1,60 @@ + + + +「StockManagement」は,ソフトウェア工学分野において共通問題として用いられる酒屋の在庫問題を一部簡略化し,
+ Javaを用いて実装したGUIアプリケーションです.
StockManagementでは,ある酒屋の倉庫に対するお酒の搬入処理と,出庫依頼を行うことができます.
+ + + お酒の在庫は,品名と数量で管理されます.StockManagementを起動するとどのお酒の在庫もない状態から始まります.
+ お酒の在庫の状態は画面下部左側に表形式で表示されています.
+ 倉庫にコンテナの搬入があった場合は,画面上部左側にコンテナ内のお酒の品名と数量を入力します.
+ 受付係が出庫依頼を受けた場合は,画面上部中央に依頼されたお酒の品名と数量を入力します.
+
+
以下,搬入処理と出庫依頼処理のそれぞれについて説明します.
+ +







Algolike の Github のリポジトリはこちらです.クローンしてお手元の開発環境でビルドをし,動作確認を行ってください.
+ + Algolike は Gradle プロジェクトとして作成しています.
+
Algolike のテストコードは /src/test/java/MainTest.java にあります.JUnitでテストすることができます.
+MainTest.java では Algolike における以下の一連の動作をテストしています. +
StockManagement の Github のリポジトリはこちらです.クローンしてお手元の開発環境でビルドをし,動作確認を行ってください.
+ + StockManagement は Gradle プロジェクトとして作成しています.
+
StockManagement のテストコードは /src/test/java/MainTest.java にあります.JUnitでテストすることができます.
+MainTest.java では StockManagement における以下の一連の動作をテストしています. +
+ 課題では,PUSH型のデータ転送をPULL型に変更するリファクタリング作業と,PULL型のデータ転送をPUSH型に変更するリファクタリング作業に取り組んでいただきます.
+ そこで,まずPUSH型とPULL型のデータ転送について解説します.
+
+ 本実験では,2つのオブジェクト間のメソッド呼び出しを介したデータのやり取りをデータ転送といいます.
+ オブジェクト間のメソッド呼び出しでは,引数を使ってデータを送る方法と,戻り値を使ってデータを受け取る方法があります.
+ 前者をPUSH型のデータ転送,後者をPULL型のデータ転送といいます.
+ 例えば,オブジェクトAからオブジェクトBにデータxを転送することを考えます.
+ このとき,オブジェクトAがオブジェクトBのメソッドを呼び出して,引数を使ってBにxを送信するのがPUSH型の転送,
+ オブジェクトBがオブジェクトAのメソッドを呼び出して,戻り値を使ってAからxを受信するのがPULL型の転送です.
+ PUSH型とPULL型で呼び出しの方向は逆になりますが,いずれの場合も,オブジェクトAからオブジェクトBにデータxが転送されていることには変わりありません.
+
+ 気温を華氏から摂氏に変換するプログラムを考えます.華氏から摂氏への変換式は以下の通りです. +
+ 摂氏[°C] = (華氏[°F] - 32) / 1.8 ++ 以下では,華氏の気温を保持するクラスを TempF,摂氏の気温を保持するクラスを TempC とします.
+ まずは,TempF のインスタンスから TempC のインスタンスに華氏の気温をPUSH型で転送するプログラム例を示します.
+ PUSH型のデータ転送の場合,転送元のオブジェクトが転送先のオブジェクトのメソッドを呼び出してデータを送信するため,
+ TempF のインスタンスが TempC のインスタンスを参照するようにします.
+ そのため,クラス図は以下のようになります.
+ 
+ ここで,新しい華氏の温度は,TempF クラスの setValue() メソッドで設定されるものとします.
+ このときPUSH型のデータ転送では,即座に更新された華氏の温度のデータが TempC のインスタンスに送信され,摂氏の温度も更新されます.
+ ここで華氏の温度データを送るために呼び出されるのが,TempC の updateTemp() メソッドです.
+ updateTemp() メソッドが呼ばれると送られてきた華氏の温度が即座に摂氏に変換され,TempC 内のフィールド value に記録されます.
+ この流れをシーケンス図で表すと以下のようになります.
+ 
+ 全体のソースコードを下記のリンク先に示します.
+
+ PUSH型転送の華氏摂氏変換プログラム(別タブで開きます) ++ +
+ 次に,TempF のインスタンスから TempC のインスタンスに華氏の気温をPULL型で転送するプログラム例を示します.
+ PULL型のデータ転送の場合,転送先のオブジェクトが転送元のオブジェクトのメソッドを呼び出してデータを戻り値として受け取るため,
+ 今度は TempC のインスタンスが TempF のインスタンスを参照するようにします(PUSH型と逆方向になります).
+ そのため,クラス図は以下のようになります.
+ 
+ PULL型の場合も新しい華氏の温度は,TempF クラスの setValue() メソッドで設定されるものとします.
+ しかしながらPULL型のデータ転送では,華氏の温度が更新された時点で摂氏の温度は更新されません.
+ 摂氏の温度を調べる TempC クラスの getValue() メソッドが呼ばれたタイミングで TempF クラスの getValue() メソッドが呼び出され,
+ 戻り値として返された最新の華氏の温度を元に摂氏の温度がその場で計算され,getValue() メソッドの戻り値として返されます.
+ そのため,TempC クラスの内部に最新の摂氏を記録するための value フィールドを持つ必要はありません.
+ この流れをシーケンス図で表すと以下のようになります.
+ 
+ 全体のソースコードを下記のリンク先に示します.
+
+ PULL型転送の華氏摂氏変換プログラム(別タブで開きます) ++ + +
+ それでは実験を始めます.
+ こちらからお進みください.課題A1に取り組む前に1つめのプログラムの概要の説明を行います.
+
+ 課題C1では,Algolike の HandsA から LoseA へのデータ転送について見ていきます.
+ HandsA は,プレイヤーのすべての手札を管理しているクラスで,LoseAは各ターンでプレイヤーがゲームに負けたか否かを表すクラスです.
+ この課題では,
+
+
+ 「HandsA の情報が更新されたときにその情報を LoseA にPUSH型で転送しているプログラムを,PULL型で転送するようにリファクタリングすること」 ++ + を目的とします.
+ 以下では,リファクタリングに要した時間を測っていただきますので,お手元に時計をご用意ください.
+ 時間計測にあたって,急いで作業していただく必要はまったくありません.
+ 最初の課題から最後の課題まで一定のペースを保てるよう, 正しくリファクタリングを行うことを意識してください.
+ この課題で作業していただく内容は,
+
+ 「HandsA の情報が更新されたときにその情報を LoseA にPUSH型で転送しているプログラムを,PULL型で転送するようにリファクタリングすること」 ++ です.
+ まず,現時点での HandsA から LoseA へのデータ転送に関するクラス図とシーケンス図を以下に示します.
+
+ 
+ 現時点ではPUSH型のデータ転送で実装されているため,HandsA クラスの updateResultBy...() メソッドから LoseA クラスの updateHandsA() メソッドを呼び出すために HandsA クラスが LoseA クラスを参照していています.
+ ここで Algo クラスは,初期化時に HandsA クラスや LoseA クラスのインスタンスを生成し,それらのインスタンスを関連付ける役割を担っています.
+ また,HandsA クラスや LoseA クラスにアクセスするための入口(Facade)としての役割も担っています.
+ Algo,HandsA,LoseA クラスのいずれも resources パッケージの中に入っています.
+
+ これを,以下のクラス図とシーケンス図に示すようなPULL型のデータ転送になるよう,手作業でリファクタリングを行っていただきます.
+
+ 
+ 今度はPULL型のデータ転送であるため,LoseA クラスの getValue() メソッドから HandsA クラスの getValue() メソッドを呼び出すために LoseA クラスが HandsA クラスを参照していることに注意してください.
+
+ リファクタリングの作業手順の詳細を以下に示します.
+
+ 作業に着手する前に,メッセージでお伝えした自分専用のブランチ(user??)を切って,一度プッシュを行ってください.
+ プッシュを行った後,開発環境の準備ができれば,時間計測を開始してください. 時間計測はできる限り,1分以内の単位での計測をお願いします.
+ テストプログラムが正しく動作するまでは作業完了とは見なされないので注意してください.
+
+ リファクタリングの作業が完了したら作業時間を記録し,その後,作業結果を自分専用のブランチにコミット&プッシュしてください.
+ ただし,main ブランチには決してマージをしないように,また自分専用のブランチを決して削除しないように注意してください.
+ プッシュ後に,以下のアンケートにお答えください.
+
+ アンケート回答 ++ +
+ 課題C2では,StockManagement の Handling から Shipping へのデータ転送について見ていきます.
+ Handling は,ユーザの入力(搬入または出庫依頼)に対する処理をまとめたクラスで,Shippingは出庫の指示を表すクラスです.
+ この課題では,
+
+
+ 「Handling の情報が更新されたときにその情報を Shipping にPULL型で転送しているプログラムを,PUSH型で転送するようにリファクタリングすること」 ++ + を目的とします.
+ 以下では,リファクタリングに要した時間を測っていただきますので,お手元に時計をご用意ください.
+ 時間計測にあたって,急いで作業していただく必要はまったくありません.
+ 最初の課題から最後の課題まで一定のペースを保てるよう, 正しくリファクタリングを行うことを意識してください.
+ この課題で作業していただく内容は,
+
+ 「Handling の情報が更新されたときにその情報を Shipping にPULL型で転送しているプログラムを,PUSH型で転送するようにリファクタリングすること」 ++ です.
+ まず,現時点での Handling から Shipping へのデータ転送に関するクラス図とシーケンス図を以下に示します.
+
+ 
+ 現時点ではPULL型のデータ転送で実装されているため,Shipping クラスの getValue() メソッドから Handling クラスの getValue() メソッドを呼び出すために Shipping クラスが Handling クラスを参照しています.
+ ここで StockManagement クラスは,初期化時に Handling クラスや Shipping クラスのインスタンスを生成し,それらのインスタンスを関連付ける役割を担っています.
+ また,Handling クラスや Shipping クラスにアクセスするための入口(Facade)としての役割も担っています.
+ StockManagement,Handling,Shipping クラスのいずれも resources パッケージの中に入っています.
+
+ これを,以下のクラス図とシーケンス図に示すようなPUSH型のデータ転送になるよう,手作業でリファクタリングを行っていただきます.
+
+ 
+ 今度はPUSH型のデータ転送であるため,Handling クラスの updateAvailable() メソッドと,updateRequest() から Shipping クラスの updateHandling() メソッドを呼び出すために Handling クラスが Shipping クラスを参照していることに注意してください.
+
+ リファクタリングの作業手順の詳細を以下に示します.
+
+ 作業に着手する前に,メッセージでお伝えした自分専用のブランチ(user??)を切って,一度プッシュを行ってください.
+ プッシュを行った後,開発環境の準備ができれば,時間計測を開始してください. 時間計測はできる限り,30秒以内の単位での計測をお願いします.
+ テストプログラムが正しく動作するまでは作業完了とは見なされないので注意してください.
+
+ リファクタリングの作業が完了したら作業時間を記録し,その後,作業結果を自分専用のブランチにコミット&プッシュしてください.
+ ただし,main ブランチには決してマージをしないように,また自分専用のブランチを決して削除しないように注意してください.
+ プッシュ後に,以下のアンケートにお答えください.
+
+ アンケート回答 ++ +
+甲南大学知能情報学部のソフトウェア設計検証研究室です.
+この度は私共の実験にご協力頂きまして誠にありがとうございます.
+
+ これから行っていただく作業は,2個のリファクタリング課題とアンケートへの回答です.全体の作業時間としては,2~3時間程度を想定しています.
+ 対象となるJavaプログラムは2つあり,それぞれのプログラムに対して1つずつリファクタリングの課題に取り組んでいただきます.
+ リファクタリングの課題はお手元のPC上で手作業で行っていただき,課題を終えるたびに,アンケートにお答えいただきます.
+ これ以降お答えいただくアンケートは各リファクタリング課題の完了後と最後の計3個です.
+ アンケートへの回答が終わるたびに作業を中断していただいて構いません.
+ 作業はすべてWebおよびローカルのPC上で完結します.
+
+ 実験課題に取り組んでいただく前に,PUSH型のデータ転送とPULL型のデータ転送について説明します.
+
「Algolike」は,カードゲーム「algo」を基にしたゲームプログラムです.
+Algolikeでは,「0」から「11」までの数字が書かれた計12枚のカードを用いて,プレイヤーとCPUが対戦します.
+ + + ゲーム開始時,12枚のカードを裏向けにして山札を作り,これを「デッキ」とします.
+ そして,各プレイヤーにデッキからカードを2枚配り.それを各プレイヤーの最初の「手札」とします.
+ なお,各プレイヤーは自分から見て左側から数字が小さい順になるように,相手にわからないよう手札のカードを裏向けにして並べなければなりません.
+ 画面では,裏向きになっているカードは黒色で表示されます.(自分の手札は下側に表示されます)
+
+
ゲームはプレイヤーが交互に「アタック」という行動を繰り返して進行していきます.
+ アタックとは,相手の裏のカードを選んで,その数字を当てていくことをいいます.
+ 以下では,行動しているプレイヤーを「自分」,自分からみた相手プレイヤーを「相手」とします.




この時,相手は選ばれたカードと宣言された数字が一致しているかどうかを「Yes」か「No」で答えます.
+ もし「No」だった場合,アタックは失敗となり,アタックに使用した自分のカードを表にして数字順になるように自分の手札に加えます.
+ 画面では,表になったカードは白色で表示されます.
+


そして,ターンを相手に渡します.
+
+これを交互に繰り返します。
+ +プレイヤーの手札のカードが全て表になったとき、そのプレイヤーはゲームに敗北します。
+
+
+
+プレイヤーの手札のカードが全て表になったとき、そのプレイヤーはゲームに敗北します。
+ +次へ + + + diff --git a/courseD/DescriptionStockManagement.html b/courseD/DescriptionStockManagement.html new file mode 100644 index 0000000..7c05608 --- /dev/null +++ b/courseD/DescriptionStockManagement.html @@ -0,0 +1,60 @@ + + + +「StockManagement」は,ソフトウェア工学分野において共通問題として用いられる酒屋の在庫問題を一部簡略化し,
+ Javaを用いて実装したGUIアプリケーションです.
StockManagementでは,ある酒屋の倉庫に対するお酒の搬入処理と,出庫依頼を行うことができます.
+ + + お酒の在庫は,品名と数量で管理されます.StockManagementを起動するとどのお酒の在庫もない状態から始まります.
+ お酒の在庫の状態は画面下部左側に表形式で表示されています.
+ 倉庫にコンテナの搬入があった場合は,画面上部左側にコンテナ内のお酒の品名と数量を入力します.
+ 受付係が出庫依頼を受けた場合は,画面上部中央に依頼されたお酒の品名と数量を入力します.
+
+
以下,搬入処理と出庫依頼処理のそれぞれについて説明します.
+ +







Algolike の Github のリポジトリはこちらです.クローンしてお手元の開発環境でビルドをし,動作確認を行ってください.
+ + Algolike は Gradle プロジェクトとして作成しています.
+
Algolike のテストコードは /src/test/java/MainTest.java にあります.JUnitでテストすることができます.
+MainTest.java では Algolike における以下の一連の動作をテストしています. +
StockManagement の Github のリポジトリはこちらです.クローンしてお手元の開発環境でビルドをし,動作確認を行ってください.
+ + StockManagement は Gradle プロジェクトとして作成しています.
+
StockManagement のテストコードは /src/test/java/MainTest.java にあります.JUnitでテストすることができます.
+MainTest.java では StockManagement における以下の一連の動作をテストしています. +
+ 課題では,PUSH型のデータ転送をPULL型に変更するリファクタリング作業と,PULL型のデータ転送をPUSH型に変更するリファクタリング作業に取り組んでいただきます.
+ そこで,まずPUSH型とPULL型のデータ転送について解説します.
+
+ 本実験では,2つのオブジェクト間のメソッド呼び出しを介したデータのやり取りをデータ転送といいます.
+ オブジェクト間のメソッド呼び出しでは,引数を使ってデータを送る方法と,戻り値を使ってデータを受け取る方法があります.
+ 前者をPUSH型のデータ転送,後者をPULL型のデータ転送といいます.
+ 例えば,オブジェクトAからオブジェクトBにデータxを転送することを考えます.
+ このとき,オブジェクトAがオブジェクトBのメソッドを呼び出して,引数を使ってBにxを送信するのがPUSH型の転送,
+ オブジェクトBがオブジェクトAのメソッドを呼び出して,戻り値を使ってAからxを受信するのがPULL型の転送です.
+ PUSH型とPULL型で呼び出しの方向は逆になりますが,いずれの場合も,オブジェクトAからオブジェクトBにデータxが転送されていることには変わりありません.
+
+ 気温を華氏から摂氏に変換するプログラムを考えます.華氏から摂氏への変換式は以下の通りです. +
+ 摂氏[°C] = (華氏[°F] - 32) / 1.8 ++ 以下では,華氏の気温を保持するクラスを TempF,摂氏の気温を保持するクラスを TempC とします.
+ まずは,TempF のインスタンスから TempC のインスタンスに華氏の気温をPUSH型で転送するプログラム例を示します.
+ PUSH型のデータ転送の場合,転送元のオブジェクトが転送先のオブジェクトのメソッドを呼び出してデータを送信するため,
+ TempF のインスタンスが TempC のインスタンスを参照するようにします.
+ そのため,クラス図は以下のようになります.
+ 
+ ここで,新しい華氏の温度は,TempF クラスの setValue() メソッドで設定されるものとします.
+ このときPUSH型のデータ転送では,即座に更新された華氏の温度のデータが TempC のインスタンスに送信され,摂氏の温度も更新されます.
+ ここで華氏の温度データを送るために呼び出されるのが,TempC の updateTemp() メソッドです.
+ updateTemp() メソッドが呼ばれると送られてきた華氏の温度が即座に摂氏に変換され,TempC 内のフィールド value に記録されます.
+ この流れをシーケンス図で表すと以下のようになります.
+ 
+ 全体のソースコードを下記のリンク先に示します.
+
+ PUSH型転送の華氏摂氏変換プログラム(別タブで開きます) ++ +
+ 次に,TempF のインスタンスから TempC のインスタンスに華氏の気温をPULL型で転送するプログラム例を示します.
+ PULL型のデータ転送の場合,転送先のオブジェクトが転送元のオブジェクトのメソッドを呼び出してデータを戻り値として受け取るため,
+ 今度は TempC のインスタンスが TempF のインスタンスを参照するようにします(PUSH型と逆方向になります).
+ そのため,クラス図は以下のようになります.
+ 
+ PULL型の場合も新しい華氏の温度は,TempF クラスの setValue() メソッドで設定されるものとします.
+ しかしながらPULL型のデータ転送では,華氏の温度が更新された時点で摂氏の温度は更新されません.
+ 摂氏の温度を調べる TempC クラスの getValue() メソッドが呼ばれたタイミングで TempF クラスの getValue() メソッドが呼び出され,
+ 戻り値として返された最新の華氏の温度を元に摂氏の温度がその場で計算され,getValue() メソッドの戻り値として返されます.
+ そのため,TempC クラスの内部に最新の摂氏を記録するための value フィールドを持つ必要はありません.
+ この流れをシーケンス図で表すと以下のようになります.
+ 
+ 全体のソースコードを下記のリンク先に示します.
+
+ PULL型転送の華氏摂氏変換プログラム(別タブで開きます) ++ + +
+ それでは実験を始めます.
+ こちらからお進みください.課題A1に取り組む前に1つめのプログラムの概要の説明を行います.
+
+ 課題D1では,Algolike の HandsA から LoseA へのデータ転送について見ていきます.
+ HandsA は,プレイヤーのすべての手札を管理しているクラスで,LoseAは各ターンでプレイヤーがゲームに負けたか否かを表すクラスです.
+ この課題では,
+
+
+ 「HandsA の情報が更新されたときにその情報を LoseA にPULL型で転送しているプログラムを,PUSH型で転送するようにリファクタリングすること」 ++ + を目的とします.
+ 以下では,リファクタリングに要した時間を測っていただきますので,お手元に時計をご用意ください.
+ 時間計測にあたって,急いで作業していただく必要はまったくありません.
+ 最初の課題から最後の課題まで一定のペースを保てるよう, 正しくリファクタリングを行うことを意識してください.
+ この課題で作業していただく内容は,
+
+ 「HandsA の情報が更新されたときにその情報を LoseA にPULL型で転送しているプログラムを,PUSH型で転送するようにリファクタリングすること」 ++ です.
+ まず,現時点での HandsA から LoseA へのデータ転送に関するクラス図とシーケンス図を以下に示します.
+
+ 
+ 現時点ではPULL型のデータ転送で実装されているため,LoseA クラスの getValue() メソッドから HandsA クラスの getValue() メソッドを呼び出すために LoseA クラスが HandsA クラスを参照しています.
+ ここで Algo クラスは,初期化時に HandsA クラスや LoseA クラスのインスタンスを生成し,それらのインスタンスを関連付ける役割を担っています.
+ また,HandsA クラスや LoseA クラスにアクセスするための入口(Facade)としての役割も担っています.
+
+ これを,以下のクラス図とシーケンス図に示すようなPUSH型のデータ転送になるよう,手作業でリファクタリングを行っていただきます.
+
+ 
+ 今度はPUSH型のデータ転送であるため,HandsA クラスの updateResultBy...() メソッドから LoseA クラスの updateHandsA() メソッドを呼び出すために HandsA クラスが LoseA クラスを参照していることに注意してください.
+
+ リファクタリングの作業手順の詳細を以下に示します.
+
+ 作業に着手する前に,メッセージでお伝えした自分専用のブランチ(user??)を切って,一度プッシュを行ってください.
+ プッシュを行った後,開発環境の準備ができれば,時間計測を開始してください. 時間計測はできる限り,1分以内の単位での計測をお願いします.
+ テストプログラムが正しく動作するまでは作業完了とは見なされないので注意してください.
+
+ リファクタリングの作業が完了したら作業時間を記録し,その後,作業結果を自分専用のブランチにコミット&プッシュしてください.
+ ただし,main ブランチには決してマージをしないように,また自分専用のブランチを決して削除しないように注意してください.
+ プッシュ後に,以下のアンケートにお答えください.
+
+ アンケート回答 ++ +
+ 課題D2では,StockManagement の Handling から Shipping へのデータ転送について見ていきます.
+ Handling は,ユーザの入力(搬入または出庫依頼)に対する処理をまとめたクラスで,Shippingは出庫の指示を表すクラスです.
+ この課題では,
+
+
+ 「Handling の情報が更新されたときにその情報を Shipping にPUSH型で転送しているプログラムを,PULL型で転送するようにリファクタリングすること」 ++ + を目的とします.
+ 以下では,リファクタリングに要した時間を測っていただきますので,お手元に時計をご用意ください.
+ 時間計測にあたって,急いで作業していただく必要はまったくありません.
+ 最初の課題から最後の課題まで一定のペースを保てるよう, 正しくリファクタリングを行うことを意識してください.
+ この課題で作業していただく内容は,
+
+ 「Handling の情報が更新されたときにその情報を Shipping にPUSH型で転送しているプログラムを,PULL型で転送するようにリファクタリングすること」 ++ です.
+ まず,現時点での Handling から Shipping へのデータ転送に関するクラス図とシーケンス図を以下に示します.
+
+ 
+ 現時点ではPUSH型のデータ転送で実装されているため,Handling クラスの updateAvailable() メソッドと,updateRequest() から Shipping クラスの updateHandling() メソッドを呼び出すために Handling クラスが Shipping クラスを参照しています.
+ ここで StockManagement クラスは,初期化時に Handling クラスや Shipping クラスのインスタンスを生成し,それらのインスタンスを関連付ける役割を担っています.
+ また,Handling クラスや Shipping クラスにアクセスするための入口(Facade)としての役割も担っています.
+ StockManagement,Handling,Shipping クラスのいずれも resources パッケージの中に入っています.
+
+ これを,以下のクラス図とシーケンス図に示すようなPUSH型のデータ転送になるよう,手作業でリファクタリングを行っていただきます.
+
+ 
+ 今度はPULL型のデータ転送であるため,Shipping クラスの getValue() メソッドから Handling クラスの getValue() メソッドを呼び出すために Shipping クラスが Handling クラスを参照していることに注意してください.
+
+ リファクタリングの作業手順の詳細を以下に示します.
+
+ 作業に着手する前に,メッセージでお伝えした自分専用のブランチ(user??)を切って,一度プッシュを行ってください.
+ プッシュを行った後,開発環境の準備ができれば,時間計測を開始してください. 時間計測はできる限り,30秒以内の単位での計測をお願いします.
+ テストプログラムが正しく動作するまでは作業完了とは見なされないので注意してください.
+
+ リファクタリングの作業が完了したら作業時間を記録し,その後,作業結果を自分専用のブランチにコミット&プッシュしてください.
+ ただし,main ブランチには決してマージをしないように,また自分専用のブランチを決して削除しないように注意してください.
+ プッシュ後に,以下のアンケートにお答えください.
+
+ アンケート回答 ++ +