経路情報をパースする 設計 3

RouteJsonParserさんに離婚されて、一人で子供や孫たちの面倒を見ることになったRoutesさん、母子家庭で大変なので整理してみます。
今はこういった現状

public class Routes {
	private String summary = "";
	private List<Legs> legs = null;
	private String waypoint_order = "";
	private List<OverviewPolyline> overview_polyline = null;
	private String bounds = "";
	private String copyrights = "";
	private String warnings = "";
	class Legs {
		private List<Steps> steps = null;
		private Distance distance = null;
		private Duration duration = null;
		private ArrivalTime arrival_time = null;
		private String departure_time = ""; //Time オブジェクト?
		private String start_location = "";
		private String end_location = "";
		private String start_address = "";
		private String end_address = "";
		class Steps {
			private String html_instructions = "";
			private Distance distance = null;
			private Duration duration = null;
			private String start_location = "";
			private String end_location = "";
			private List<Steps> sub_steps = null;
			private TransitDetails transit_details = null;
			class TransitDetails {
				// 乗り換えについては後で設計する
			}
		}
		class Distance {}
		class Duration {}
		class ArrivalTime {}
	}
	class OverviewPolyline {}
	
	Routes() {}

}

最初に手がけるのは、子供たちを自立させます。とくに子供や孫を抱えてるものたち!

class Legs、class OverviewPolylineを外部クラスにします。
アトリビュートを眺めると、内部クラスとするべきものがない。
ただし、クラスにすべきものがいくつかある。
waypoint_order 、bounds 、warnings などは配列もしくはデータ構造を持っている。
現在、その構造やオブジェクトの分析は行なっていないので、Stringのままとして扱う。

そうすると
Routes.java

public class Routes {
	private String summary = "";
	private List<Legs> legs = null;
	private String waypoint_order = "";
	private List<OverviewPolyline> overview_polyline = null;
	private String bounds = "";
	private String copyrights = "";
	private String warnings = "";

	Routes() {}
}

class Routes の要件は JSONObject から必要な値を取得することである。
その要件で書くと

public class Routes {
	/**
	 * ログのタグ
	 */
	private final String LOG_TAG = this.getClass().getSimpleName();
	/**
	 * JSON TAGS
	 */
	public enum Tags {
		SUMMARY("summary"),  
		WAYPOINTORDER("waypoint_order"), 
		BOUNDS("bounds"),
		COPYRIGHTS("copyrights"), 
		WARNINGS("warnings"), 
		LEGS("legs"), 
		OVERVIEWPOLYLINE("overview_polyline");
		private String name;
		Tags(String name){this.name = name;}
		public String getName(){return this.name;}
	}
	/**
	 * JSON オブジェクト
	 */
	JSONObject jsonRoutes = null;
	/**
	 * コンストラクタ
	 * @param json RouteJsonParser からわたされる
	 */
	public Routes(JSONObject json) {
		jsonRoutes = json;
	}
	public String getSummary() throws JSONException {
		return jsonRoutes.getString(Tags.SUMMARY.getName());
	}
	public String getWaypointOrder() throws JSONException {
		return jsonRoutes.getString(Tags.WAYPOINTORDER.getName());
	}
	public String getBounds() throws JSONException {
		return jsonRoutes.getString(Tags.BOUNDS.getName());
	}
	public String getCopyrights() throws JSONException {
		return jsonRoutes.getString(Tags.COPYRIGHTS.getName());
	}
	public String getWarnings() throws JSONException {
		return jsonRoutes.getString(Tags.WARNINGS.getName());
	}
	public List<Legs> getLegsList() {
		List<Legs> list = new ArrayList<Legs>();
		JSONArray array;
		try {
			array = jsonRoutes.getJSONArray(Tags.LEGS.getName());
			for(int i=0;i<array.length();i++) {
				list.add( new Legs(array.getJSONObject(i)) );
			}
		} catch (JSONException e) {
			list.clear();
			Log.e(LOG_TAG, "getLegsList() " + e.getMessage() );
		}
		return list;
	}
	public List<OverviewPolyline> getOverviewPolylineList(){
		List<OverviewPolyline> list = new ArrayList<OverviewPolyline>();
		JSONArray array;
		try {
			array = jsonRoutes.getJSONArray(Tags.OVERVIEWPOLYLINE.getName());
			for(int i=0;i<array.length();i++) {
				list.add( new OverviewPolyline(array.getJSONObject(i)) );
			}
		} catch (JSONException e) {
			list.clear();
			Log.e(LOG_TAG, "getOverviewPolyline() " + e.getMessage() );
		}
		return list;
	}
}

ちゃっかり実装してますが、してないこととして見てください。(笑)
子供たちを自立させたので、内部クラスは存在しません。ただ、アトリビュートを enum Tags で宣言しています。
enum Tags を インターフェイスにしても問題はありません。
インターフェイスについてはここでは触れません。何かに機会があれば、書くかもしれませんが・・・

このクラスの要件はJSONObjectから取得するなので、set関数は存在しません。
すべて、get関数です。
コンストラクタだけは、RouteJsonParser から 子供たちの養育費(JSONObject)をもらっています。(笑)
内部クラスであった、子や孫たちも同じように設計していけば完了です。

これだと、アトリビュートが追加されたり、バリュー(値)に若干の変更があってもクラスを派生させるなり、直接改修するなりしても他のクラスには依存してないので問題ありません。
大規模な構造変化の場合は最初から作り直さなければなりませんが(笑)

内部クラスは、その他のクラスと依存関係がないものだけにしましょう。
そのようにすると、そのクラスだけで完結できます。ただし、例外的なものはありますが、ここではふれません。

Routesさんに後日聞いてみました。
「子供たちはどうしました?」
「みんな自立して働いてます。必要なときに養育費をわけてます(依存関係)」

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>