Titanium Desktopアプリの設計方針(4)2012/03/08

Titanium Desktopを使った業務アプリの開発で、設計方針を決める話の第4話です。設計方針の話としては、今回が最後となります。

今回は、HTMLとCSSを取り上げます。昔に比べるとCSSも機能が増え、実現できる範囲が広がりました。それでもなお、自由なレイアウトが簡単に作れるわけではありません。私個人としては、HTMLとCSSの組み合わせは、未だに不良品だと思っています。レイアウトを作ることに関して、根本的に設計が悪すぎるからです。

最近は大きな画面のモニタが増えました。画面を有効に使うためには、3段組とか4段組だけでなく、もっと自由な画面分割でレイアウトしたくなります。ところが、HTMLとCSSの組み合わせでは、非常に苦労します。もちろん皆さんも、ご存じのことでしょう。

HTMLからデザイン要素を取り除くため、できる限りCSSでデザインするという流れがあります。この考え方自体は非常に共感できるのですが、現実は辛いことばかり。納得のいかないことばかり。

代表的な例を1つ取り上げましょう。CSSで2段組や3段組を実現するとき、大きな違和感を感じます。2段組では、CSSのfloat指定でブロックを左右に分けます。3段組になると、2段組を二重に組合わせて実現するという情けなさです。HTML側は、divタグで何重にも囲む醜さが目立ちます。HTML側を汚さずにレイアウトを決めるはずのCSSなのに、多重divタグでHTML側を汚してしまってます。また、変な技を使わないと段組を作れないのは、根本的な問題です。すべてCSSの仕様の悪いのが原因でしょう。

もっと理想的な形は、レイアウトを自由に作れる機能をCSS側に用意することです。まるでtableタグで画面を区切るような形で、レイアウトを設計する機能をです。もちろんHTML側を汚さないのが大原則ですから、レイアウト用のタグは用意しません。すべてCSS側で指定する形にすべきです。書籍の2段組や3段組では、複数の段に1つの本文が流れます。HTML側にある連続したpタグが、CSS側で用意した複数段へと、文章が続くように挿入されていく機能も必要でしょう。このような発想でのCSSレイアウト機能だと思います。

実際には使えない話を語っているだけでは、ソフトウェアが完成しません。現実にどうするか、どの機能を使って実現するかを選択しなければなりません。過去にHTMLやCSSを使ってきた経験から、次のように決めました。全体の大まかなレイアウトに限り、複数段の実現では関しては、CSSを使わずに、tableタグを使います。

tableタグによるレイアウトは、HTMLやCSSの機能が貧弱だったときに多用された、古典的なレイアウト実現方法でした。それだけに、ほとんどのブラウザで安定した動きをします。期待を裏切られることは、めったにありません。逆にCSSは、細かな部分でブラウザがサポートしていないとか、困った状況が発生しやすい欠点があります。

実は、もっとも決め手となったのは、ウィンドウを画面いっぱいに広げたときの動きです。業務アプリの場合、そのウィンドウだけを画面いっぱいに広げて使うことが多くあります。そのとき大事なのが、コンテンツが中央に寄るかどうかです。HTMLでは左に寄ることが多く、非常に格好が悪く見えます。当然、アプリの信頼性も低そうに見えます。中央に寄せるのを実現する方法として、CSSを使うと、多くのブラウザで実現するのが難しいのです。tableタグなら、全体の大きさをCSSのwideで指定し、tableタグにalign="center"と指定するだけです。

tableタグでレイアウトといっても、細かな部分にまで使うわけではありません。画面のヘッダー部分、コンテンツの中身となる中央部分、中央分の下部の操作系、一番下の操作系となるフッター部分とい具合に、画面全体を4つに区切り、それぞれtableタグで囲むだけです。操作系は、tableタグ内を左右に分割します。コンテンツ部分は、必要に応じて多段組や上下複数段に分割します。こうした全体のレイアウトにだけ、tableタグを使うというわけです。

