![見出し画像](https://assets.st-note.com/production/uploads/images/85436486/rectangle_large_type_2_e6b57e5450390cbbba9d081e62ae2441.jpeg?width=1200)
[#35] Cocoaの印象 : 一貫性に身をゆだねてみよう
初出: MacPower 2003年 6月号
Cocoaと本格的に付き合い始めて数カ月がたった。ここいらで第一印象とは少し違う感触を持ち始めているので、その辺をちょっと書いてみたい。Cocoaの利点としてよく語られるのは、Interface Builderというツールを使ってGUI要素をオブジェクト指向的に扱える、ということだろう。でも、これってあんまり重要じゃないのかな?という気がしている。いや、もちろんすごいことではあるんだけど、それを支えている下地の部分に目が行き始めたのだ。
最初の本格的オブジェクト指向環境である「Smalltalk」がGUIを備えていたことや、MacではHyperCardの登場でオブジェクト指向風の環境が一気に身近になったこともあって、昔からオブジェクト指向=GUI構築という印象がどうしてもあったと思う。また、C++言語が現実のものとなり、各社からアプリケーションフレームワークが次々と登場し始めた'80年後半から'90年代初め、これらのフレームワークのサポート環境としてGUI設計ツールが付属するようになった。このあたりの記憶も、OOP環境とGUI環境の妙な混在と関係しているのかもしれない。しかし、実際にはそれほど関連性はあったのだろうか?実は、オブジェクト指向という考え方とGUIの設計というのは特に相性がいいというわけではないのでは?と思ったりもするのだ。
確かにGUIのパーツをオブジェクトとして扱う考え方は理にかなっている。「ボタンやチェックボックスはどちらもコントロールの一種で、基本的には同じ動作をする」という簡単な説明の中にも、オブジェクト指向の機能隠蔽や継承、多様性などの考え方が潜んでいる。でも、それだけなんじゃないかな、と思い始めたわけだ。そんな簡単な類似性から全体をオブジェクト指向的な考え方で構築できると考えてしまったのではないかと。
しかし、実際にアプリケーションが完成するためには、ほかにいろいろなことが必要だ。というよりも「ほかのいろいろなこと」がアプリケーションのホントの目的であり、UI要素はその付け足しでしかないのだ。必要な部分ではあるけど、本来の目的以上のモノではない。その本来の目的にまでオブジェクト指向で通すことができるのか?ということが重要な部分だと思う。
どんな環境を使ってもオブジェクト指向的にプログラミングを進めることはできるのだが、GUIを扱う部分と本質的なプログラミングの部分には、何か大きな断絶があるように感じる。ボタンとか画面の要素はこういうふうに扱っていました。それはひとまず置いておいて、さてここからはこういうふうに考えましょう…… というように、考え方の転換をしょっちゅう求められる気がするのだ。この考え方の転換が多いと、そこに断絶を感じるのである。Cocoaではほかの環境に見られるこの断絶が非常に少ない。画面のパーツを操作するときと同じ感覚で、本来の目的である機能のプログラミングも進めていくことができる。
理由の1つとしては、Cocoaの足回りを支える FoundationKitの存在が挙げられるだろう。Cocoaは大きく2つの部分からなり、画面まわりの機能を詰め込んだAppKitと、低レベルで一見派手さはないが、プログラミングに必要不可欠なしぶい機能が詰め込まれたFoundationKit に分かれる。GUIを担当するのは前者のAppKitなのだが、FoundationKitはすべての状況で使われる基本的かつ重要なモノである。しかも素晴らしいことに、それらがすべてオブジェクト指向的に扱えるかたちで用意されているのである。もちろんほかの環境でも、同じようなモノは用意されているのだが、その充実度はけっこう低い。
そして、これが最も大事なことだと思うが、Cocoa全体を通してコードにある種の一貫性が感じられるのだ。哲学と言ってもいいかもしれない。メモリーの使い方やデータへのアクセス方法、オブジェクトの操作、ファイルへのアクセスの仕方から、クラスやメソッドの名前の付け方まで、クラスライブラリ全体を通して一貫した考え方に基づいて設計されているのだ。これがほかの環境との一番の違いではないだろうか?
「一貫性なんて、そんなこと当たり前じゃないのか?」と思うかもしれないが、これが意外とできていないものが多いのだ。強いて言えば[*2] 米メトロワークス社の「PowerPlant」の初期のころは、かなり一貫性があったように思うが、時代と共にいろんな考え方が流入してきてしまい、今では複雑で理解しきれないモノになっている。そもそもC++言語自体が非常に変化の激しい言語なので、C++のためのフレームワークはその仕様を取り入れていかなくてはならず、自然と変化せざるを得ないのだろう。
それに対して Objective-Cは言語の変化がほとんど皆無だ。最初に登場して以来、あまり変化していない。もちろん、周りの環境に応じてOSは変わっている。なのでクラスライブラリ自体はNEXTSTEP時代から比べると大きく変わっている。考え方も意外と変わっている、という話は聞いている。しかし、まだCocoaのプログラミングを初めて数カ月のオレが、このCocoaの一貫性には非常に慣れてしまっている。心地よいぐらいなのだ。いったん身を置くと、自然と受け入れられ、理解に苦しむという部分がほとんどないのだ。これは設計の哲学がしっかりしていて、その後の拡張がうまくいっている大きな証拠ではないだろうか?
一貫性があれば、コードからその背景の考え方が見えてくる。ある考え方が理解できれば別の場面で応用でき、全体の理解が加速度的に早くなる。自分が書くコードにもそれが反映される。同じ背景を共有している他人が読んでも、同じように理解してもらえる。これがCocoaがもたらしてくれたいちばん重要なことなのではないかな、と最近思っていたりする。
バスケ(http://www.saryo.org/basuke/) 新しく出た「iTunes 4」はついにCocoaベースに変更になったようだが、動作速度がえらく軽快でうれしい。「Safari」といい iTunes 4といい、今まではなんだったんだ!という気もしてくる。何か裏で変わっているんだろうか?それともようやくアップルが、Mac OS X用のソフトに慣れたきただけなのだろうか?(笑)
[*1] 関連性はあったのだろうか? - 実は単に、アプリケーションの設計がGUI構築ツールなしには不可能になった時期と、C++が実用的になった時期が一致しただけではないかと思ったりもする。
[*2] 強いて言えば - オブジェクト指向環境というとちょっと語弊はあるかもしれないが、QuickTimeの世界はかなり一貫性があると思う。
編集・矢口和則
この記事が気に入ったらサポートをしてみませんか?