[GAS][DDD]1章オブジェクト指向とはなにか 2.オブジェクトとはなにか

GAS

どうも。つじけ(tsujikenzo)です。このシリーズでは「Google Apps Scriptとドメイン駆動設計」についてお届けしています。

第1章は、「オブジェクト指向とはなにか」 を全3回でお送りします。

前回のおさらい

前回は、「はじめに」で、このシリーズのゴールである、なぜドメイン駆動設計を学ぶのかをお届けしました。

ドメイン駆動設計は、「オブジェクト指向」というプログラミング手法と、切っても切れない関係になっています。

[GAS][DDD]1章オブジェクト指向とはなにか 1.はじめに
どうも。つじけ(tsujikenzo)です。このシリーズでは「Google Apps Scriptとドメイン駆動設計」についてお届けします。全部で何章のシリーズになるかわかりません。少しずつ更新します。第1章は、「オブジェ...

今回は、「オブジェクトとはなにか」 をお届けします。

今日のアジェンダ

  • 実世界を表現しよう
  • オブジェクトとはなにか
  • クラスとはなにか

実世界を表現しよう

前回、パソコンは真空管と紙テープを使って、プログラミングをしていた、というお話をしました。

その頃、何の処理をしたかったのか、というお話ですが、当時のさまざまな数値に関する処理を、楽に高速に行いたかったのだと思います。

天候の予測だったり、医療の発展だったり、軍事利用だったり、さまざまでしょう。

そんな中で、特に人々からの投資を集めて、発展したのが、ビジネスソフトウェアです。

プログラミングの目的は、働くことを楽にしたいです。

データベースの発展

同様に、ビジネスの現場で発展してきたのが、データベースです。

パソコンを使って、データベースを構築したり、運用したりできないか、という研究は1960年代から盛んに行われていました。

世界初のデータベースを操作するソフトウェアは、民間企業のGeneral Electric社が開発しました。

現実世界のデータを、データベースとして構築、運用しよう、というソフトウェアです。

ここで対象となったデータとは、ビジネスでいえば、社員、顧客、販売、会計などのデータです。

中でも、1970年にアメリカのコッド博士が発表したリレーショナルデータモデルは、1980年代になるとリレーショナルデータベースとして、広く浸透しました。

このように、「実世界をパソコン内で表現しよう」という試みは、オフィスソフト(Microsoft Officeや、最近ではGoogle Workspace)と、リレーショナルデータベース、両方で発展してきました。

オブジェクトとはなにか

オフィスソフトは、ビジネスで扱うモノやことを、「オブジェクト」という単位で表現しました。

文書や表、メールやカレンダーなど、ビジネスでつかうモノは、すべてオブジェクトになります。

ガソリンや軽油は、ただの液体ですが、「社用車の燃料」と考えるとオブジェクトになります。

形のあるものだけでなく、「残有給日数」や「備品購入申請」などもオブジェクトになります。

オフィスソフトでは手が届かない

ビジネスのモノやことをオブジェクトにできたおかげで、さまざまな業務を楽にできるようになりました。

多くの人がやるであろう「メールを送信する」とか「税込み価格を表示する」という機能を、オフィスソフトは提供しています。

しかし、現実世界はとても複雑です。

たとえば、「従業員リスト全員に給与明細を送付する」とか、「顧客ごとに今月のオススメ商品PDFを作成する」といった、複雑な処理をするボタンや画面は提供できません。

近年は、複雑な処理を自動化/効率化するために SaaS (特定の業務に特化したサービスをネット上で提供するソフトウェア)が流行していますが、まだまだほんの一部です。

やはり、業務を行うわたしたち自身が、オブジェクトを操作したほうが、細かい要求にも応えられますし、効率も良さそうです

ソフトウェアにおけるオブジェクト

では、ソフトウェアで操作する「オブジェクト」を定義していきます。

オブジェクト

オブジェクトは、実世界のものごとを表すデータとロジックの集まりです。

データは、データを操作するロジックと一緒にグループ化されて、ソフトウェアの単位を作ります。