レイアウト用のtableタグ以外は、できるだけCSS側で属性を指定し、HTML側に細かな設定を持たないように作ります。CSSの設定も、ヘッダー用、フッター用、コンテンツの中身用、コンテンツ内の操作系用と、完全に4つに分けます。同じ設定なら一箇所で変更可能にとは作らず、使用場所ごとに設定を別にする作りとします。こうするとヘッダーだけ変えたいときに、変更の影響がヘッダー以内には及ばないと予測できます。そうではなく、同じ設定値だから一箇所にと設定値を無理矢理に1つにまとめると、影響の及ぶ範囲が把握しにくくなり、変更の際、困った状況に陥りやすいのです。

さて、ここまでの4回で、Titanium Desktopを使った業務アプリの設計指針がまとまりました。この方針に沿って、あとは実際の設計に進むだけです。といっても、HTMLによる画面の種類で区分けされる構造なので、必要な画面をHTMLで用意して、相互に接続するという形にしかなりませんが。

実際、アプリ自体は一旦完成して、依頼主が試用し始めました。その後、試しにiPad版をTitanium mobileで移植し始めたら、構造が違うので大枠を変えてしまったものの、意外に素早く移植できてしまいました。こちらも依頼主が試用し始めてます。当然ながら、機能はほとんど同じです。もともとiPad版で動かしたいという要望だっただけに、やはりiPad版を気に入ってしまいました。とりあえずiPad版を本番で使い始める準備中で、デスクトップ版は予備として残すという形だそうです。

デスクトップ版もタブレット版も、Titanium Studioで作れるのは非常に便利です。JavaScriptで統一できるのも素晴らしいです。ここではTitanium Desktopとして話を始めてしまったので、当分はデスクトップ版アプリ作りの話を続けたいと思います。

Titanium Desktopアプリの設計方針(3)2012/02/23

Titanium Desktopを使った業務アプリの開発で、設計方針を決める話の第3話です。

今回は、画面設計の方針を決めます。実現する技術に関してではなく、画面内に入れる情報レイアウトなどの標準化ですね。とくに目新しいことはなく、非常に一般的な方針を「おさらい」する感じです。

画面を上中下の3層に分けて、上部層がタイトル、下部層には画面移動などの、画面内容と関係の薄い操作系ボタンを入れます。下部層のボタンは左側と右側に分けて、画面切り替えボタンを左側に、その他のボタンを右側に並べましょう。

画面の中央層には、各画面の中心となる情報表示、情報操作のフィールドやボタンなどを並べます。ボタンについては、個別の情報に関係するものは情報表示の隣に、「登録」などの情報全体に関わるものは下側に並べます。

上中下の3層の区切りが明確になるように、区切り部分にBRタグを入れて境界を目立たせます。業務アプリですから、見栄えよりも分かりやすさを重視しているわけです。全体としての下部層にボタンが並び、中央層の下部にもボタンが並びますから、その区切りを伝える意味もあります。

続いて操作性に関してです。以前のシステムを設計したときから、マウスだけで(つまりキーボードを使わずに)操作できるようにとの強い要望が依頼主ありました。もちろん全部の操作が対象ではなく、日常業務で操作する画面に関してだけです。値の増減は、できる限り「+」や「−」ボタンなどで行い、キーボードなしで使えるように配慮します。

エラーなどのメッセージを出す場所も決めます。下部層では、左右両端のボタンの間に、メッセージ用のラベルを用意します。中央層でも、一番下に付けた左右両端ボタンの間に、メッセージ用のラベルを作ります。

2つメッセージ用ラベルの使い分けは、非常に簡単です。個々の画面の内容に関するメッセージは、中央層のラベルに表示します。システム全体に関わるエラーなどは、下部層のラベルに表示するという具合です。たとえば、アプリの環境設定ファイルが読めない場合、システム全体でのエラーですから、下部層のエラーに表示することになります。ほとんどの機能はボタンで開始しますから、ボタンが付いている側のラベルを使うことになり、迷うことはありません。

