Skip to content

Latest commit

 

History

History
96 lines (76 loc) · 7.4 KB

File metadata and controls

96 lines (76 loc) · 7.4 KB

本プロジェクトの解説を行います。 まず、本プロジェクトは非線形な地図を扱うことのできる地図表示APIプロジェクト「Maplat」のコードで、UIを持たない表示機能だけを司るMaplatCoreと、UIを担当するMaplatの2レポジトリからなっています。 さらに、両プロジェクトとも、本流のmasterブランチと、傍流のブランチがあり、Maplat_1、 MaplatCore_1が本流、Maplat_2、MaplatCore_2が傍流のブランチになっています。 両者の違いはこうです。

  • 元々、本流のMaplatでは、アプリ起動時はGPSが起動しておらず、GPSボタンを押すと、GPS取得モードになりつつ、初回のみGPSの場所に表示が移動、もう一度GPSボタンを押すとGPSがオフになるという仕様でした。また、基本的にはユーザ端末の電池の持ちを抑える発想で設計していたので、GPSの位置が地図の表示範囲外で現在地表示に資さない時は、GPSを即座に範囲外エラーとしてオフにする発想の状態遷移を行っていました。
  • しかしその後、一部ユーザの希望に応じて、GPSの取得をカスタマイズしました。これが傍流です。傍流の遷移思想は、アプリ起動時から常時GPSオンとする思想でした。GPSが地図の範囲外であってもエラーとせず、表示しないだけで常時取得し、地図範囲内にユーザーが移動すれば即時位置表示できる発想でした。GPSボタンは、地図の表示位置をGPSの位置に合わせるのに使うのみで、GPS自体のオンオフ機能には用いない発想でした。ただし例外として、なんらかのデバイスの状態エラーなどでGPSが取得できない場合のみエラーとしてGPSはオフとなり、その状態の場合は再度GPSをオンにする試行を行うことにもGPSボタンは使います。
  • 本来、機能カスタマイズを依頼された際に、機能を切り替えられる実装にしていればよかったのですが、時間がなかったため置き換えてしまいました。さらに悪いことに、その後傍流の側に、新機能を追加してしまったりしたので、両者をマージして切り替え可能にしなくては、本流側の新バージョンを出せなくなってしまいました。
  • ですので、行いたいタスクは両者のマージなのですが、まずは変更を加えず、上記のような状況を実際の実装として把握できるか、まずは分析していただけないでしょうか。
  • 注意点として、本流と傍流で、HTML5のGeoLocation APIを処理する責務を、MaplatCoreに担当させるかMaplatに担当させるかなども変えていたはずなので、その視点で分析していただけると助かります。どちらがどちらだったかは、恥ずかしながら忘れてしまいました。

● GPS実装の本流と傍流の違い - 分析結果

コードの詳細な分析により、両者の違いと責務分担が明確になりました。

HTML5 GeoLocation APIの責務分担

本流(Maplat_1、MaplatCore_1):

  • GPS機能の責務:Maplat(UI側)
  • maplat_control.js:345-423でSetGPSクラスがol/Geolocationを直接使用
  • MaplatCoreにはGPS関連機能なし

傍流(Maplat_2、MaplatCore_2):

  • GPS機能の責務:MaplatCore(コア側)
  • 独自のGeolocationクラスを実装(geolocation.js/ts)
  • MaplatCore_2のindex.ts:125,299-349でGeolocation統合管理

GPS状態遷移の違い

本流の動作: // maplat_control.js:568-579 options.callback = function () { const receiving = this.element.classList.contains("disable"); const map = this.getMap(); map.handleGPS(!receiving); // トグル動作 if (receiving) { this.element.classList.remove("disable"); } else { this.element.classList.add("disable"); } };

  • GPSボタン押下でオン・オフ切り替え
  • 範囲外エラー時は即座にオフ(map_ex.ts:232,384)

傍流の動作: // maplat_control.js:316-346 options.callback = function () { const geolocation = ui.core.geolocation; if (!geolocation.getTracking()) { geolocation.setTracking(true); // 初回のみオン // 初回移動処理 } else { // 常時オン状態での位置移動のみ } };

  • 起動時から常時GPS取得(index.ts:303)
  • GPSボタンは位置移動専用
  • 範囲外でもGPS停止せず継続取得

実装アーキテクチャの違い

本流:

  • UI層でol/Geolocationを直接制御
  • GPS状態管理がUI側に分散

傍流:

  • コア層で独自Geolocationクラス一元管理
  • alwaysGpsOnオプション対応
  • エラーハンドリングの集約化

傍流は電池消費より利便性を重視した設計になっており、範囲外移動時の即座復帰が可能な仕様です。
⎿ ☒ 本流(Maplat_1、MaplatCore_1)のGPS関連実装を調査 ☒ 傍流(Maplat_2、MaplatCore_2)のGPS関連実装を調査 ☒ HTML5 GeoLocation APIの責務分担を比較分析 ☒ GPS状態遷移の違いを整理・報告 ⎿ API Error (Request timed out.) · Retrying in 1 seconds… (attempt 1/10)

✻ Thinking…

全ての分析タスクが完了しました。ユーザーが想定していた通り、本流と傍流で実装方法に大きな違い
があることが確認できました:

  1. 責務分担:本流ではUI側(Maplat)がGPS管理、傍流ではコア側(MaplatCore)がGPS管理
  2. GPS状態遷移:本流は電池節約優先のオン・オフ型、傍流は利便性優先の常時オン型
  3. アーキテクチャ:本流はOpenLayersの標準Geolocation使用、傍流は独自Geolocationクラス

この分析結果により、マージ時に考慮すべき点が明確になりました。

それでは、マージの方針を示しますので、マージを進めていただければ幸いです。

  • マージは、傍流側ブランチをベースに新ブランチを切って、対応します。直近の新機能は傍流側に加えられているためです。
  • GPS以外の機能は、デグレしないようにお願いします。
  • 傍流の独自Geolocationクラスは、HTML5のGeoLocationではテストのために独自の場所に位置情報を発声させられないため、テスト用に自由な位置を発声できるようにしたものです。これを引き続き使ってください。
  • マージ時に、実際の位置情報オンオフハンドリング、エラー判定、ユーザリアクションのトグルによる状態遷移管理などは、MaplatCore側に集約してください。その上で、Maplat側のGPSボタンUIは、MaplatCore側のトグルメソッドにトグルイベントを送り、その結果によってイベントを受け取り、表示するアイコンやアクティブ/非アクティブを切り替えるだけの機能に徹することで、どちらのモードで動作しているかを気にせず同一のUI実装として場合分けを必要とせず動作できる実装としてください。
  • MaplatCore側のGPS機能動作としては、デフォルトでは本流のGPS処理、alwaysOnフラグをtrueにして実行された場合は、傍流のGPS処理としてください。