見出し画像

オブジェクト指向とはデータの自立のことである

続いての ”聞いたことはあるけど、どういうことなのか分からない” はオブジェクト指向プログラミング。略してOOPだ。

オブジェクト指向という考え方はとても幅広く、極めようとすれば沼にはまっていくように、深く、暗く、引き返せない世界なので、これまでわたしが現場で教えていただいたオブジェクト指向だというのをですね、触りの部分だけでも伝えできればと思います。

オブジェクト指向とは自分でできることは自分でする。ということです。

いや、そんな頭上に?マークを付けたような顔をしないでください。

そもそもオブジェクトって何?

まずはそもそもオブジェクトって何のことでしょう。
オブジェクトつまり物、存在する何かです。プログラム上のオブジェクトは物を表現するデータの塊のことをいいます。
この時のデータを属性情報と言い換えるなら、オブジェクトとは物を表現する属性情報の塊といえます。

ここで「いまさら聞けないMVCの話」をご覧になった方でピンと来た人もいるかもしれませんが、MVCのM、つまりModelもオブジェクトに当たります。
Modelの中の変数の定義が属性情報となるのです。

例えば、人というオブジェクトを表現するとしましょう。
人には名前、姓と名があります。生年月日や性別もあります。住所、電話番号、学歴、身長体重、などなど個人情報といわれる属性情報があります。これらの属性情報をひっくるめて、ひとまとめにしたものが人オブジェクトです。

自分でできることは自分でするってどういうこと?

オブジェクトのことが分かったとして進めます。次にオブジェクト指向とは自分でできることは自分でする。と先に書きましたが、自分でできることは自分でするって何?という疑問が湧いてくるかもしれません。

ここからはプログラムの簡単なソースを書きながら説明しましょう。

人オブジェクトがあるとします。特に何かの言語に寄せていません。(Javaっぽいけど。)必要なところだけ書き出しています。

// 人オブジェクト
person
{ // 分かりやすいようにすべてアクセス可能と考えてください。
    String sei;    // 姓
    String mei;    // 名
    int gender;    // 性別
    date birthday; // 誕生日
}

と人オブジェクトがあるとします。
そこで姓と名の間にスペースを入れたデータを取得しようとします。

・オブジェクト指向でない場合

main
{
    String name = person.sei + " " + mei.person;
}
// 人オブジェクト
person
{
    String sei;    // 姓
    String mei;    // 名
    int gender;    // 性別
    date birthday; // 誕生日
}

・オブジェクト指向の場合

main
{
    String name = person.getName();
}
// 人オブジェクト
person
{
    String sei;    // 姓
    String mei;    // 名
    int gender;    // 性別
    date birthday; // 誕生日

    // 名前を取得する
    getName()
    {
        return sei + " " + mai;
    }
}

違いが分るでしょうか。「sei + " " + mei」の部分がmainの中にあるか、personの中にあるかの違いです。つまり”自分でできるようにする”とは自分の持っている属性情報で導けるデータは自分側で作り出す。ということです。

何でこれがいいの?

式の位置がオブジェクトの中に置くのと外に置く違いだけですが、何故オブジェクトの中に置いた方がいいのでしょう。

上の例を作った後で、やっぱりname のスペースは半角から全角にしてくださいと依頼があったとします。(sei + " " + mei ⇒ sei + " " + mei)
上の例では name を取得するのは一か所ですが、複数個所で name をオブジェクトの外で作っていると、その全てを検索して手を加えなければなりませし、テスト範囲もその分広くなります。

ですがオブジェクトの中で作っていれば、オブジェクトの中の式だけ修正し、テストも基本的にオブジェクトの中の修正した部分だけです。

上の例では分かりづらいのですが、規模の大きなプログラムになると、オブジェクトはあちらこちらで呼び出され、ちょっとした改修の影響が大きくなります。
まとめられるところはまとめておくことは、ソースの可読性の向上となり、ひいては保守性、拡張性が格段に上がります。

塊で扱うことの有用性

続いてデータを塊として扱うことがいかに便利であるかについて、経験したお話をしましょう。

人情報を使って処理をする関数(syori_person)があるとします。
そのとき、syori_person関数が受け取るデータはすべてばらばらでした。

main
{
    syori.syori_person(sei, mei, gender);
}
syori
{
    syori_person(sei, mei, gender)
    {
        …
    }
}

問題は改修の要望でこのsyori_person関数に必要なデータが増えていった時です。
データが増えていくということは、関数を呼び出す側で渡すデータも増えていくということです。複数個所から呼び出しがあればそれぞれ改修となり、工数はそのぶん膨れ上がります。
かつて受け取るデータが10個以上ある関数を見た時にはめまいがしました。

main
{
    syori.syori_person(sei, mei, gender, birthday, …); ⇐ こっちも変わる
}
syori
{
    syori_person(sei, mei, gender, birthday, …) ⇐ ここを変更すると
    {
        …
    }
}

ではオブジェクト化した場合のソースを見てみましょう。

main
{
    syori.syori_person(person); ⇐ 変わらない
}
syori
{
    syori_person(person) ⇐ 変わらない
    {
        …
    }
}
person
{
    String sei;    // 姓
    String mei;    // 名
    int gender;    // 性別
    date birthday; // 誕生日 ⇐ ここをどんどん追加する
}

処理に必要な情報はオブジェクトの属性情報を追加して、処理の中で呼び出せばいいのです。どんなに属性情報が追加されたとしても、受け取るデータはオブジェクト一つです。呼び出す方も変更する必要はありません。

ということで、データはオブジェクトで受け渡ししましょうね。ということと、オブジェクトの中で作れる値はオブジェクトの中で作りましょうね。というお話でした。

プログラム開発者にとって幸いとなりますように。

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