t-robop / spica-poster

プログラミング思考教育ツール ポスター
0 stars 0 forks source link

androidアプリの設計解説 #14

Open y-ogawara opened 6 years ago

TaigaNatto commented 6 years ago

設計

Presenterクラス

Spicaアプリケーションではロボットへのデータ送信部分とUI描画部分の2つの層で同一のデータが必要でした。そこで今回はPresenterクラスにユーザの追加したブロックのデータを保持させ、そのPresenterクラスをすべての画面で操作できるようにすることで対応しました。Presenterクラスではユーザのブロック追加時のadd処理、set処理はもちろん、それら両方を兼ねたinsertメソッドによって簡単に不備なくデータを整形するようにしました。また、Presenterクラスには全ての画面からアクセスできるため「現在どこの画面が表示されているのか」という情報も保持しています。これによって、追加と編集でフラグを立てたりといったことをする必要がなくなり、開発がしやすくなりました。

データ送信部分

まずPresenterクラスのもつユーザの追加したブロックのデータを、送信用の文字列に変換します。 前進2秒で速さ普通 -> 0001100100020 これを追加されたデータだけ繋げて、ロボットにUDPで送信します。

UI描画部分

Presenterクラスのもつユーザの追加したブロックのデータ群を渡せば、その都度Viewにブロックが描画されるメソッドを作成しました。これによって複雑にデータ群が変更された時や、保存していたブロックの復活時などに必要な描画を簡単に行うことができます。中身の実装としては、与えられたブロックデータをそのまま並べて描画していくだけです。しかし、問題だったのがIFブロックでした。IFブロックではTrueレーンとFalseレーンの2つが並行して描画されるので、通常のViewでは描画できませんでした。そこで、RecyclerViewというスワイプが可能になるViewを使い、上レーンと下レーンで2つのブロックを置くことができるアイテムを描画しました。通常のブロックの場合は上レーンを描画する必要が無いのでnullを渡して「何もない」を描画させています。同様に、IFブロックを配置した時には上レーンに「IFの開始ブロックのみ必要な導線」を描画させ、IF中に片方のレーンがnullの場合は「導線」のみを描画するなどして対応しました。 次に問題になったのがIFレーンの配置処理です。Presenterクラスの保持しているデータではIFブロックに挟まれてるブロックはTrueブロック群 -> Falseブロック群の順番で保持しているため、どこからTrueブロックなのかを判断してTrueブロックを描画した下レーンにFalseブロックを配置していくことで描画しました。