diff --git a/courseA/IM_Alloy.html b/courseA/IM_Alloy.html new file mode 100644 index 0000000..fe239be --- /dev/null +++ b/courseA/IM_Alloy.html @@ -0,0 +1,173 @@ + + +
+ +
+ 本課題では,SimpleTwitterプログラムにアカウント名を変更可能にする機能追加を行っていただきます.
+
+ このSSDStoreプログラムが,サイトA以外のサイトからも商品情報を収集して扱えるようにすることを考えます.
+
+ 以下では,リファクタリングに要した時間を測っていただきますので,お手元に時計をご用意ください.
+ 時間計測にあたって,急いで作業していただく必要はまったくありません.
+ 最初の課題から最後の課題まで一定のペースを保てるよう, 正しくリファクタリングを行うことを意識してください.
+ 開発環境を立ち上げてソースコードの確認をしていただいて構いませんが,ソースコードの変更は時間計測の準備ができるまで行わないで下さい.
+ まずは、以下の作業手順を一通り読んでから作業を開始してください.
+
+ 現在の設計では,以下のクラス図ように ItemsByPrice オブジェクトと ItemsByCapacity オブジェクトが,それぞれ SiteA オブジェクトから直接SSDの商品情報をPULL型のデータ転送で取得し,
+ さらに Price オブジェクトから価格を,Capacity オブジェクトから容量をPULL型のデータ転送で取得して,それらの値を使って別々に検索を行い検索結果を出力しています.
+

+ 具体的には以下のコードように,ItemsByPrice オブジェクトの getValue() メソッド内部で,サイトAからSSDのリストを取得してその中から Price オブジェクトで指定された価格以下の商品を検索し,
+ 同様に ItemsByCapacity オブジェクトの getValue() メソッド内部で,サイトAからSSDのリストを取得してその中から Capacity オブジェクトで指定された容量以上の商品を検索しています.
+
+public class ItemsByPrice {
+ private Price price;
+ private SiteA siteA;
+ :
+ public double getValue() {
+ List<Map<String, Object>> temp_l1 = new ArrayList<>();
+ {
+ for (Map<String, Object> item: this.siteA.getValue()) {
+ if ((Integer) item.get("price") <= this.price.getValue()) {
+ temp_l1.add(item);
+ }
+ }
+ }
+ return temp_l1;
+ }
+}
+
+
+public class ItemsByCapacity {
+ private Capacity capacity;
+ private SiteA siteA;
+ :
+ public double getValue() {
+ List<Map<String, Object>> temp_l1 = new ArrayList<>();
+ {
+ for (Map<String, Object> item: this.siteA.getValue()) {
+ if ((Integer) item.get("capacity") >= this.capacity.getValue()) {
+ temp_l1.add(item);
+ }
+ }
+ }
+ return temp_l1;
+ }
+}
+
+
+ ここで,このSSDStoreプログラムがサイトBからも商品情報を収集して扱えるように拡張することを考えた場合,ItemsByPrice オブジェクトと ItemsByCapacity オブジェクトの両方の実装を,
+ SiteA オブジェクトと SiteB オブジェクトを同時に扱えるように書き換えなければならなくなります.
+ 今後,より多くのサイトを扱えるように拡張していくことを考えると,このように ItemsByPrice オブジェクトと ItemsByCapacity オブジェクトが直接,個々のサイトのオブジェクトを参照しているような現在の設計では,拡張作業が煩雑になってしまいます.
+
+ そこで,以下のクラス図のように複数のサイトを同時に参照することができる SiteWrapper オブジェクトを新たに導入し,
+ ItemsByPrice オブジェクトと ItemsByCapacity オブジェクトが,SiteWrapper オブジェクトを通じて,間接的に SiteA オブジェクトや SiteB オブジェクトにアクセスするように設計変更を行います.
+ そうすることによって,SiteWrapper にいくつサイトを追加しても,ItemsByPrice オブジェクトや ItemsByCapacity オブジェクトの実装に影響が及ばないようにすることができます.
+

