感覚の話2011/11/19言うまでもないことだけれども,ひとつのプログラムは,たくさんの要素が関わって実行されます。)ライブラリ,それに具体的なソースコードにいたるすべてを指しています。これまた言うまでもないことですけれど,あるプログラムに対して,これら全ての要素が同じ抽象性を持っているわけではありません。一般に,ハードウェアに近い技術ほど,汎用的に適用できるように作られている。することで,システム全体が柔軟に内部構成を変更できるようになるからです。ように異なる開発言語を使うことができます。言語以外の開発言語を定義することもできます(実際にやっている人もいる)。低層にあるレイヤーの抽象度が高いほど,高水準のレイヤーにおいてカスタマイズしやすくなるわけです。これも,よく知られた話。呼ばれていて,コンピュータ開発には欠かせない基本的な発想になっています。知られているけれども,それだけではない,と。このような考え方で,キーになる概念が「インターフェイス」です。インターフェイスというのは,機能と機能,層と層の間で情報をやり取りするための窓口/約束事のことです。ある層を設計するということは,そのインターフェイスを設計することで機能それ自体と層の境界を定義することができる。逆に,インターフェイスを適切に設計することは,機能それ自体や内部ロジックの変更に対してロバストな技術を定義するための必須技術だと言えます。Interface)と呼び,具体的な機能実装を隠蔽する手法をカプセル化と言います。呼び出し側は,公開されたインターフェイスの規約に従いさえしていれば,内部ロジックが変更されてもほとんど全く影響を受けることがなくなります。ロバストなプログラムを書くことができるということです。適切に設計することが,継続的に安定してプログラムを開発/保守するための第一歩ということになります。意識していない印象があります。学校などで研究/実験を主に行っているところも,そうした感覚はあまりないんじゃないかと思う(偏見だけれども)。アプリケーションソフトを作るところは,定義された要件を実装することが第一の目的になるし,研究/実験ではプログラムの保守/再利用よりも研究の実証が第一目的になることから,それはそれでいいのだと思います。基づいて機能レイヤを管理することは,非常に重要な要素になります。いうのも,それは,直接的にはユーザの要望に対して迅速に対応するための発想だし,さらに高度なプログラムを開発するための作業になるからです。ソフトウェアでお金を稼いでいるところは,大事な食い扶持を守るための発想になります。定義することができます。機能のみを抽象化することで,バッファの生成方法や管理方法をカプセル化できます。知っての通り,テンプレートを使うことで,文字要素の型も抽象化できる。何度も繰り返すけれども,このようにソフトウェアの機能を抽象化することで文字列クラスを柔軟に運用できるようになるわけです。通常,継続的に保守することを予定するプログラムは,この層を多く作ることで将来生じうる変更に備えます。std::list)のロジックと,メモリ管理のレイヤーを分けて定義しています。コンテナに対して明らかに低水準のレイヤにあります。同じ名前空間にあるからといって,両者を同じ水準にある機能として理解してはいけない。定義せずに抽象化されている。ライブラリを見ても,バッファ管理とベクトルや行列クラスを明確に分離して異なる層に配置している。普通のプログラマにベクトルを定義してもらう場合,さすがに直接配列を定義して「できた」とかいう人はいないだろうけれども(目的にもよるが),ここまで機能の抽象度を細分化する人もあまりいないんじゃないかと思います。汎用性を元から求めていないのかもしれないけれど,巷のプログラムを読む限り,もう少し抽象度の高い層(低水準の層)を作った方がいいんじゃないかと思うことも少なくない。意識されていないんじゃないかと思っています。知っての通り,層の数を増やすほど,プロトコルを変換するためのオーバーヘッドがかかります。それを意識して抽象度を細分化しないアプローチも十分説得力があります。見ているプログラムや解説の中には,そもそもそういう発想がないんじゃないかと思えるようなものもあります。設計そのものについて専門に扱っている書籍は,ほとんどありません。C++』くらいしか思い当たらない。他には,『プログラミング作法』がかろうじて挙げられるけれども,直接専門的にプログラムの抽象性を扱っているわけではないので,勘の良い人しかその意味するところを理解するのは難しいと思います。この手の書籍が少ないのか。それもこれも,巷のプログラミング本(特に邦書)が,継続的に保守する予定のある比較的大きなプログラムを開発した経験が乏しいか全くない人,あるいは,そのようなプログラムの全体ではなく一部しか設計/実装したことがない人,または自分でプログラムの仕様をほぼ全て決められる立場にいる人によって書かれているからだとも思う。したノウハウは,現状,ソフトハウスの開発現場に蓄積されていることがあるけれども,あまり外には出てきません。C++』)を除くと,実際にソースを読むことくらいしかありません。テンプレートライブラリもある程度きれいに書かれている。おおむね,きれいに書かれたライブラリなりアプリケーションは,低層と上位の層に分かれているはずです(規模が大きいものは,中層も見受けられる)。いうアプローチに対する問題意識は,おもちゃプログラムから(有償/無償を問わず)製品と呼ばれるプログラムを作れるようになるには必要なんだけれども,なぜかノウハウが共有されない不思議。知ってる人は当たり前のようにそのようなアプローチを取るのに対して,知らない人はずっと知らないままでいる。業界全体にそうした意識がないのかとえば,そんなことはないと思うんのだけれども,なぜか明文化されないし,その重要性を強調する人もあまりいない。当たり前のコトすぎて共有されていないのかもしれない。