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


課題概要:

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


SimpleTwitter 機能追加:

このSimpleTwitterプログラムでは,GPSの位置情報が更新されるたびに,それに合わせて地図の表示位置も自動で更新されます.しかしながら,地図アプリのユーザはいつでも自分の周辺の地図を閲覧したいわけではありません. 例えば,電車に乗りながら目的地周辺の地図情報を確認したい場合,電車の動きに合わせて地図の表示位置が勝手に動いてしまうと困ります.


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

現在の設計では,以下のクラス図のように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);
	}
}

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

そこで,以下のクラス図のように新たに 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);
	}
}

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

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

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

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



【Map ツール課題】へ