【Rails】プログラミング初心者の勉強ブログ #53
プログラミングスクールDIC第4回授業レポート。授業内容や様子など。DIC代表の野呂さん直々に、丸々2時間「オブジェクト指向」について教わりました。学んだオブジェクト指向や設計方法などを書き留めます。
目次
目次
前回までの授業内容
第3回授業レポート
第3回授業レポート。Rubyで二分探索法アルゴリズムを考えた回です。コーディングからフローチャートを作成し、グループワークで理解を深めました。
第2回授業レポート
第2回の授業レポート。事前課題で提出したJavaScriptでコーディングした「成績判定プログラム」のフローチャート作成が抗議内容のメインです。
課題で作成した成績判定アルゴリズムを噛み砕き、個人ワークでフローチャートを作成した後、グループワークで共有・発表といった流れです。
第1回授業レポート
初回授業レポート。こちらも事前課題に沿ってHTML/CSSのアウトプット。
プログラミングスクール「DIVE INTO CODE」の授業の雰囲気なども書いてます。
4回目授業はオブジェクト指向についての講義
今回は「オブジェクト指向」についての講義でした。講師はDIC代表の野呂さん。今までの授業と違い、事前に提出を求められる課題に基づいた授業ではなく、2時間まるまる「オブジェクト指向」とは何ぞかを教えていただきました。
参加人数は18人。当初20後半は人がいましたが、授業の出席率は前回の3回目あたりから、このくらいの人数となっており、また、毎回来る人は固定メンバー化しつつあります。全10回(卒業発表会を含めると11回)ある授業のうち、卒業条件が「6回」なので、そこをボーターとしたペースで受講されている方もいらっしゃる気がします。
以下、授業内容の備忘録となります。
オブジェクト指向とは
オブジェクト指向を一言で言うならば、「コンピュータが作り出すプログラムを”モノ”として捉える考え方」である。何よりもまず、オブジェクト指向は「考え方」であることを意識する必要がある。オブジェクト指向そのものがまず、「目に見えない抽象的なもの」なんだなと意識した上で、理解していくことに努める。
「モノ」として捉えるとはどういうことか。キーワードは「設計」「作成」「使用」の3つである。
モノは「設計」をもとに「作成」し「使用」される。家も車もスマホも、YouTubeの動画も。なんならこのブログ記事も。「モノ」というものは全て、「設計」をもとに「作成」し「使用」される。オブジェクト指向とは、コンピュータが作るプログラムにおいてもこの
「設計」をもとに「作成」し「使用」される。
という「モノ」の考え方を取り入れてますよ、という話である。ただプログラム(Ruby)では「設計」とか「作成」という言葉を用いず、「クラス」「メソッド」「インスタンス」というカタカナが使われているから、なんだかよくわからないよ、ってなってしまう。
一般的に言われている「家の例」が、やっぱりわかりやすい。
@house = House.new
設計図=クラス(House)・・・「設計」する
大工さん=メソッド(.new)・・・「作成」する
完成した家=インスタンス(@house)・・・「使用」される
設計図(House)で「設計」し、大工さん(.new)が「作成」し、完成した家(@house)は「使用」することができる。
オブジェクト指向の特徴
オブジェクト指向の最大の特徴は3つに分けられる。「カプセル化」「継承」「ポリモーフィズム」とそれぞれ呼ばれる。
カプセル化
カプセル化とは、「モノ」の持つ状態の変化の因果関係を隠蔽し、固定することだ。「モノ」の状態は変化する。家だったら時間の経過とともにボロくなるし、逆にリフォームでキレイになる。逆に言えば時の経過とともにキレイになる家は無く、リフォームで劣化するということも基本的にありえない。(レトロなリフォームとかの例外はあるかもしれないが。)現実世界では心配しなくてもこのような意味わからない因果関係が発生することはないが、プログラムにおいてもこのような事態はあってはならない。つまり、外部からの力で、プログラムに設定した「因果関係」を簡単に変更されてる状態ではよろしくないということだ。そのため、「モノ」に対して設定した因果関係を隠蔽(カプセル化)し、設定したプログラムの状態変化とその結果を、あるべき状態に固定する。「attr_accessor」というRubyのメソッドがあるが、これはカプセル化されている内部に対して読み込みと書き換えが可能になるメソッドである。今までしっくりきてなかったが、カプセル化を改めて学び意味が理解できた。
継承
継承とは、すでにある「モノ(クラス)」を応用し、別の「モノ」を生み出せるという特徴である。別の言い方をすると、一回生成した「モノ」は、継承させることで使い回しが効くということ。オブジェクト思考において、モノには「できること」と「属性」という2つの要素がある。サッカー選手の例がわかりやすい。ウイイレの選手を想像する。ウイイレのサッカー選手を「モノ」としてプログラムを作成するとき、「できること」は、選手の「基本行動」が当てはまる。具体的には、
- 走る
- パスする
- ドリブルする
- シュートする
のような動詞ある。これらはプログラムを作成するにあたり、全ての選手に該当するものである。一方で、サッカー選手一人一人のステータスに該当するものが「属性」である。具体的には、
- スピード
- シュート力
- フィジカル
- スタミナ
などの能力を指す。選手一人一人で「違い」があるものを「属性」と呼ぶ。
サッカー選手プログラムにおいて「基本行動」を、「サッカー選手」という「モノ」としてあらかじめ用意しておけば、各選手に使い回せるよ、というのか継承である。別々の能力を持った選手一人一人は、あらかじめ生成した「サッカー選手」というモノを継承させ、「ホンダ」とか「ナガトモ」というモノを作っていくべきであり、その方が効率がいいよねという話。
最終的に、
モノ = クラス名
できること = メソッド
属性 = 初期値(initializeメソッド内に定義)
となる。この考え方は、後述するクラス設計においても利用される。
Gem deviseのコントローラーを使用したとき、各メソッド(アクション)内に「super」とたくさん書いてあって意味がわからなかったが、あれは親クラスのメソッドをそのまま継承させているだけだった。
ポリモーフィズム
ポリモーフィズムとは、「モノ」によって同じ「メソッド名」でも中身を違うものとして定義できること。「モノ」が主語として機能することにより、同じ動詞でも意味を変えることができる。例えば、Aさんが寿司、Bさんがラーメンを食べたとする。二人とも「食べる」をしたことになるが、食べたものの違えば、食べるスピードも、もしかしたら時間帯も異なるかもしれない。だからと言ってAさんの「食べる」を「食べるA」に、Bさんの「食べる」を「食べるB」とかいうような別々の名前をつけるのも効率が悪い。ポリモーフィズムという特徴は、わざわざ名前を変えなくても、「モノ」が違えば動作(メソッド)も根本的に異なるという性質である。
オブジェクト指向設計
実際のコーディングは「清書」のようなもの。清書作業はクラス設計工程の8分の1程度の時間で行うのが理想である。それくらい「設計」作業が大事だということ。コーディングで迷いながら書いてるようではいけない。現段階ではだいぶ無理くさい話。
クラス設計
クラス設計とは、プログラムであらかじめ必要になるであろうクラスを洗い出し、それぞれのクラス同士の関係性をまとめていく作業である。また、継承の観点から、「できること」と「属性」を決めていく作業も必要。具体的には、まず「システムの仕様」を文章として書く。完成した文章から名詞を抜き出す。この抜き出した名詞が「クラス」候補となる。クラスが決定したら、そのクラス毎の関係性(アソシエーションなど)を明確にしていき、クラスそれぞれの「できること」と「属性」を定義していく。
流れをまとめると、
- プログラム内容を文章に起こす
- 文章の中から、登場する「名詞」をピックアップする
- 登場した名詞から「クラス」を決める
- クラス同士のアソシエーションを明確にしていく
- クラスごとに「できること」と「属性」を洗い出す
となる。是非今後のアプリ開発に活かしたいと思う 。
まとめ
今回の授業は新しい知識のインプットが多く、あまり理解できてなかったオブジェクト指向について、わかるところが少しずつですが増えてきたかなという感想です。
以上ありがとうございました。