画面に出すエラーメッセージも重要度で色分けします。重大なエラーは赤色で、注意点なら青色で、処理が成功したのを知らせるなら緑色などです。この辺の簡単な実現方法は、また別の機会に取り上げましょう。

残りはHTMLとCSSについてですが、これは次回に。

Titanium Desktopアプリの設計方針(2)2012/02/22

Titanium Desktopを使った業務アプリの開発で、設計方針を決める話の続きです。

どのAPIを採用するか考えます。将来の互換性や移植性を考慮すると、できる限りHTML5を重視すべきでしょう。しかし、困った問題があります。ローカルファイルの読み書きを実現するFile APIが、まだまだサポートされていないのです。メジャーなブラウザでさえ、サポートしていても読むだけとか限定的なサポートがほとんど。調べてみると、全部をサポートいるのが、GoogleのChromeだけというお寒い状況のようです。

仕方がないので、ローカルファイルの読み書きだけは、Titanium DesktopのAPI、Titanium.Filesystemを使うことにしました。これで作っておき、あとでFile APIに書き換えるという形で進めます。

続いて、保存するファイルのフォーマットです。文字コードはUTF-8で決まりとして、XMLやJSONを採用するかです。

今回の業務システムは、データ量はそれほど多くありません。ただし、入力したデータを表計算アプリに持って行き、友人が経営分析に使う必要があります。タブ区切りテキストとして出力して欲しいとの強い要望がありました。

いろいろと考えたら、XMLではなく、全部をタブ区切りテキストでも構わないと判断しました。ファイルの読み書きでは、1ラインごとに処理できるAPIが用意されていて、それへの適合性もばっちりです。テキストエディタでの編集も容易で、状況調査もリカバリーも簡単にできます。業務上の各種データだけでなく、アプリの設定値などもタブ区切りで作ることにしました。

タブ区切りテキストから読み込みながら、JavaScriptの配列へ入れます。逆に、配列からタブ区切りテキストとして書き出します。これらの処理なら、短く簡潔に作れますので。

画面ごとに処理を独立させる方針なので、タブ区切りテキスト・ファイルの読み込み、逆の書き出し、読み込んだデータを入れる配列変数を、すべて共通処理のJavaScriptに入れます。すべての画面のHTMLで読み込み、画面ごとに必要な処理だけ呼び出して使います。

画面ごとの処理では、配列からの読み出し、配列への書き出しを行います。つまり、ファイルと配列の間は共通処理、配列と画面間の処理は画面ごとの処理という分け方です。当然ながら、ファイル名などのファイル関連情報や、データを入れる配列変数は、共通処理の中に含めます。

さらに異なる画面でも、同じデータを扱う項目が考えられます。画面上のテキストフィールドやラベルを、異なる画面でもidを同じに設定すれば、共通のJavaScriptで出し入れできるはずです。これも共通処理に入れて、スクリプトの重複を減らすことにしましょう。当然ですが、共通のidも共通処理に含めます。加えて、配列の中身を調べたり、一部を抜き出したり、複数画面で使えそうな処理も共通処理に入れますね。

アプリの設定に関しても、設定値へアクセスする関数を共通処理側に用意します。このような形だと、設定の配列構造に依存せず、変更しやすくなります。また呼び出す側でも、読みやすいプログラムになるでしょう。

続いて画面設計の方針ですが、これは次回に。

Titanium Desktopアプリの設計方針(1)2012/02/21

どんなシステム開発でも、設計方針を決めずに進めると、開発の質が低下しがちです。設計方針は、使うプログラミング言語などに依存し、適した方針を決めなければなりません。

Titanium Desktopによる開発では、HTML、JavaScript、ブラウザが基本となります。また、これらを含めた形の独立動作アプリとしてもビルドできます。今回は、ターゲット環境がMac限定なので、Mac用の独立動作アプリとしてビルドすることに決めました。ブラウザのバージョンアップに依存しないほうが、システムとして安定するだろうとの判断です。