データはロジックから切り離すことができません。その逆も然りです。(しかしながら、手続き型プログラミングで書くと、データとロジックが切り離されて書かれてしまうことが多いです。)

メソッドとメッセージ

メソッドとは、オブジェクトによって実行される仕事 です。

メッセージは、オブジェクトへ送信される、そのオブジェクトの仕事の結果を要求する合図です。

たとえば、サバの缶詰を製造するとします。

工場というオブジェクトには、サバの原料(データ)と缶詰マシーンや従業員(メソッド)が格納されています。

発注PCというオブジェクトから工場に送られる発注は、メッセージです。また、回答もメッセージです。 

ここで大切なことは、メッセージを送信したPCは、工場でどんな処理が行われているか、見えない(隠蔽) ということです。

これは、オブジェクト指向で大切な「Tell, Don’t Ask」というキーワードにも示されています。

メッセージは、やりたいことを伝えるだけにしましょう。どういうデータが欲しいですか?と工場に聞くな。ということです。

振舞い

そして、オブジェクトが提供する仕事の結果を、振舞いといいます。

メッセージは振舞いを要求し、メソッドはそれを実行します

給与計算をするソフトウェアを開発するときは、従業員オブジェクトを操作します。

従業員オブジェクトは、以下のようなメソッドをもっているでしょう。

  • 従業員IDを照合する
  • 社会保険番号を取得する
  • 名前を取得する
  • 住所を取得する
  • 給与を計算する

「従業員ID-005番さんの名前と住所と給与を教えて(振舞い)ほしい」というメッセージに対して、メソッドは、具体的な振舞いを実行するロジックです。

クラスとはなにか

クラスとはなにか?という問いの答えは、文脈、状況によって異なります。

今回は、Google Apps Scriptとドメイン駆動設計を学ぶ上で、クラスとはなにか、をかんたんに整理してみたいと思います。

GASでは、クラスを定義するときに、クラス構文が提供されています。

中身が空のクラスを定義してみましょう。

//クラスPersonを定義する
class Person{}

クラスがなんのためにあるかというと、処理をまとめることで整理しやすいからです。

Personクラスに、人物に関する振舞いをもたせてみましょう。

class Person{
  cunstructor(name,age){
    this.name = name;
    this.age = age;
  }

  getIntroduce(){
    return `私の名前は${this.name}です`;
  }

  isAdult(){
    return this.age >= 18;
  }

}

使い方はこのようになります。

const p1 = new Person('Tom',19);
console.log(p1.getIntroduce()); //わたしの名前はTomです
console.log(p1.isAdult()); //true

このように、p1という変数に、TomさんというPersonオブジェクトを格納して、今後の処理を続けていきます。

Bobさんが現実世界にいるなら、Bobさんのオブジェクトを変数p2に格納します。

const p2 = new Person('Bob',17);
console.log(p2.getIntroduce()); //わたしの名前はBobです
console.log(p2.isAdult()); //false

わたしたちのような、ノンプログラマーが手続き型プログラミングで書いていたコードは、データとロジックが別々でした。

たとえば、ほとんどのばあい、Personのデータは2次元配列で保持しています。

条件分岐なども含め、このようなコードを書いていくでしょう。

const persons = [['name','age','favarite'],['Tom',19,'Coffee'],['Bob',17,'Guitar']];

persons.shift();
for (const person of persons){
  if(person[1] >= 18){
   console.log(`わたしは${person[0]}です。成人です`);
  }else{
    console.log(`わたしは${person[0]}です。未成年です`);
  }
}

}

これが、オブジェクト指向と、手続き型プログラミングの違いです。

まとめ

以上で、「オブジェクトとはなにか」をお届けしました。

現実世界のモノ・ことをオブジェクトとして扱い、そのままクラスで表現することで、プログラミングを楽にしよう、というお話でした。

次回は、 「クラスと継承」 をお届けします。

参考資料

このシリーズの目次

Google Apps Scriptとドメイン駆動設計

タイトルとURLをコピーしました