+ 具体的に変更後の設計の中では,以下のように SiteWrapper クラスが SiteA を参照し,
+ ItemsByPrice オブジェクトと ItemsByCapacity オブジェクトは,この SiteWrapper の getSiteValue() メソッドを呼び出して,最新のSSDの一覧を得るようにします.
+ そして,新しいサイトを追加する際は,この SiteWrapper クラスを変更するようにします.
+
+public class SiteWrapper {
+ private SiteA siteA;
+ public SiteWrapper(SiteA siteA) {
+ this.siteA = siteA;
+ }
+ public List<Map<String, Object>> getSiteValue() {
+ return this.siteA.getValue();
+ }
+}
+
+
+ 本課題では,リファクタリングに要した時間を測っていただきますので,お手元に時計をご用意ください.
+ 時間計測にあたって,急いで作業していただく必要はまったくありません.
+ 最初の課題から最後の課題まで一定のペースを保てるよう, 正しくリファクタリングを行うことを意識してください.
+ 課題に着手する前に開発環境を立ち上げて現状のソースコードの確認をしていただいて構いませんが,実際のソースコードの変更は時間計測の準備ができるまで行わないで下さい.
+
+ 作業に着手する前に,main ブランチから,メッセージでお伝えした自分専用のブランチ(user??Refactor)を新規作成して,一度 push を行ってください.
+ push を行った後,開発環境の準備ができれば,時間計測を開始してください. 時間計測はできる限り,30秒以内の単位での計測をお願いします.
+ ソースコードの変更作業は上記「SSDStore のリファクタリングの概要」にしたがって進めてください.
+ テストプログラムTestSSDStoreUpdate.javaが正しく動作するまでは作業完了とは見なされないので注意してください.
+
+ リファクタリングの作業が完了したら作業時間を記録し,その後,作業結果を自分専用のブランチに commit & push してください.
+ ただし,main ブランチには決して merge をしないように,また自分専用のブランチを決して削除しないように注意してください.
+ push 後に,以下のアンケートにお答えください.
+
+
+ アンケートフォーム (別タブが開きます)
+
+
+
+ 本課題では,SimpleTwitterプログラムにアカウント名を変更可能にする機能追加を行っていただきます.
+
+ このSSDStoreプログラムが,サイトA以外のサイトからも商品情報を収集して扱えるようにすることを考えます.
+
+ 以下では,リファクタリングに要した時間を測っていただきますので,お手元に時計をご用意ください.
+ 時間計測にあたって,急いで作業していただく必要はまったくありません.
+ 最初の課題から最後の課題まで一定のペースを保てるよう, 正しくリファクタリングを行うことを意識してください.
+ 開発環境を立ち上げてソースコードの確認をしていただいて構いませんが,ソースコードの変更は時間計測の準備ができるまで行わないで下さい.
+ まずは、以下の作業手順を一通り読んでから作業を開始してください.
+
+ 現在の設計では,以下のクラス図ように ItemsByPrice オブジェクトと ItemsByCapacity オブジェクトが,それぞれ SiteA オブジェクトから直接SSDの商品情報をPULL型のデータ転送で取得し,
+ さらに Price オブジェクトから価格を,Capacity オブジェクトから容量をPULL型のデータ転送で取得して,それらの値を使って別々に検索を行い検索結果を出力しています.
+

