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 後に,以下のアンケートにお答えください.
+
+
+ アンケートフォーム (別タブが開きます)
+
+
+