先日の連休中に、友人のIT技術者と、じっくり話をしながら飲みました。そのときに、ライブラリ化の話で盛り上がったのですが、私が気付いてなかった点を指摘されました。その話を短かく取り上げます。
友人の指摘は「ライブラリ化が容易になっているのは、Interface Builderを使わずに開発していることが、非常に大きい」というものでした。ぜんぜん気にしていない点だっただけに、かなり驚きました。
友人の意見は大事な点が何個も含まれていましたが、要旨を整理すると以下のようになります。
友人の意見の要旨
・Interface Builderを使わないことで、
・ライブラリに含まれるのはSwiftのソースコードだけ
・サイズの変更が容易となり、Viewの大きさに合わせたサイズ調整が容易
・必要な数だけのUI部品が、短いソースコードだけで連続して生成できる
この中で一番大きな点は、Swiftのソースコードだけでライブラリが作れる点だというのです。
このブログの最初に宣言したとおり、私の開発ではInterface BuilderとStoryboardをまったく使っていません。UI部品の生成関数を用意して、すべてのUI部品をその関数で生成しています。そのため、ライブラリに含まれるのは、Swiftのソースコードだけとなります。まさに、指摘されたとおりです。
どのライブラリも、Swiftのソースコードだけで作られていて、しかも1つのファイルに収まっているため、アプリへは簡単にコピーして持っていけます。
当然ですが、アプリ内でのライブラリのバージョンアップも簡単です。古いソースコードを削除して、新しいソースコードに入れ替えるだけです。ライブラリのインターフェースはめったに変えませんから、アプリ側を直さずにバージョンアップできています。Swift側やAPI側の仕様変更を除いて。
ライブラリを作るときだけでなく、テスト環境まで保存しているiOS実験専用アプリ自体も含めて、Interface BuilderやStoryboardを使っていません。Xcodeの新規プロジェクトから、Single View Applicationを選び、空の画面のアプリケーションを用意しました。そのままSwiftコードだけを追加して、iOS実験専用アプリを仕上げています。
当然ですが、ライブラリのテストで使う画像や音のファイルは、iOS実験専用アプリのプロジェクトに追加しています。それ以外のテキストデータなどは、Swiftのテストコードに中に入れ、ソースコードの形で用意できるようにしています。テスト用のテキストファイルも基本的に、Swiftのソースコードから生成し、わざわざファイルを用意しないのが基本です。
このように、改めて見直すと、できる限りSwiftのソースコードから作っていますね。今書いていて気付いたのですが、別に用意している画像ファイルも、描画機能を使って描いてからファイルに保存すれば、Swiftのソースコードから作れますね。まあ、やらないでしょうけど。
Swiftでアプリ開発を始めるとき、ツールによる余計なトラブルを避ける理由と、自由度を優先するという理由から、Interface BuilderやStoryboardを使わないと決めました。その選択が結果として、ライブラリ構築の自由度も上げていたわけです。
自分にとっては、あまりに当たり前の選択だっただけに気にしておらず、言われるまで気付きませんでした。結果としては、Interface BuilderとStoryboardを使わない選択が、ライブラリ構築にも良かったわけです。
ちなみに友人も、Interface BuilderやStoryboardを使わない方式に切り替えたそうです。そして、自分専用の独自ライブラリを少しずつ構築中だとか。
とは言うものの、Interface BuilderやStoryboardを使わない開発を、他の人に勧めるかといえばノーですね。開発者にもいろいろな人がいて、便利ツールがないと苦労する人もいますから。ですから最初は、とりあえずInterface Builderを試すように勧めます。
Interface Builderを使わずに開発する方法には、軽い壁があると思います。それほど大きな壁ではありませんが、それを乗り越えられる人でないと難しいでしょう。具体的には、UI部品を生成するライブラリを自分で整えるとか、Interface Builderの代わりとなる道具を自分で用意する手間と技術が必要となります。その条件を軽く乗り越えられる人なら、Interface Builderを使わなくても大丈夫です。
もし大丈夫な人なら、使わないほうを積極的に勧めます。ライブラリさえ用意してしまえば、開発の自由度が格段に増し、すべてソースコードでコントロールできる形になりますから。経験が長いというか、それなりに実力のある人には、使わないほうを積極的に勧めたいですね。
Interface Builderを使わない開発では、画面レイアウトの問題が常に生じます(使う開発でもある程度は生じていますが、自動レイアウトで何とかなる場合もありますから、問題が軽減されているでしょう)。
今のところiPad開発ばかりなので、画面サイズの違いを考慮しなくて済んでいます。UI部品の表示位置や大きさを数値で指定する方法で、問題はまったくありません。しかし今後はiPadも、複数の画面サイズを意識しなければならない状況になると予想します。現状のiPhoneのように。
一応、対策は考えています。自動レイアウトは使いたくないので、画面サイズごとにレイアウトを切り替える予定です。切り替えといっても、ソースコードは1つにして、画面サイズごとに別な座標数値を使う方法です。座標数値を配列に入れ、その配列を参照しながら表示位置を決めれば、複数のレイアウトへ簡単に対応できます。UIView型ライブラリがサイズ可変なのも、このような状況を予想してのことです。配列から座標を読み込む方法で作った結果、見栄えや使い勝手が悪い場合にだけ、完全に別なレイアウトで作る予定です。
複数の画面レイアウトの問題は、Interface Builderで解決できるものではありません。自動レイアウトも限界はありますし、細かな見栄えは低下しがちです。今後も、大きな課題として残り続けるでしょう。
画面レイアウトの問題があっても、Interface BuilderとStoryboardを使わない開発を、止める気はありません。今までどおり、Swiftのソースコードだけで作った独自ライブラリを、どんどんと増やしていくつもりです。
Swiftでの開発に慣れてきて、Interface Builderを使っている方は、使わない方法を一度検討してみてはいかがでしょう。もしかしたらですが、素晴らしい未来が待っているかもしれません。最初の取り掛かりとして、UI部品を生成するライブラリ作りからお勧めしたいですね。
0 件のコメント:
コメントを投稿