+ 具体的には以下のコードように,ItemsByPrice オブジェクトの getValue() メソッド内部で,サイトAからSSDのリストを取得してその中から Price オブジェクトで指定された価格以下の商品を検索し,
+ 同様に ItemsByCapacity オブジェクトの getValue() メソッド内部で,サイトAからSSDのリストを取得してその中から Capacity オブジェクトで指定された容量以上の商品を検索しています.
+
+public class ItemsByPrice {
+ private Price price;
+ private SiteA siteA;
+ :
+ public double getValue() {
+ List<Map<String, Object>> temp_l1 = new ArrayList<>();
+ {
+ for (Map<String, Object> item: this.siteA.getValue()) {
+ if ((Integer) item.get("price") <= this.price.getValue()) {
+ temp_l1.add(item);
+ }
+ }
+ }
+ return temp_l1;
+ }
+}
+
+
+public class ItemsByCapacity {
+ private Capacity capacity;
+ private SiteA siteA;
+ :
+ public double getValue() {
+ List<Map<String, Object>> temp_l1 = new ArrayList<>();
+ {
+ for (Map<String, Object> item: this.siteA.getValue()) {
+ if ((Integer) item.get("capacity") >= this.capacity.getValue()) {
+ temp_l1.add(item);
+ }
+ }
+ }
+ return temp_l1;
+ }
+}
+
+
+ ここで,このSSDStoreプログラムがサイトBからも商品情報を収集して扱えるように拡張することを考えた場合,ItemsByPrice オブジェクトと ItemsByCapacity オブジェクトの両方の実装を,
+ SiteA オブジェクトと SiteB オブジェクトを同時に扱えるように書き換えなければならなくなります.
+ 今後,より多くのサイトを扱えるように拡張していくことを考えると,このように ItemsByPrice オブジェクトと ItemsByCapacity オブジェクトが直接,個々のサイトのオブジェクトを参照しているような現在の設計では,拡張作業が煩雑になってしまいます.
+
+ そこで,以下のクラス図のように複数のサイトを同時に参照することができる SiteWrapper オブジェクトを新たに導入し,
+ ItemsByPrice オブジェクトと ItemsByCapacity オブジェクトが,SiteWrapper オブジェクトを通じて,間接的に SiteA オブジェクトや SiteB オブジェクトにアクセスするように設計変更を行います.
+ そうすることによって,SiteWrapper にいくつサイトを追加しても,ItemsByPrice オブジェクトや ItemsByCapacity オブジェクトの実装に影響が及ばないようにすることができます.
+

+ 具体的に変更後の設計の中では,以下のように SiteWrapper クラスが SiteA を参照し,
+ ItemsByPrice オブジェクトと ItemsByCapacity オブジェクトは,この SiteWrapper の getSiteValue() メソッドを呼び出して,最新のSSDの一覧を得るようにします.
+ そして,新しいサイトを追加する際は,この SiteWrapper クラスを変更するようにします.
+
+public class SiteWrapper {
+ private SiteA siteA;
+ public SiteWrapper(SiteA siteA) {
+ this.siteA = siteA;
+ }
+ public List<Map<String, Object>> getSiteValue() {
+ return this.siteA.getValue();
+ }
+}
+
+
+ 本課題では,リファクタリングに要した時間を測っていただきますので,お手元に時計をご用意ください.
+ 時間計測にあたって,急いで作業していただく必要はまったくありません.
+ 最初の課題から最後の課題まで一定のペースを保てるよう, 正しくリファクタリングを行うことを意識してください.
+ 課題に着手する前に開発環境を立ち上げて現状のソースコードの確認をしていただいて構いませんが,実際のソースコードの変更は時間計測の準備ができるまで行わないで下さい.
+
+ 作業に着手する前に,main ブランチから,メッセージでお伝えした自分専用のブランチ(user??Refactor)を新規作成して,一度 push を行ってください.
+ push を行った後,開発環境の準備ができれば,時間計測を開始してください. 時間計測はできる限り,30秒以内の単位での計測をお願いします.
+ ソースコードの変更作業は上記「SSDStore のリファクタリングの概要」にしたがって進めてください.
+ テストプログラムTestSSDStoreUpdate.javaが正しく動作するまでは作業完了とは見なされないので注意してください.
+
+ リファクタリングの作業が完了したら作業時間を記録し,その後,作業結果を自分専用のブランチに commit & push してください.
+ ただし,main ブランチには決して merge をしないように,また自分専用のブランチを決して削除しないように注意してください.
+ push 後に,以下のアンケートにお答えください.
+
+
+ アンケートフォーム (別タブが開きます)
+
+
+
+ 本課題では,SimpleTwitterプログラムにアカウント名を変更可能にする機能追加を行っていただきます.
+
+ このSSDStoreプログラムが,サイトA以外のサイトからも商品情報を収集して扱えるようにすることを考えます.
+
+ 以下では,リファクタリングに要した時間を測っていただきますので,お手元に時計をご用意ください.
+ 時間計測にあたって,急いで作業していただく必要はまったくありません.
+ 最初の課題から最後の課題まで一定のペースを保てるよう, 正しくリファクタリングを行うことを意識してください.
+ 開発環境を立ち上げてソースコードの確認をしていただいて構いませんが,ソースコードの変更は時間計測の準備ができるまで行わないで下さい.
+ まずは、以下の作業手順を一通り読んでから作業を開始してください.
+
+ 現在の設計では,以下のクラス図ように ItemsByPrice オブジェクトと ItemsByCapacity オブジェクトが,それぞれ SiteA オブジェクトから直接SSDの商品情報をPULL型のデータ転送で取得し,
+ さらに Price オブジェクトから価格を,Capacity オブジェクトから容量をPULL型のデータ転送で取得して,それらの値を使って別々に検索を行い検索結果を出力しています.
+

