俺による俺のためのオブジェクト指向講座。その2

というわけで第二回。
オブジェクト指向な設計の考え方について。

プログラム上の「モノ」とは

「オブジェクト=何かしらのモノ」ということを前回は書いた。
まぁ現実世界ではモノといえばデスクの上に置いてあるフィギュアとかフィギュアとかフィギュアとかがある。
前回はお茶を例にとった。

ではプログラム上の「モノ」とは何か。

結論から言えば「データの塊」。
ある(一連の)データと、それに対してどのような操作ができるかを考えると、それがひとつのクラスになる。

例えば、良くあるショッピングサイトを考えてみる。
会員登録をして、商品を選んで、決済方法を選んで・・・という流れの中に存在するデータは、

・会員情報(アカウント、パスワード、名前、住所)
・商品情報(商品名、値段、説明)
・決済方法(名前、カード番号などの必要な情報名)
・購入履歴(商品名、購入者、支払状況、発送状況)

ざっとこれくらいはある。

この1行を1クラスとして設計してみると、

クラス名:User
プロパティ:
    int id
    String account
    String password
    String name
    String address
メソッド:
    boolean login(String account, String password)
    void logout()
クラス名:Item
プロパティ:
    int id
    String name
    int price
    String desciption
メソッド:
    int getPrice()
    String getDesc()
クラス名:Settle
プロパティ:
    int id
    String name
    String cardnumber
メソッド:
    boolean validate(String cardnumber)
クラス名:Log
プロパティ:
    int id
    int itemId
    int userId
    boolean isPayed
    boolean isSent
メソッド:
    void pay()
    void send()

という風に4クラス作ることができる。

前回の繰り返しになるが、オブジェクトとは「個々のモノ」、クラスとは「同種のモノ全般の特徴」を表している。

データをどう分ける?

データを分類してクラスにまとめれば、それらのデータに対してどのような操作ができるか、どのような操作が必要かを考えるのは容易になる。

結局のところクラスを作るときの要はデータの分割。
これに正解はないし好みや感性の問題もあるんだけど、念頭に置いておいて欲しいのは「できるだけ小さく」すること。
つまり、ひとつのクラスが持つデータの種類を減らしていく方向で設計するということ。
一説によれば「プロパティは5個まで。それ以上増えたら別のクラスに分割する」というやり方をしてる人もいるということ。
まぁ私はそこまで徹底的にはしてないけど小さくするやりかたはお勧めする。

・修正時の影響範囲が少ない
・汎用性が高まる

のが主なメリット。デメリットはファイル数が増える(Perlは原則1クラス1ファイル)ことくらいか。

クラスの分割の仕方は「継承」「委譲」「包含」なんかのバリエーションがあるので、基本的なOOPの解説が終わったあたりでまた。


で、実際にデータを分類するときには、処理する上で深い関連(片方が変化すれば必ずもう片方も変化するなど)を持つデータ同士のグループを作ったり、現実世界で同一のモノが持つデータをまとめたり。
別に実在するモノじゃなくてもいいんだから、「このプログラムにはこんな物体が存在するべきだ」と自分で思ったものをクラスにすればいい。

BBSなら「レス」も「スレ」もオブジェクトだし、リンク集なら「各サイト」や「それぞれのアクセス数」をオブジェクトにできる。
全体の機能を個々に分解してパーツ化することがOOPの大事な考え方だ。

というわけで

今回はこんなところ。
次はPerlでの実装例を。