クラスとは変数をまとめて使う事のできるテンプレート

クラスってなにか、というのは教える相手によって結構表現が違うわけで、いきなりオブジェクト指向が…とか騒ぎ出す人はどうかと思う。

で、「なかなか覚えられないPHPのclassについて考えてみた」というエントリーから。

空いている時間にPHPの学習をはじめてずいぶん経つのですが、「クラス」の概念がなかなか理解できませんでした。
どう書けばどう動くまでは把握しているのですが、「なぜこんな風に書くのか」がつかめない。

http://blog.webbingstudio.com/2009/09/php_class.html

どうなんでしょうね?
個人的にはCMSを使うという範囲ではクラスという概念は覚える必要がないような気もします。たぶん、ほとんど使わないし、使うとしても既存のクラスのインスタンスを操作するケースかと思うので。
とはいえ、どうしてクラスがあるのかを理解することは重要かと思います。これは順を追って理解するとそれほど難しくないです。

変数

スタート地点は「変数」です。
変数はプログラムを学ぶ上では基礎事項の1つです。一言で言えば、「値に名前を付けておく」機能ですね。

なんで、変数が必要かと言えば、変数がなかったらメモが出来ないのと同じと言うことだからです。TODOにしろなんにしろ、書いてとりあえず置いておくことで、後から利用することができます。また、変数に記憶させておけば、何度も使用する事ができるわけです。
漠然と理解するのではなく、このメリットを抑えることが重要。

配列、リスト、シーケンス

どんなプログラミング言語でも、大抵は配列(リスト、シーケンス)が用意されています。
配列は幾つかの変数をまとめて扱うための機能です。商品の一覧にせよなんにせよ、同じような値をまとめて幾つか扱う事は多いため、使用頻度も高くなります。
配列は、順序を持ったデータの集まりである、ということがポイントです。

連想配列、マップ、辞書

最近のプログラミング言語であれば、連想配列(マップ、辞書)も用意されています。
連想配列は配列と同じようにデータの集まりを扱う機能ですが、「キーと値」がペアになっていることがポイントです。0番目、1番目というのではなく、Aに対応するのはこの値で、Bに対応するのはこの値といったように1:1のペア*1で扱うと便利な場合は、連想配列を使います。
例えばユーザIDとユーザ名の対応とかですね。

データをまとめたい

これまで説明した配列と連想配列は、あくまで単一の値に対しての集合を扱う事と考えてきました。Excelで考えれば1列で幾つかの行にデータが入っているようなイメージです。キーから値をとるにせよ、x番目という順序でデータを取るにせよ、1つの値が入っているわけです。
ですが、実際にプログラムを組んでいくと、ある程度のデータはまとめて扱いたいとなります。例えば、あるユーザに対して「ユーザ名、メールアドレス、性別、住所、年齢」などは1セットとして扱う方が便利です。また、商品も「商品名、値段、産地、メーカー名」などが1セットである方がまとめて扱うには便利です。

クラスの概念

というわけで、クラスの登場です。クラスを使う場面としては、関連するデータをまとめて1つの値として扱いたい場合です。したがって、あるクラスには幾つかの変数が含まれ、通常の変数と区別して呼ぶため、メンバ変数とかアトリビュートとか呼び分けています。
クラスはそのようなデータの集まりの設計図です。なので、クラス名とメンバ変数の定義という書式が多く使われています。

クラスは再利用できる

クラスはある一定のデータをまとめて扱う設計図であるため、同種のデータのテンプレートとして機能します。商品やユーザデータは、原則として同じ項目を持ち、各商品各ユーザで違う値を持つでしょう。このようにクラス(テンプレート)から作成した値がインスタンスです。

クラスの機能

ここまで理解できればクラスを使う上ではあまり困らないと思います。
ですが、クラスはこのようなデータ構造として使われるというのは厳密には正しくなく、クラスの用途の1つです。また、クラスには機能(関数、メソッド)を持たせることも出来、メンバ関数(メソッド)などと呼ばれます。さらに似たようなクラスのデータを1カ所にまとめる機能など様々な機能がありますが、これはCakePHPなどフレームワークを使ったプログラムを行わない限り不要かもしれません。

まとめ

クラスとは変数をまとめて使う事のできるテンプレートです。
尚、もう少しプログラムを知りたいならば、この本がおすすめです。

ここで説明した内容は、主に具体的にイメージが沸く内容、つまり抽象的な概念には触れていません。プログラミングを理解していくには、次のステップとして抽象化が重要なのですが、うまくパターン化して抽象化のプロセスを学ぶことができますのでオススメ。

でも、昨日の晩ふと「夕飯のメニュー」に例えて考えてみたら、ちょっと理解できたかもです。

おなかが空いていたんだと思います。

*1:多対1などの場合もある