見出し画像

クラスは「設計図」ではない!初心者向け技術本を一刀両断する。

お久しぶりです、はんちゃんです。仕事が多忙なので、間が開いてしまいました。

さて、掲題の通り、やさしめの初心者向けに書かれた本によく書かれる

【クラスは「設計図」、インスタンスは「設計図を基につくられたもの」】

という初心者がオブジェクト指向で一番躓くわかりづらい表現を一刀両断します。
とーいうわけで、えーごほん。

クラスは「設計図」じゃねえ。むしろ「設計図」はオブジェクトの一つだ。


だったらクラスは一体何なんだと思われるのでお教えします。

クラス設計とは「概念を抽出する」こと。

概念を抽出というイミフな単語が出てきてもとじないでくださいね。ちゃんと、わかりやすく説明します。

例えば、「人を表すクラス(Humanクラス)を作ってください。ただし、他のクラスも自由に作って構わない。」という課題が出たとしましょう。その時、一番初めにするのは「人とは何ぞや」を考えることです。

よく学校の授業で「○○といえば」と質問されたことがあると思います。これを自問自答してください。そうすると、

人は生き物です。
人はしゃべります。
人には手があります。
人は悲しいとき泣きます。

と思いつくでしょう。それが「概念の抽出」です。人には何があるか(→変数として持たせるべきもの)、何ができるか(→メソッドとするべきもの)、何を使うのか(→変数のクラス名、クラス設計)。これこそがオブジェクト指向とは言い切れませんが、少なくとも国が今育成したがってる「プログラマー脳」の一部だと思います。

では、一度作ってみましょう。先ほどの答えをクラスに当てはめると多分こうです。

public class Human extends Creature{
    enum Feeling{
        Cry
    }

    Hand rightHand,leftHand;

    Feeling feeling;
    
    public void talk(){}
    
    public void cry(){
        if(feeing==Feeling.Cry){
            //...
        }
    } 
}

人は生き物を人は生き物の派生形と捉え、Creature(生き物、化け物じゃないです。)クラスを拡張したクラスと捉えます。これがis-a関係。

人には手があるので、Handクラスの変数を持たせます。片手だけではあれなので、右手と左手を用意します。

悲しいは感情の一種なので、Feelingという列挙型(enum)に入れます。
そして、泣くときの条件として、悲しいか判定しています。

悲しいは感情の一種ならクラスじゃないの?泣くときに感情を確認するの?と思った、そこのあなた。賢いです。

ここではわかりやすく列挙型にしてますが、後先のことを考えるとちょっとまずいのです。
そのために、感情をクラスにして、Stateデザインパターンを利用するのが
よいのですが、詳しい説明はここでは割愛。後日、ご説明いたします。

これでなんとなくどうクラスを作ればいいのかわかってきましたでしょうか。初心者本ではよく物の例えが多用されますが、鵜呑みにすると後々尾を引くので信じすぎないようにしてください。

それでは、また。

この記事が気に入ったらサポートをしてみませんか?