どうも。つじけ(tsujikenzo)です。このシリーズでは「Google Apps Scriptとドメイン駆動設計」についてお届けしています。
第1章は、「オブジェクト指向とはなにか」 を全3回でお送りします。
前回のおさらい
前回は、「はじめに」で、このシリーズのゴールである、なぜドメイン駆動設計を学ぶのかをお届けしました。
ドメイン駆動設計は、「オブジェクト指向」というプログラミング手法と、切っても切れない関係になっています。
今回は、「オブジェクトとはなにか」 をお届けします。
今日のアジェンダ
- 実世界を表現しよう
- オブジェクトとはなにか
- クラスとはなにか
実世界を表現しよう
前回、パソコンは真空管と紙テープを使って、プログラミングをしていた、というお話をしました。
その頃、何の処理をしたかったのか、というお話ですが、当時のさまざまな数値に関する処理を、楽に高速に行いたかったのだと思います。
天候の予測だったり、医療の発展だったり、軍事利用だったり、さまざまでしょう。
そんな中で、特に人々からの投資を集めて、発展したのが、ビジネスソフトウェアです。
プログラミングの目的は、働くことを楽にしたいです。
データベースの発展
同様に、ビジネスの現場で発展してきたのが、データベースです。
パソコンを使って、データベースを構築したり、運用したりできないか、という研究は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とドメイン駆動設計