+ 具体的には以下のコードように,ItemsByPrice オブジェクトの getValue() メソッド内部で,サイトAからSSDのリストを取得してその中から Price オブジェクトで指定された価格以下の商品を検索し,
+ 同様に ItemsByCapacity オブジェクトの getValue() メソッド内部で,サイトAからSSDのリストを取得してその中から Capacity オブジェクトで指定された容量以上の商品を検索しています.
+
+public class ItemsByPrice {
+ private Price price;
+ private SiteA siteA;
+ :
+ public double getValue() {
+ List<Map<String, Object>> temp_l1 = new ArrayList<>();
+ {
+ for (Map<String, Object> item: this.siteA.getValue()) {
+ if ((Integer) item.get("price") <= this.price.getValue()) {
+ temp_l1.add(item);
+ }
+ }
+ }
+ return temp_l1;
+ }
+}
+
+
+public class ItemsByCapacity {
+ private Capacity capacity;
+ private SiteA siteA;
+ :
+ public double getValue() {
+ List<Map<String, Object>> temp_l1 = new ArrayList<>();
+ {
+ for (Map<String, Object> item: this.siteA.getValue()) {
+ if ((Integer) item.get("capacity") >= this.capacity.getValue()) {
+ temp_l1.add(item);
+ }
+ }
+ }
+ return temp_l1;
+ }
+}
+
+
+ ここで,このSSDStoreプログラムがサイトBからも商品情報を収集して扱えるように拡張することを考えた場合,ItemsByPrice オブジェクトと ItemsByCapacity オブジェクトの両方の実装を,
+ SiteA オブジェクトと SiteB オブジェクトを同時に扱えるように書き換えなければならなくなります.
+ 今後,より多くのサイトを扱えるように拡張していくことを考えると,このように ItemsByPrice オブジェクトと ItemsByCapacity オブジェクトが直接,個々のサイトのオブジェクトを参照しているような現在の設計では,拡張作業が煩雑になってしまいます.
+
+ そこで,以下のクラス図のように複数のサイトを同時に参照することができる SiteWrapper オブジェクトを新たに導入し,
+ ItemsByPrice オブジェクトと ItemsByCapacity オブジェクトが,SiteWrapper オブジェクトを通じて,間接的に SiteA オブジェクトや SiteB オブジェクトにアクセスするように設計変更を行います.
+ そうすることによって,SiteWrapper にいくつサイトを追加しても,ItemsByPrice オブジェクトや ItemsByCapacity オブジェクトの実装に影響が及ばないようにすることができます.
+

