RouteJsonParser の構造は、いまだと必要のないアトリビュートが存在している。
status、class Routes に関連する子や孫たちである。
ストーリを読んでみると、RouteJsonParserさんは大変だ。自分の仕事だけでなく、子供、孫まで面倒見てるんだね。
子供が生まれたらそのつど、かみさんにはまかせておけないから、RouteJsonParserさんが面倒見るんだ、しかもその孫たちまでも、もしかしたら曾孫も面倒見るのかな?
といった感じ!
JSONデータのバージョンが変わったらそのつど、RouteJsonParser を改修し複数のバージョンに対応していく。
・・・ありえん!
これは、内部クラスのひとつの弊害である。
お手伝いしたプロジェクトで、こんな事例によく遭遇した。
なので、RouteJsonParser を書き直します。
public class RouteJsonParser { /** * 元になる経路情報 */ private JSONObject jsonRoute = null; /** * パースされた経路情報 */ private List<Routes> routes = null; /** * パースできない場合のエラーコード */ private int error = 0; /** * GoogleDirectionsAPI のバージョン * 2014/10/01 現在リリースされているバージョン 1 を初期値とする */ private int verGoogleDirectionsAPI = 1; /** * コンストラクタ * Google Directions API のバージョンは 1 */ public RouteJsonParser() {} /** * コンストラクタ * @param ver Google Directions API のバージョン */ public RouteJsonParser(int ver) { verGoogleDirectionsAPI = ver; } /** * JSONデータをパースする * @param jsonString JSON文字列 * @return パースした経路情報 */ public List<Routes> parse(String jsonString) { // バージョンごとに対応、JSONデータをパースする switch(verGoogleDirectionsAPI) { case 1: break; default: } return routes; } /** * パースされた経路情報を取得 * @return */ public List<Routes> getParseListt() { return routes; } /** * JSONデータが有効であるか検査する * @return true:有効 false:無効 */ public boolean isSuccess() { return true; } /** * ステータスコードの取得 * @return */ public String getStatus() { return ""; } /** * エラーコードを取得 * @return */ public int getError() { return error; } }
だいぶすっきり、明確になりました。
ストーリーを読んでみると、
RouteJsonParserさんのお仕事はJSONデータをパースすることで、パースした内容はいつでも引き出せるように保持する。
パースするデータがバージョンの異なるデータが放り込まれても、生まれたときに対応するバージョンが決められているので、決められたことしかしない。なので、生まれる前にバージョンをきめといてね!
パースのお仕事が済んだら、うまくできたか報告することと、ちょっとだけパースした中身のステータスを教えてくれるそうだ.
また、パースできなかった原因も報告してくれるらしい。
こんな感じで、私には読めました。いかがですか?
ちなみに、RouteJsonParserさんに Routesさんのことを聞いてみました。
「俺、Routesさんと付き合ってるんだけど、よく知らないんだ」
とのお答えでした。
以前のソースでは結婚し子供まで作っていたのに・・・・