【SimpleTwitter(Alloy)】
機能追加課題


課題概要:

本課題では,SimpleTwitterプログラムにアカウント名を変更可能にする機能追加を行っていただきます.


SimpleTwitter 機能追加:

このSSDStoreプログラムが,サイトA以外のサイトからも商品情報を収集して扱えるようにすることを考えます.


SSDStore のリファクタリングが必要な理由:

以下では,リファクタリングに要した時間を測っていただきますので,お手元に時計をご用意ください. 時間計測にあたって,急いで作業していただく必要はまったくありません. 最初の課題から最後の課題まで一定のペースを保てるよう, 正しくリファクタリングを行うことを意識してください. 開発環境を立ち上げてソースコードの確認をしていただいて構いませんが,ソースコードの変更は時間計測の準備ができるまで行わないで下さい.
まずは、以下の作業手順を一通り読んでから作業を開始してください.

現在の設計では,以下のクラス図ように 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 オブジェクトが直接,個々のサイトのオブジェクトを参照しているような現在の設計では,拡張作業が煩雑になってしまいます.


SSDStore のリファクタリングの概要:

そこで,以下のクラス図のように複数のサイトを同時に参照することができる 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();
	}
}

SSDStore のリファクタリング課題の作業手順:

本課題では,リファクタリングに要した時間を測っていただきますので,お手元に時計をご用意ください. 時間計測にあたって,急いで作業していただく必要はまったくありません. 最初の課題から最後の課題まで一定のペースを保てるよう, 正しくリファクタリングを行うことを意識してください. 課題に着手する前に開発環境を立ち上げて現状のソースコードの確認をしていただいて構いませんが,実際のソースコードの変更は時間計測の準備ができるまで行わないで下さい.

作業に着手する前に,main ブランチから,メッセージでお伝えした自分専用のブランチ(user??Refactor)を新規作成して,一度 push を行ってください.
push を行った後,開発環境の準備ができれば,時間計測を開始してください. 時間計測はできる限り,30秒以内の単位での計測をお願いします.
ソースコードの変更作業は上記「SSDStore のリファクタリングの概要」にしたがって進めてください.
テストプログラムTestSSDStoreUpdate.javaが正しく動作するまでは作業完了とは見なされないので注意してください.

リファクタリングの作業が完了したら作業時間を記録し,その後,作業結果を自分専用のブランチに commit & push してください.
ただし,main ブランチには決して merge をしないように,また自分専用のブランチを決して削除しないように注意してください.
push 後に,以下のアンケートにお答えください.
アンケートフォーム (別タブが開きます)



【SSDStore ツール課題】へ