+ 具体的に変更後の設計の中では,以下のように SiteWrapper クラスが SiteA を参照し,
+ ItemsByPrice オブジェクトと ItemsByCapacity オブジェクトは,この SiteWrapper の getSiteValue() メソッドを呼び出して,最新のSSDの一覧を得るようにします.
+ そして,新しいサイトを追加する際は,この SiteWrapper クラスを変更するようにします.
+
+public class SiteWrapper {
+ private SiteA siteA;
+ public SiteWrapper(SiteA siteA) {
+ this.siteA = siteA;
+ }
+ public List<Map<String, Object>> getSiteValue() {
+ return this.siteA.getValue();
+ }
+}
+
+
+ 本課題では,リファクタリングに要した時間を測っていただきますので,お手元に時計をご用意ください.
+ 時間計測にあたって,急いで作業していただく必要はまったくありません.
+ 最初の課題から最後の課題まで一定のペースを保てるよう, 正しくリファクタリングを行うことを意識してください.
+ 課題に着手する前に開発環境を立ち上げて現状のソースコードの確認をしていただいて構いませんが,実際のソースコードの変更は時間計測の準備ができるまで行わないで下さい.
+
+ 作業に着手する前に,main ブランチから,メッセージでお伝えした自分専用のブランチ(user??Refactor)を新規作成して,一度 push を行ってください.
+ push を行った後,開発環境の準備ができれば,時間計測を開始してください. 時間計測はできる限り,30秒以内の単位での計測をお願いします.
+ ソースコードの変更作業は上記「SSDStore のリファクタリングの概要」にしたがって進めてください.
+ テストプログラムTestSSDStoreUpdate.javaが正しく動作するまでは作業完了とは見なされないので注意してください.
+
+ リファクタリングの作業が完了したら作業時間を記録し,その後,作業結果を自分専用のブランチに commit & push してください.
+ ただし,main ブランチには決して merge をしないように,また自分専用のブランチを決して削除しないように注意してください.
+ push 後に,以下のアンケートにお答えください.
+
+
+ アンケートフォーム (別タブが開きます)
+
+
+
+ 本課題では,SimpleTwitterプログラムにアカウント名を変更可能にする機能追加を行っていただきます.
+
+ このSimpleTwitterプログラムでは,GPSの位置情報が更新されるたびに,それに合わせて地図の表示位置も自動で更新されます.しかしながら,地図アプリのユーザはいつでも自分の周辺の地図を閲覧したいわけではありません.
+ 例えば,電車に乗りながら目的地周辺の地図情報を確認したい場合,電車の動きに合わせて地図の表示位置が勝手に動いてしまうと困ります.
+
+ 現在の設計では,以下のクラス図のようにGPSの緯度情報を保持している Latitude オブジェクトが地図の中心位置の緯度成分を表す MapLatitude オブジェクトを,
+ GPSの経度情報を保持している Longitude オブジェクトが地図の中心位置の経度成分を表す MapLongitude オブジェクトを,それぞれPUSH型のデータ転送で更新するようになっています.
+

