プログラミングを趣味にしたい

UE4、scala、ゲーム作り、webアプリ制作とか手を出しているPC系趣味について書き溜めるブログ。現在大規模改装中

このブログは現在リブート中です。 予告なく変更、削除、停止を行う場合があります。
回収作業が終わったらこの文章は削除します

イメージで理解する「プログラミング初心者が確実に意味不明になる”オブジェクト指向プログラミング”ってなんなのさ」

まぁ、たいていオブジェクト指向プログラム言語を使うことになるよね

プログラミングを始めるときに、当然選ばなきゃいけないのが使用言語ですが、それを決める指針になるのが”目的”と”プログラミング手法”です。
まぁ、目的はいいでしょう。ゲームを作るんだ!とか、webアプリを!とか、スマホアプリを作りたい!とかとか。。。。たいてい決まっているものです。
しかし、この”プログラミング手法”ってのが曲者。初心者は全く意味が分からない。
とはいえ、”オブジェクト指向”な言語が主流なのでほとんどの人がこの”オブジェクト指向プログラミング”を使うことになると思います。
しかし、プログラミング初心者がオブジェクト指向プログラミングって最初に対面すると本当に意味が分からない。
ということで、自分なりに理解している「”オブジェクト指向”ってのがなんなのか」を初心者向けにざっくり説明しようと思います。
なんとなーくわかりたいなーと思う人は、一席おつきあいください。
お前の理解間違ってんぞって方はコメント待ってます。




※わかりやすさ優先のため、いろいろ端折ったりしますので、本格的に知りたい人はそれ用の本やプログラミング言語技術書。あるいはググって調べましょう

そもそもオブジェクト指向プログラミングって?

Java,C++,C#,Python,rubyにJavaScript,iosのアプリを書くならばobject-CやSwiftも”オブジェクト指向プログラミング言語”です。
おそらく、これなら聞いたことあるなーと思い浮かべている言語の中に確実にオブジェクト指向プログラミング言語があります。
で、例えばjavaだったら、こんなコードを見かけることになります。

class Animal{
  ....
}
class Dog extends Animal{
 .....
}
…
Animal animal;
animal = new Dog();

…
animal.hoeru;
…

すっごいざっくりと何をしているかと説明すると

  1. Animalクラスのanimal変数を用意し、 => Animal animal;
  2. その中にDogクラスのインスタンス(実体)を格納し、 => animal = new Dog();
  3. いろいろした後にanimalのhoeruメソッド(hoeru関数)を実行する。 => animal.hoeru;

となります。

やる夫AA:クラスってなんだよ

