Android徹底批判
※この文書はまだ途中です。
まえがき
もちろん、アップルがいくら嫌がらせをしてもAndroidが優位に立つことは間違いないし、Windowsの小さいやつとかその他のモバイルOSを駆逐してしまうことも約束されているのであろう。しかし、これに対してAndroidのAPI及び開発環境はとにかくひどい。なぜこれに皆口をつぐむのか不思議で仕方がない。
この種の問題はこの業界に限らないことなのであるが、それを推進している側としては「賛美」しか許されないのであろう。強くコミットしていればいるほど、批判は酒の席でしか語られず、表に出てこないものである。特にAndroidの教育・情報を飯の種にしている方などは、口がさけても言えないところだろう。
しかし、Androidの設計は明らかに「変」なのである。「変」で悪ければ「ちぐはぐ」という印象を拭えない。細かい設計ひとつひとつはさすがと思わせても、全体を通す設計思想ともいうべきものがほとんどデタラメとしか言いようがない。ここではこれらを徹底的に批判していく。
すべてをJavaで記述することができない
これが最大の問題点であり、これほどひどい設計は無いとさえ言える。 APIの多くの機能を使うためには、必ずXMLを記述しなければならないのである。Javaから操作する方法は全く提供されていない。
アップルのAPIように一般の開発者には知らされていない裏口があって、そこからなら操作できるのかといえばさにあらず。 Androidの(おそらく)すべてのソースは公開されているので、そんな不正は全くないのである。完全に術が無いのだ。
つまり、これを設計した者は「XMLを使うんだからJavaなんか使う必要なんかない」と考えているようなのであるが、これは大間違い。 XMLはJavaの代わりにはならない。
XMLは絵に描いた餅
さて、この設計者はXMLを手書きで記述することを想定していたのであろうか?まさかそんなことはないだろう。 何らかのGUIエディタで「簡単に」プログラムを作成することを夢想していたのであろう。 Visual BasicやDelphiのようにドラッグドロップして簡単にイベントハンドラを記述して。。。。
しかし、これは完全に失敗している。Eclipse-ADTに付属のGUIビルダの貧弱さを見れば明らかだ。 というよりもむしろ、こいつは全く使い物にはならない。こんなものを使うよりむしろ手でXMLを記述したほ方がはるかにマシだ。
しかも、このXMLときたら、XMLの規格を厳格に守ろうとするあまりか、こんな調子になってしまうのである。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#00000000" android:gravity="center"> <Button android:text="@+id/Button01" android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content"> </Button> <TextView android:layout_width="wrap_content" android:layout_height="fill_parent" android:textSize="24pt" ....
こんな風に何でもかんでも「android:なんちゃら」と記述しなければならないのである。 これは苦行以外の何物でもない。
また、「プログラミング言語ではないXMLを使うことによって、プログラマ以外の素人でも設定することができる」という意見を持つ者があるが、これも理由にならない。例えば、XMLで記述されたSpringのワイアリング設定を、プログラミングを知らない素人がいじることなど100%ありえないのである。
そもそも、これが真だと仮定しても、そんな素人のためにプログラマがなぜ余計な負担を背負わなければならないのだろうか?
XMLは面倒な上に使い回しが効かない
Androidには基本的に「小さなプログラム」しか乗らない。大人数で手分けして作業を行うというより一人か二人のプログラマがすべてを記述していくというケースの方が多いのではないだろうか?そのようなケースにおいて、JavaとXMLが分断されていればプログラマはそれらを行ったり来たりしなければならない。これも苦行である。
その二つの世界をつなぐものが自動生成されるR.javaとかいう妙なクラスであるが、「これが自動生成されるから便利」なのではなく、そもそもこんなものを使う理由などどこにも無いのである、 もしすべてをJavaで記述できるのであれば(ただし少なくとも基本的なView階層の生成はJavaで可能)。
さらに、このXMLの名前空間は、一つのプロジェクトについて一つしかない。パッケージによっていくらでも名前空間を作成することのできるJava側から参照することのできる名前空間はただ一つなのである。これは退化としか言いようがない。
また、これらXMLその他のリソース付で作成したプロジェクトを他のプロジェクトで流用することはできない。 jar等の形では配布できないので(現時点ではそのように認識している)、ソースをそのままコピーするほかないのだ。
オブジェクト指向の設計原則を無視
Android開発環境のおかしな点というのはXMLやリソースの扱いに限らない。 そのAPIも基本的な設計原則を無視しており、首をひねらざるを得ない点がある。
最大の問題点はActivity(に限らないのであるが)のクラス階層にあると思われる。 つまり、Activityに何でもかんでもつっこみすぎなのだ。
ActivtyはContextでもあり、ListViewであったりもするのだが、これは単一責任の原則に違反していないだろうか?