+ 具体的には以下のコードのように,GPSの位置情報の変化をセンサーが検知するたびに Map クラスの updateGPS() メソッドが呼び出され,
+ その中から Longitude クラスの updateGPS() メソッドと Latitude クラスの updateGPS() メソッドが呼ばれて,まずGPSの緯度と経度の情報が更新されます.
+
+public class Map {
+ :
+ private Longitude longitude;
+ private Latitude latitude;
+ :
+ public void updateGPS(double cur_lat, double cur_long) {
+ this.longitude.updateGPS(cur_lat, cur_long);
+ this.latitude.updateGPS(cur_lat, cur_long);
+ }
+ :
+}
+
+
+ そして,それらのメソッドの中からさらに,MapLongitude クラスの updateLongitude() メソッドと
+ MapLatitude クラスの updateLatitude() メソッドが以下のコードのようにそれぞれ呼ばれて,引き続き地図の中心位置の情報も更新されます.
+ これらの更新は常に連続して行われるため,このままの設計では,GPSの位置情報だけを更新して地図の中心位置は更新しないという,自動更新がOFFの状態の振る舞いを上手く実装することができません.
+
+public class Longitude {
+ private MapLongitude mapLongitude;
+ private double value;
+ :
+ public void updateGPS(double cur_lat, double cur_long) {
+ this.value = cur_long;
+ this.mapLongitude.updateLongitude(this.value);
+ }
+}
+
+public class Latitude {
+ private MapLatitude mapLatitude;
+ private double value;
+ :
+ public void updateGPS(double cur_lat, double cur_long) {
+ this.value = cur_lat;
+ this.mapLatitude.updateLatitude(this.value);
+ }
+}
+
+
+ そこで,以下のクラス図のように新たに Presenter オブジェクトを導入し,Longitude オブジェクトも Latitude オブジェクトも,
+ 必ずこのオブジェクトを経由して MapLatitude オブジェクトや MapLongitude オブジェクトを更新するように設計変更を行います.
+ そうすることによって,Longitude オブジェクトや Latitude オブジェクトの状態の更新後に
+ MapLatitude オブジェクトや MapLongitude オブジェクトの状態の更新をするか否かを,Presenter オブジェクト上で制御することができるようになります.
+

+ 具体的に変更後の設計の中では,以下のように Map クラスの updateGPS() メソッドは,
+ Longitude クラスと Latitude クラスの updateGPS() メソッドの代わりに Presenter クラスの updateGPS() メソッドを呼び出すようにします.
+
+public class Map {
+ :
+ private Presenter presenter;
+ :
+ public void updateGPS(double cur_lat, double cur_long) {
+ this.presenter.updateGPS(cur_lat, cur_long);
+ }
+}
+
+
+ そして,Presenter クラスの updateGPS() メソッドは,
+ Longitude オブジェクトや Latitude オブジェクトの状態の更新と,
+ MapLatitude オブジェクトや MapLongitude オブジェクトの状態の更新を,以下のように切り離して実行するようにします.
+ そのため,この updateGPS() メソッドを書き換えることによって,自動更新のON/OFFを制御することができるようになります.
+
+public class Presenter {
+ private Longitude longitude;
+ private Latitude latitude;
+ private MapLongitude mapLongitude;
+ private MapLatitude mapLatitude;
+ :
+ public void updateGPS(double cur_lat, double cur_long) {
+ double longitude = this.longitude.updateGPS(cur_lat, cur_long);
+ double latitude = this.latitude.updateGPS(cur_lat, cur_long);
+ this.mapLongitude.updateLongitude(longitude);
+ this.mapLatitude.updateLatitude(latitude);
+ }
+}
+
+ 本課題では,リファクタリングに要した時間を測っていただきますので,お手元に時計をご用意ください.
+ 時間計測にあたって,急いで作業していただく必要はまったくありません.
+ 最初の課題から最後の課題まで一定のペースを保てるよう, 正しくリファクタリングを行うことを意識してください.
+ 課題に着手する前に開発環境を立ち上げて現状のソースコードの確認をしていただいて構いませんが,実際のソースコードの変更は時間計測の準備ができるまで行わないで下さい.
+
+ 作業に着手する前に,main ブランチから,メッセージでお伝えした自分専用のブランチ(user??Refactor)を新規作成して,一度 push を行ってください.
+ push を行った後,開発環境の準備ができれば,時間計測を開始してください. 時間計測はできる限り,30秒以内の単位での計測をお願いします.
+ ソースコードの変更作業は上記「Map のリファクタリングの概要」にしたがって進めてください.
+ テストプログラムTestGPSUpdate.javaが正しく動作するまでは作業完了とは見なされないので注意してください.
+
+ リファクタリングの作業が完了したら作業時間を記録し,その後,作業結果を自分専用のブランチに commit & push してください.
+ ただし,main ブランチには決して merge をしないように,また自分専用のブランチを決して削除しないように注意してください.
+ push 後に,以下のアンケートにお答えください.
+
+
+ アンケートフォーム (別タブが開きます)
+
+
+