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