続いて、システム全体の構成を考えます。将来的にはブラウザで動作させる可能性もありますから、ブラウザ上で動かすことも考慮します。ブラウザで一番心配なのは、動作の安定性です。途中で異常終了したために、せっかく入力したデータを失ったら、業務が大変な状態に陥ります。

そこで最大の設計方針は、「途中で異常終了しても、できるだけデータを失わない構造にすること」としました。具体的には、入力したデータは、すぐにファイルへ書き込むこと。ただし、書き込む途中で異常終了すると、ファイルごと失う可能性もあります。ファイルへの追加書き込みはせず、前のファイルをコピーしてから、新しいデータを追加する方式とします。せっかくなので、前のファイルも数世代ほど保存することにしましょう。

このような方法で設計すると、新しいデータの書き込み中に異常終了しても、新しいデータ1件を失うだけで、過去に入力したデータは失いません。異常終了により、データが正しく入力されていないことは分かりますから、そのデータを再入力するという判断も容易でしょう。

システムで使用する画面は、入力画面だけではありません。入力したデータをグラフ表示したり、入力データを後で変更したり、業務システム固有の設定をしたり、何個もの画面を行き来します。これらの移動で、データを受け渡しする方法も考えなければなりません。

どうせなら、画面ごとに完全に独立して動く方式が一番良いと思いました。画面ごとに独立するとは、必要なデータを画面ごとに読み込み、JavaScriptも独立させるということです。JavaScriptの共通部分はひとまとめにして、全画面で読み込めばよいでしょう。画面を独立させることで、画面間の受け渡しデータが不要になり、自由に行き来できる形に仕上がります。

こうした方法だと、画面を切り替える度に同じファイルを読み込むことになります。しかし実際は、HDDから毎回読み込まれるわけではありません。Mac OS Xの場合は、RAMの空きに読んだファイルを残しておいて、再度読み込むときに利用しています。そのため頻繁に画面を切り替えても、HDDアクセスは生じず、短い時間で切り替わることになります。

設計方針の検討は、まだ続きます。採用API、ファイルのフォーマット、画面レイアウトの標準化などです。続きは、次回に。

Titanium Desktopを使うことに2012/02/21

iPhone向けのアプリ開発用として、Titanium Studioをインストールしました。それから何週間か経過したとき、以前からの知り合いと飲む機会がありました。私が昔に開発したアプリを未だに使い続けているけど、そろそろ新しい環境で動く版が欲しいなと。

彼も私も、古くからのMacユーザーです。昔に作ったアプリも、Mac上の古いマシンで動いています。彼の要望としては、とりあえずは新しいMac上で動かし、将来的にはiPadで動かしたいと。

彼は小さな会社を営んでいて、アプリは業務で毎日使っています。ジャンル的には業務アプリで、きっちり作らなければなりません。雇っている人(つまりパソコンが苦手な人)も使うため、使いやすさも重要です。意外に気を使って設計しなければならないアプリなのです。

とりあえず開発ツールを調べてみました。すると、Titanium Studioに含まれているTitanium Desktopが良いと感じました。HTMLとスクリプト言語で開発できるため、将来の移植性も高いでしょう。その先のiPad上での実現方法は少し悩みますが、Mac版アプリはTitanium Desktopで作ることに決めました。

実は、JavaScriptはほとんど使ったことがありませんでした。最近10年ほどは開発から遠ざかっていて、Javaまでしか知りません。JavaScriptは、ホームページを作るのに少し使ったぐらいで、知識はゼロに近かったのです。調べてみたら簡単に使えそうなので決めました。自由に使えるライブラリが豊富なのも魅力です。

これから何回かに分けて、開発中に気付いた点などを書き留めたいと思います。過去にいくつものシステム開発に参加した経験を生かしながら、他のブログとは少し違う視点で書きたいですね。