今回のテーマはオブジェクト指向とはについてということで、初心者向けにオブジェクト指向とはなんぞやについて死ぬほどわかりやすく解説していきます。
※今回の記事は完全初心者向けなので高校生でもわかるような用語や例えを使っています
●動画でも説明していますので動画派の方はこちらを観てください
まずなぜオブジェクト指向を取り上げたかなんですが、ずばり一番ここでつまずくプログラミング学習者が多いから。
なぜつまづくかと結果からいえば、オブジェクト指向は決まったルールではなくて概念や考え方といった抽象的なものでわかりづらいからです。
実際に業務で携わってる若いプログラマの中にはなんとなくわかったつもりの人もいますし、ぼく自身も新卒で働き始めて約1年はちゃんと理解できていませんでした。
でも理解していないことは開発の現場ではすごい大きな足かせになりました。
簡単なプログラムの作成や修正くらいなら大丈夫ですが、設計や機能追加を任せられたりしたら、オブジェクト指向をちゃんと理解していないと太刀打ちできませんからね。
それを見かねてか、そのときのプロジェクトリーダーがホワイトボードを使って図にして教えてくれました。
自分的にはそれがすごいわかりやすかったので、ちゃんと意味を飲み込めて、その後の仕事の理解力も深まりました。
なので今回もそのときと同じように、なるべく図やイラストを使って説明していきたいと思います。
これを見ればオブジェクト指向の考え方をマスターできるますので、見終わったあとはオブジェクト指向をわからない人に説明できたり、自分がやってる業務のコードを見て今まで以上に深く理解することができます。
なのでオブジェクト指向の初期段階の理解についてはこれさえ見れば大丈夫な作りにしています。
またオブジェクト指向が理解できると業務がどう変わるかについても途中で説明していますので最後までお見逃しなく。
オブジェクト指向が誕生したキッカケ
まずオブジェクト指向が誕生したキッカケについてお話します。
オブジェクト指向プログラミングという考え方が生まれた背景には、時代とともにコンピュータの性能が向上し、大規模なシステム開発が行われるようになってきたことで、いろいろな問題がでてきたことにあります。
大規模になってくるとやはりソースコードの量自体も膨大になってきました。
そうすると起こってくのがプログラムの複雑化とバグです。
では具体的にオブジェクト指向が生まれる以前はどういったことが問題になったか見てみましょう。
・プログラムを追加したら他のプログラムにも影響してバグが出た
・少しの機能を変更するだけなのに修正する箇所が多い
・冗長なコードなので読みづらく、新しくアサインしたメンバーが解読できない
このように基本的には開発規模が大きくなるにしたがって、内部のプログラムが複雑になり、プログラムを追加をしたり、修正を行ったりすることがより難しくなってきます。
なのでオブジェクト指向以前では大規模なシステムを作ることはとても難しかったのです。
そういった中、80年代に入って「このままではソフトウエアの需要に対して供給が圧倒的に不足する」と叫ばれました。
どういったことかというと、以前の作り方だと、プログラムを修正・追加するたびに、テストする時間が膨大になって開発時間も大幅に伸びました。
そうすると完成するのに膨大な時間がかかるので、物理的に世の中の需要に供給が間に合わなかったということですね。
これはいわゆる『ソフトウエア危機』と言われるものです。
この危機を解消するためには今までの作り方をやめ,考えを一新する必要がありました。
その中で考えられたのがプログラムの独立性、再利用性、拡張性の3つを追求するということです。
その3つの性質を兼ね備えているのがオブジェクト指向なんです。この3つの性質については後ほど説明します。
こういいた理由からオブジェクト指向はシステム開発の複雑化を解消するために作られた概念といわれるゆえんです。
そしてこのオブジェクト指向の考えは予想以上に機能して、こんにちに至るまで普及しているということです。
オブジェクト指向はなぜ理解しづらいのか
ではなぜ理解しづらいかといえば、さきほども説明した通り、オブジェクト指向は決まったルールではなく、概念つまり考え方だからです。
例えば、実生活の中で愛はなにかとか生命体とはなにかといった概念を説明しろと言われれば難しいですよね。
でも頭の中ではなんとなくこういったものだというイメージはできますよね。例えば、愛とはなんとなく強く引きつけられる気持ちかな、なんとなく守ってあげたい気持ちかなと想像できます。
このなんとなく思いつくものが概念であり、オブジェクト指向もこのような概念であって、決まったルールごとではないので難しく感じるんですね。
ということはですね、オブジェクト指向の考え方は人によって違う場合もあるわけです。
なのでこのページと違う説明をしてる技術書もあると思います。だけど大幅に概念からはみ出さない限り、完璧な正解もないんですね。だいたいこういったものかとイメージできれば大丈夫です。
もしこのオブジェクト指向の概念を正しく理解していないと下記のような問題がおきてきます。昔の僕に起きた問題です。
・またオブジェクト指向型の設計ができないので、プログラムの設計をするシステムエンジニアにはなれない。ようするに出世できない。
・またオブジェクト指向の知識がないと、プログラミング言語の技術書を読み進めていっても理解しづらくなり、結局あいまいな知識のままになってしまう。
なのでこの記事で正しく理解しましょう。
それにこのオブジェクト指向の考え方は、現在、多くのプログラミング言語で実現できるし、かつ開発の主流になっている考え方なのでエンジニアとして生きるなら絶対に理解が必要なんです。
【オブジェクト指向とは?】
さあ、では本題です。
一言で言うとオブジェクト指向とは『いかに効率よくわかりやすく開発ができるか』を突き詰めた考え方です。
もうそれにつきます。なのでまず、このオブジェクト指向=『いかに効率よくわかりやすく開発ができるかという考え方』というのを頭に入れてください。
これがベースになります。この先、迷ってもこれを思い出してくだしてください。
では開発の効率化やわかりやすさを具体的にどういった方法で実現するかというと、オブジェクト指向の名前にもなっているオブジェクトが関係してきます。
オブジェクトとは日本語で、"物、物体、対象"といった意味です。
物とはこのペン、コップも物ですね。あとは僕も物に含まれます。
ようするにプログラミングする事柄をオブジェクト指向ではモノとして考えることにより、効率化やわかりやすさを実現しています。
そしてこのモノには、どんな奴(属性)でどう動くか(処理)を定義することができるんです。
こういったようにモノとして扱う考え方をプログラミングに落としていくんですね。
・・・で、ここまで説明しててもちょっと意味わからないと思います。
だいたいのテキストがこんな感じで抽象的に説明してるので理解できないですよね。
なので今からは実例やイラストを使って具体的に説明します。
では、この実例なんですが、よくオブジェクト指向を説明してるサイトや書籍ではテレビや車を例に説明してるのですが、実際の開発現場と結びつかない例ばかりなのであまりピンとこないですよね。
僕ははじめて学習したときピンとこなかったです。
そこで今回は、あなたが格闘ゲームアプリのプログラミングを書くことを例にします。
ストⅡみたいな格ゲーですね。
その中でも今回はわかりやすいようにオブジェクト指向の考えを元に5種類のキャラを作ってみましょう。ストⅡでいったらリュウやケン、ベガですね。
いきなり5種類のキャラを組み立てるのではなく、まずそのキャラを作るにはどんな特徴があるのかを精査して設計図をプログラミングしていきます。
この設計図のことをクラスと言います。
クラスに書けることはプロパティとメソッドと言われるものだけです。
プロパティというのは、『名前』『年齢』『どこの国出身』『HP』『勝利したときの決め台詞』などのキャラごとの属性のことです。
次にメソッドというのは、『攻撃する』『ジャンプする』『決め台詞を言う』などの動き部分つまり処理のことです。
開発の一番はじめに作るクラスは、すべてのキャラの骨組みとなる初期キャラクタークラスです。
これを元に5種類のキャラを作っていくんで、このクラスにはすべてのキャラに共通する特徴を書いていきましょう。
たとえばこれらですね。
この特徴はすべてのキャラが持っているので初期キャラクタークラスに書いていきます。
こうすることにより今後の開発がすごく楽になるんです。
では初期キャラクタークラスができたら、それを元に5種類のキャラのクラスも作っていきましょう。
その場合もう初期キャラクタークラスができているので、また一からプロパティやメソッドを書く必要はありません。
ではどうするかというと骨組みの初期キャラクタークラスから新たなクラスを作る場合、継承という技を使います。
継承というのは、初期クラスの機能つまりプロパティ、メソッドを引き継いだ新たなクラスを作ることです。
キャラクターのような似たようなものをたくさん作る場合、すべてのキャラの共通した機能をひとつひとつプログラミングするのが面倒なので、継承を使うことで同じ機能を新しいクラスでも使えるようにするんです。
このように同じようなプログラムを共通化する考えが継承なんです。
すごく便利ですね!
例えば、初期キャラクタークラスが完成したあと、次にこの野獣キャラを作りたい場合は、初期キャラクタークラスから継承して野獣クラスを作ります。
もちろん野獣クラスは初期キャラクタークラスに書かれている処理はすべて使えますよ!
ちなみにこの継承元のクラスを親クラスまたはスーパークラス、継承先のクラスを子クラスまたはサブクラスと言います。
でも継承しただけでは初期キャラクタークラスと機能はまったく同じですよね。
なのでまず野獣キャラに合ったプロパティを設定していきます。
たとえば名前は『ガイア』、年齢は人間じゃないんで『200歳』、出身は『ブラジルのアマゾン』と各プロパティを設定していきます。
次に処理です。
まず野獣はパンチしないので『パンチする』メソッドを『引っ掻く』ことができるメソッドに書き直しましょう。
このように「親クラスのメソッドを子クラスで上書きする」ことをオーバーライドと言います。
このようにオーバーライドによる継承したキャラが違う動きをする特性のことをポリモーフィズムと言います。
あとは野獣キャラの独自の攻撃『おならをして相手をひるます』メソッドを追加します。
もちろん他のキャラでは使えません野獣キャラ独自のメソッドです。
またプロパティのHPは攻撃を受けたときのみに通るメソッドからでしかいじれなくしましょう。
理由はなにかの拍子に外側から値をいじれてしまったらMAX HPを超えた値も入れることができるからです。
このようにプロパティのデータに正しい値が入ってるかをメソッドで判断して保護することで、他のプロプログラムから干渉されないように作ることができます。
こういった考え方をカプセル化と言います。
このようにメソッドの追加、上書きを繰り返せば野獣キャラの出来上がりです。
これを5キャラ分、継承してプロパティ、メソッドをそれぞれ設定すれば、すべてのキャラクターが完成します!
もちろんキャラ以外でもステージもモノとして捉えることができます。
例えば、毒沼ステージならHPが時間ごとに徐々に減っていく。プロレスステージならリングロープに電流が走っていてキャラがあたればHPが一定量削られるなど、継承を使えば多種多様なステージが手軽に作れますね。
でもこのくらいの機能なら、わざわざ継承しなくても別々で定義すればいいのでは?と思いますが、図と違って実際の開発現場では、キャラが共通して持ってる機能が膨大なのでこうやって継承することにより開発の手間がめちゃくちゃ省けるんです。
そのほかにも、やっぱキメ台詞ではなく決めポーズに変更したいと仕様が変わった場合、継承していなければ、すべてのキャラのプロパティに手直ししなければなりません。
これはかなりの手間ですよね。それが継承だと初期キャラクタークラスの1か所だけ直せばOKになるんです。
このように継承をすることによって、共通のプロパティ、メソッドをまた書かなくてよくなるのでコードの重複を減らしてコードの再利用性を高めることができるんです。
そして実際にプログラムが動くと、野獣クラスを元に野獣という実体を作りだします。
ユーザーはその実体を操作して、野獣クラス内のメソッドに定義された範囲内で戦っていくんですね。
この実体のことをオブジェクトと言います。
ようやく繋がりましたね。
そう、モノとして考える理由は、共通する特徴ある者同士をまとめて、プログラムを共通化するためなんですよ。
共通化つまりクラスでまとめることにより、さきほど出てきた独立性、再利用性、拡張性がそれぞれ高まるんです。
再利用性は継承で、独立性はカプセル化で、拡張性はポリモーフィズムでそれぞれ実現できます。
つまり継承によって機能を共通化して再利用しやすくして、カプセル化によってプログラムが独立でき、ポリモーフィズムによって機能を拡張しやすくなり、よって『効率よくわかりやすく開発』することができるんようになるんですね。
オブジェクト指向の概念としてはこのようなイメージです。
これらの概念がわかった今では格段と技術書も読みやすくなっていると思いますよ!
ちなみにプログラムが動いてクラスからオブジェクトを作り出すことをインスタンス化と言います。
このように、あたかもモノを組み立てるようにして、プログラミングしていくのがオブジェクト指向の考え方なんですね。
では最後にオブジェクト指向とプログラミング言語の関係について話します。
まずオブジェクト指向が使える言語の代表例がこちらになります。
どうですか? プログラムしてる方ならどれか一つは触ったことあるか現在、使っている言語があると思います。
そう、いまメインストリームになっている言語のほとんどでオブジェクト思考を使うことができますね。
その他にもマイナー言語も含めるとまだまだオブジェクト指向が使える言語はあります。
このように現代の言語はオブジェクト指向を強く意識して作られています。それはやはりメリットが多く便利だからです。
なのでプログラマとして生きるなら、オブジェクト指向の理解は絶対必要なんですね。
ちなみにオブジェクト指向以外の概念には、手続き型プログラミング、関数型プログラミングというものもあります。
ここで説明すると時間が足りないのでまた記事にしていきたいと思います。
オブジェクト指向まとめ
では最後にまとめて終わりたいと思います。
・オブジェクト指向が理解しづらいのは決まったルールではなく概念だから
・その概念とは、いかに効率よくわかりやすく開発ができるかを追求した考え方
・クラスは設計図で、継承はクラス同士で機能を共有すること
・プログラムが動くとクラスからオブジェクトを作成し、定義された範囲で行動する
・このオブジェクト単位での独立性、再利用性、拡張性を意識した考え方がオブジェクト指向
・現代の言語はオブジェクト指向を強く意識して作られているので必須科目
・機能の変更・追加がしやすい
・大人数で開発するときに便利
・大変な作業を無くす
いかがでしたでしょうか?
概念を理解するのはなかなか難しいと思うんですよね。このような実例を使って昔の上司に説明されるまでは僕も理解できなかったんです。
なので共有したくてこの記事を書いてみました。少しでもみなさまの理解の助けになれたら僕としてはこの上なく嬉しく思います。
それでは!
オブジェクト指向の考えをより応用して使いたい方は以下の本がおすすめです。わかりやすい説明のため、ベストセラーにもなりました。
以下の記事では無料で読めるプログラミングのテキストを集めました。
・【3分で完読】Twitterの歴史
・【3分で完読】Instagramの歴史
・【3分で完読】Facebookの歴史
・【3分で完読】YouTubeの歴史
・【3分で完読】LINEの歴史
・【3分で完読】mixiの歴史
・【3分で完読】AI・人工知能とは?
・【3分で完読】量子コンピューターとは?
・【3分で完読】VR・AR・MR・SR・XRとは?
・【3分で完読】Web会議システムの比較と選び方
●テクノロジー入門に関する記事
・【保存版】日本国内におけるSNSの歴史のまとめ
・【AI入門・前編】人工知能の仕組みを中学生でもわかるように説明
・【AI入門・後編】 人工知能の技術をやさしく解説
・【量子コンピュータとは?】仕組みを中学生でもわかるように解説
・【図解】オブジェクト指向とは?【完全マスター】
・【Arduino】電子工作のはじめ方【初心者向け学習法】
●最新技術ニュースに関する記事
・iPhone12がサポートすると噂の超近距離無線LANサポート「IEEE 802.11ay」とは?
・2020年3月の注目すべきAIニュース5選をわかりやすく解説
●商品・サービス体験レポートに関する記事
・近未来・山手線の新駅・高輪ゲートウェイ駅をレポート【AIさくらさん、TOUCH TO GOなど】
●テクノロジーの本に関する記事
・【無料で読める】初心者&独学向けプログラミングのおすすめ本18選
・【無料で読める】初心者でもAI・人工知能を簡単に理解できる本14選
●ショートショートに関する記事
・【埋込み型AI】テクノロジー系ショートショート朗読・秋葉原編