本当に初心者にとっては意味不明になると思います。(´・ω・`;)

そもそもオブジェクト指向とはどんな言語なのでしょう。
オブジェクトってなんでしょう?クラスってなんでしょう?

まず用語を理解しよう

オブジェクトってなんなのさ

”オブジェクト”指向というからには当然オブジェクトに重きを置く手法なわけで、じゃあオブジェクトって何かというと、たいていの本にはこう書いてあるとおもいます。
「オブジェクト」とは「データとそれに対する処理をひとまとめにしたモノ」である。
つまりオブジェクト指向プログラミングとは、「データとそれに対する処理をひとまとめにしたモノ」を一纏まりの塊と考えて、その組み合わせで動作を記述するプログラミング手法なのです。

やる夫AA「で?」

だからなんだよ!!という気持ちはわかります。ですので、もう少し詳しく言い換えましょう。
例えばある犬がいるとして、その犬の情報として
「名前、身長、年齢、体重、毛色、歩く速さ。。。。」とかの状態(データ)と、
「大きく”ワン!”と吠えるんだよ、四足で歩くんだよ、歩いたら棒に当たるんだよ」とかの振る舞い(処理)とがあるとします。
この状態と振る舞いの二つをまとめたものが、オブジェクトです。

ある犬のオブジェクトを参照すると、その犬の体重や名前といった必要なデータがわかります。ある犬はすっごく重い犬で、ある犬は黄色い色をしているかもしれません。
また、ある犬のオブジェクトに吠えろと指示するとでかい声でワンと吠えて、別の犬オブジェクトに吠えろと指示するとクゥーンと哭きます。あるいはニャーと哭く犬のオブジェクトがあるかもしれません。


クラスとかインスタンスってなんなのさ

さて、オブジェクト指向をわかりにくくしている原因の一つに専門用語が多いことが挙げられます。
プログラミングの基礎だけでもいろんな用語が出てくるのに、さらに用語が追加されるため正直いやになってくる人は多いのではないでしょうか。なので、とりあえず下記4つだけ理解してください。

クラス
オブジェクトを作る設計書です。どんな状態があるかーとか、どんな振る舞いをするかーとかが書かれています。この設計書を見てオブジェクトは作られます。プログラミング言語によってはクラスはありません。(javascriptとか)
インスタンス
クラス(設計書)を見て実際に作ったオブジェクト。つまり、設計書から出来上がったものです。大抵newする出来上がります。日本語では「実体」といいます。家を建てるための設計書(クラス)から作った本体の家がインスタンス。犬の特徴を示すDNA設計図(クラス)から作られた犬本体がインスタンス。となります。
プロパティ
状態のことです。つまりデータのことです。変数の場合もあったり定数の場合もあったりします。
メソッド
振る舞いのことです。メンバー関数とも言います。

とりあえず、ざっくりとクラスとインスタンスって何かさえわかればまずは良いと思います。

オブジェクト指向におけるクラスとインスタンスのイメージ

そもそもオブジェクト指向ってなにがいいんでしょう?

いろいろ役に立ちますが、たとえばこんないいことがあります。

ポインタを詳しく知らなくても使える言語が多い。

言語の基本だし~とおもって、C言語やC++を学ぼうと思ったとき、多くの人間が躓く要素。それがポインタです。そしてメモリ管理です。
文系の多くがひざを折り、理系の多くが頭を苦しめるこのポインタ。こいつに詳しくなくても何となく使える言語が多いことが非常にありがたい。当然ポインタと構造体を理解した方がうまく使えますが、知らなくてもなぁなぁで使えます。ある程度プログラムに慣れた後に理解を深めてください。

個別に処理を任せられます。

独立したオブジェクトに処理の責任を任せられるので、メインの処理は各オブジェクトに「やっといてね」というだけで済みます。ある課長が部下にいちいち「A君は書類を~してコピーしてー」「B君は会議用の書類を作って~」「C君は会議室取ってきて~」とか支持するのは大変です。できれば課長は「会議があるからいつも通り準備してね♡」と言ったらみんなが各自勝手に動いてくれる方が助かりますよね。そういうことです。

変数の範囲が限定されます。

オブジェクトの中に変数があり、変数の影響範囲がクラス内に限定されます。
このことで、そのオブジェクトの変数を触る人を限定することができます。
だれがいつどこで変数に触れるかわからないというはとても恐ろしいことで、変数をどこで使っているかわからないことや、いつの間にか変な値が入っていてエラーが起こることは良く起こります。
この「変数の管理が簡単になる」ということは、初心者のみならず、大規模設計者には非常にありがたいことです。

処理が複雑になりにくい

一つのファイルにいろんな処理を書いて、細かく指示を出していると、処理の数も種類もすごく多くなり、複雑になります。大きなプログラムや複雑なプログラムを作るときにこれはすごいデメリットです。
この処理はこのオブジェクトが一手に引き受ける。別の処理はノータッチ。と負担を分離することで一つ一つの処理がわかりやすくなります。
問題を分割し、処理を分割し、オブジェクト一つ一つの処理はシンプルに設計するとその便利さがわかることでしょう。

似たような処理を何度も書く必要がなくなる

似たような処理を何度も記述するのは疲れます。でも、オブジェクト指向プログラミングでは、設計書があるため、違うところだけちょっと書き直したり、状態だけ修正することで似たような、でも違う振る舞いをするオブジェクトを簡単に生み出せます。

本題!オブジェクト指向ってどんな言語?

オブジェクト同士の相互作用として、システムの振る舞いをとらえる手法のこと。 by Wikipedia

そんないろんなオブジェクトをいっぱい作って、アレしてこれしてと一括して頼んでしまえば、あとは勝手にオブジェクトが処理してプログラミングが動きます。それがオブジェクト指向プログラミングです。

まぁ、オブジェクト指向プログラミングというのは、一つ一つ役者や裏方を決めて、みんなで演劇をしてもらうようなものなのかもしれません。
※あ~詳しい人は石を投げないでください。例えですよ例え (((;゚Д゚)))


大きい物を作りたければ、小さいパーツ(各自独立)を分けて作って組み合わせたほうがいいよね!という考え方でもあります。
つまりオブジェクト指向というのはブロックを組み立てて大きなものを作るレゴのようなものでもあります。
※例えですよ例え。詳しくは各自勉強してくださいね。 o(^-^)o

オブジェクト指向がパーツの組み合わせで作られるイメージ


また、オブジェクト指向には重要な考え方があり、それに沿って作っていく手法とも言えます。

  • カプセル化(状態と振る舞いの隠蔽)
  • インヘリタンス(継承)
  • ポリモーフィズム(多態性、多相性)

の三つです。一つづつ見ていきましょう。

カプセル化ってなんなのさ

利点で述べた、「個別に処理を任せられ」、「変数の範囲が限定され」るのをサポートする機能です。
オブジェクト内部に記述したデータや振る舞いを隠したり、オブジェクトの実際の型(クラスのことだと思ってくれ)を隠くしたりすることをいいます。
何がいいかって、中身が変わっても外から見れば変化しないこと!
例えば、ある文章をユーザに伝えたいときに、画面に文字を出すのか、音声が出力されるのか、いろいろ方法がありますよね。
でも、機能追加ごとにプログラムすべてを変更していたらややっこしい&めんどくさい。エラーも出すことになります。
なので、”ユーザについたえる方法”を一つのオブジェクトに隠してしまうことで、変更に柔軟にでき、かつ使う方は「~とユーザに伝えてくれ」と頼むだけであとは気にせずに使える簡便さを獲得できるようになります。

オブジェクト指向カプセル化のイメージ

インヘリタンスってなんなのさ

継承という名のほうが通りがいいです。
利点で述べた、「似たような処理を何度も書く必要がなくなる」のをサポートする機能で、ある設計書の内容を含んだ別の設計書を作ることができる機能です。
例えば「哺乳類」の設計書から「犬」や「猫」や「牛」の設計書を作るようなものです。
哺乳類設計書から、「ワンと吠える」犬設計書、「ニャーと鳴く」猫設計書、「モー鳴く」牛設計書を作れば、哺乳類設計書に書いてある振る舞い「乳を飲ませて育てる」や、データ「心臓を持ち、2心房2心室」等をそれぞれに記述する必要はなくなります。
(たまに継承と委譲を使い分けられず悩まれる方がいらっしゃいますが、継承と委譲は全く別物。委譲は”共通した機能”を付け加える物。継承は”親グループの機能を共有する”ものです。)

オブジェクト指向継承のイメージ


ポリモーフィズム

型システムを理解しないと説明しにくいけれど、とてもとても大事な機能です。
誤解を恐れず非常に簡単に説明すると、”継承したクラスや同じ機能を付けたオブジェクトを同じものとして扱うことができるようになる機能”です!

やる夫AA「いやいや意味がわからん」

でっすよねー
例えば、何でもいいので鳴ける奴らみんなに鳴いてほしいとします。
オブジェクト中身は何でもいいので、鳴ける奴はサッサと鳴けということです。
そんなとき、中身はわからないけどこのクラスなら鳴けるよというのがあるといいですよね。「鳴ける機能を持ってる」やつらか「鳴ける性質を継承」した奴らかは設計によります。
そいつらに、とりあえず鳴け。やり方はお前らに任せると言える機能。
これがポリモーフィズムの恩恵です。(すっごい誤解を招きそうな説明だ。。。。。)

オブジェクト指向ポリモーフィズムのイメージ

雑感

奥の深いオブジェクト指向プログラミングですが、ちょっとでもとっつきやすくなったよーとなってもらえれば幸いです。
(”オブジェクト指向プログラミングって何”をざっくり書いただけでも長くなってしまったorz もっと短くできるように頑張らねば。)

おすすめのプログラミング言語とか本とかねぇのかよ...

初心者はとにかく何か作ってみると理解が深まるため、実際何か作ってみるのがおすすめ。
※お金を出したくない人や、初めて数か月の人は無料のwebサイトに頼る方が結果的に良い場合もあります。
http://dotinstall.com/dotinstall.com

オブジェクト指向プログラミングの言語はいろいろありますが、個人的に初心者にお勧めする言語は下記4つです。

追記:後日初心者向けのプログラミング言語紹介記事書いてみました。よろしければこちらもどうぞ
tec.citrussin.com


java

大抵のプラットフォームで動く上、非常に有名なため初心者向けのwebページや参考書が多い。また、ネットワーク環境への機能が豊富で就職にも有利。androidアプリを作りたいならコレ。ただし、古い言語であり便利な機能が少ない。いろんな人が手を加えたおかげでライブラリ周りがごちゃごちゃしています。

スッキリわかるJava入門 第2版 (スッキリシリーズ)

スッキリわかるJava入門 第2版 (スッキリシリーズ)

15歳からはじめるJAVAわくわくゲームプログラミング教室 フルカラー最新版【Windows & Mac両対応】

15歳からはじめるJAVAわくわくゲームプログラミング教室 フルカラー最新版【Windows & Mac両対応】

Scala

javaベースのため多様なライブラリが使え、最近生まれただけあって非常に洗練されている言語。私はこの言語が大好きです。上級者から初心者まで扱え、最近流行の関数型プログラミングもできます。問題は、新しすぎてandroidアプリ等の作成に対応していないし、紹介したwebページも少ないこと。何より、いろんな機能があるため、javaを習得してからのほうがよい気がします。

Scalaスケーラブルプログラミング第3版

Scalaスケーラブルプログラミング第3版

Scala関数型デザイン&プログラミング―Scalazコントリビューターによる関数型徹底ガイド

Scala関数型デザイン&プログラミング―Scalazコントリビューターによる関数型徹底ガイド

C#

windows用のアプリやゲームを作るならば非常に頼もしい言語です。.NET、つまりwindows用のプログラムを書くうえでの標準的な言語であり、例えばwinアプリ、ゲームプログラミング、webサーバー等をやりたいなら非常におすすめ。Xamarinを使うことでandroid/iphone両方向けのアプリが作れ、unityを使うことで本格的なゲームを作ることができます。

猫でもわかるC#プログラミング 第2版 (猫でもわかるプログラミング)

猫でもわかるC#プログラミング 第2版 (猫でもわかるプログラミング)

ひと目でわかる Visual C# 2013/2012 アプリケーション開発入門 (MSDNプログラミングシリーズ)

ひと目でわかる Visual C# 2013/2012 アプリケーション開発入門 (MSDNプログラミングシリーズ)

Swift

macのmacによるiosのための言語。iphoneアプリを作りたいならこれがベストの選択になります。事実上macを買わないと使えないため注意。
流行の技法、糖衣構文などにも優れ、様々な教本もでているため初心者にも優しい。
アップル(Mac)のファンならばとりあえずこの言語を選んでおきましょう。

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

iOSプログラミング入門[iOS8.1/Xcode6.1/Swift 対応]―Swift + Xcode で学ぶ、iOSアプリ開発の基礎

iOSプログラミング入門[iOS8.1/Xcode6.1/Swift 対応]―Swift + Xcode で学ぶ、iOSアプリ開発の基礎

スクリプト言語

コンパイラ(機械がわかる言葉に翻訳してくれるプログラム)のチェックを通さないため、初手で学ぶのにはどうなのかなーと感じなくもありませんが。
しかしはじめてでもわかりやすく、使いやすく、即試せる上に複雑にならないので、やはり「とりあえず」という人にはベストチョイスでもあります。

Python

手軽に書けるスクリプト言語として第一にはPythonを紹介すべきでしょう。
作り出した開発者本人が”最初の言語としてPythonを選びオブジェクト指向を学んでほしい”と口にし、読みやすく、少ない労力で、さまざまな用途のプログラムを作れます。
更に”同じことをしようとするとたいてい同じ書き方になる”ため、構文戦争が起こりにくいのも初心者に優しいです。
その幾多者”やりやすさ”は、SwiftやGo、Groovyなど新しいプログラミング言語に多大な影響を与えました。
機械学習や高度な数学用のライブラリが揃っているため、ディープラーニングや人工知能に興味がある人はまずコレ。
その他、仕事の効率化や”ちょっと試してみたいこと”を自動化するにはピッタリ。手軽に書けて、素早くプログラミングできる素敵な言語です。

入門 Python 3

入門 Python 3


Ruby

やはり、初心者日本人向けオブジェクト指向言語としてRubyを紹介しないのは背信行為だと思います。
まつもとゆきひろさんが開発したこの言語は、日本人開発言語としてはじめて国際規格に認証されました。
「プログラミングをストレスなく楽しむ(enjoy)ための言語」として開発されました。
Webアプリケーションを作る上で非常に強力なツールとなるRuby on Railsのもととなる言語でも有り、個人でwebサービスを始めたいならまずRubyを触ってみてはいかがでしょうか。
また、「RPGツクールXP・RPGツクールVX」でのゲームプログラミング言語(RGSS)元として採用されていることもあり、そちらの開発経験がある人もすんなり入っていけます。

  • 日本人開発ということで、開発者本人が書いている日本語資料があるのがうれしいですね!

プログラミング言語 Ruby

プログラミング言語 Ruby



ではでは、私の駄文がみなさんをプログラミング沼に引きずり込むと信じて!


関連記事

tec.citrussin.com

ブログ再起動中・・・・