インターフェースに関する世界観です。
プログラミングにおいて、インターフェースは重要です。
インターフェースとは、「内部と外部の接続部分」であると言えます。
プログラミングとは、外部のインターフェースに応じた処理を書くことであり、内部の処理をインターフェースを通じて外部から呼び出すことです。
いわば、「プログラミングとはインターフェースである」と言ってもいいかもしれません。
インターフェースであると言えるのは、「関数」と「プログラム呼び出し」だと思います。
それぞれの関数が、関数から呼び出されること、その際に「引数」を与えて「返り値」を返すことで、プログラミングは成り立ちます。
たとえば、その中で、それぞれの関数が状態を保持するために、グローバル変数を使ったり、オブジェクト指向を使ったりはしますが、基本的に「インターフェースに応じてプログラムは記述される」と考えてよいでしょう。
また、プログラムの呼び出しのほかにも、ライブラリやモジュールとしてプログラムが利用される場合もあります。このような場合には、「その水準でAPIを構築し、それよりも上の水準のコンポーネントがそのAPIを使う」といった「レイヤー」も重要になります。
このようなインターフェースにおいて、重要なのは制御モデルです。
イベント駆動やイベントループのように、イベントドリブンな制御モデルを使う場合には、単なるmain()関数のような関数ではなく、さまざまなイベントの「発火」とともに実行されるプログラムを書かなければなりません。
イベント駆動も参照のこと。
オブジェクト指向においても、インターフェースは重要な要素です。
クラスとメソッドの定義が、そのままインターフェースになるからです。
オブジェクト指向においては、プログラムをそのまま素の状態で公開するのではなく、「カプセル化」を行い、なんらかのアクセス手段を事前に用意しておいて、そのアクセス手段のみからデータやプログラムにアクセスするようにします。
また、共通のインターフェースを用意し、それを実装するようにすることで、同じインターフェース仕様から共通の方法でさまざまなクラスへとアクセスすることができます。
詳しくはオブジェクト指向を参照のこと。
クラス設計の基本は、それぞれのクラスとメソッドの「役割」を考え、クラス同士の「関連性」を考えることです。
詳しくはオブジェクト指向モデリングを参照のこと。
僕が思うに、結局プログラミングの根元にあるのは、制御とインターフェースです。
どのような制御モデルの上にプログラムが実行され、どこからどこへと分岐していくのか、その中で分岐するための条件とは何なのか、ということがまず重要です。
そして、このような制御は、内部の制御モデルだけではなく、外部から利用されるインターフェースの世界と関わり合います。
外部のプログラムから別のプログラムの内部処理へと割り込んでくるということ、外部からプログラムの機能を利用するための窓口になるということが、まさに「インターフェース」ということです。
ほとんどすべてのプログラムが、別の基本となるプログラムの機能を利用しています。このような時に正しく実行中の別のプログラムと連携できるということが、インターフェースの持つ大きな意味です。
なので、制御とインターフェースはプログラミングにおいてとても重要であると言えます。
僕が思うに、プログラムを作るということは、インターフェースを作ることだと思います。
ここで言うインターフェースとは、プログラムのインターフェースのこと、すなわちAPIのことです。
はっきり言って、インターフェースに関係のない、内部の仕組みは、どうでもいいものであり、動けばそれでいいのです。
内部の仕組みがきちんと構造化されていることは保守性やメンテナンス性の上では重要ですし、その中に重要な機能が作られるわけですが、それでも、内部の仕組みは内部がどうなっているかという詳細にすぎず、ユーザーやプログラマの同僚にとってみれば「動けばそれでいいもの」にすぎません。
ですが、インターフェースは違います。インターフェースにおいて、意図された通りのこと、記述された目的に沿う結果を、プログラムは返さなければいけません。
つまり、最重要なのはインターフェースであり、「インターフェースの通りに動くこと」です。
そう、プログラムを作るということは、インターフェースに合わせて期待通りの動き方をするシステムを作るということです。
なので、プログラミングを行うということは、インターフェースを作るということです。インターフェースを作って、その通りにプログラムが動くように中身を記述することが、すなわちプログラミングなのです。
ただし、これは一般的なソフトウェア開発ではすぐには分からないところです。Webブラウザを作るならばリンクをクリックしてHTMLを表示するブラウザ部分を作りたくなりますし、お絵描きソフトを作るならばペイントツールで絵を描く部分が作りたくなります。ですが、それはむしろAPIではなくユーザーインターフェース(UI)を作っているというだけの話であり、話の本質としては同じです。UIを作るのであっても、APIと同じように、内部の仕組みはどうでもよくて、UIがきちんと操作に反応することが重要です。
あるいは、ハードウェアであっても同じです。この場合のインターフェースは、機器と機器を接続する機械的なインターフェースです。その機器や部品がどのように動いているのか、ということは利用者にとってはどうでもいいことであり、インターフェースに接続した時点で部品やデバイスとしての機能を果たしてくれることが重要です。
そのように考えることで、オブジェクト指向の唱える「隠蔽」や「カプセル化」の意味がよく分かります。内部の仕組みは、利用者からしてみれば勝手に目的の通り動いてくれればどうでもいいのです。必要なのは、インターフェースに対してきちんと動いてくれること、それだけなのです。
2023.05.28
状態を参照のこと。
システムレイヤーを参照のこと。