バナナでもわかる話

計量経済学・統計学が専門の大学院生です。統計学・経済学・投資理論・マーケティング等々に関する勉強・解説ブログ。ときどき趣味も。極力数式は使わずイメージで説明出来るよう心掛けていますが、時々暴走します。

【趣味記事】C#はじめました

f:id:bananarian:20180826233433j:plain
プログラミングは基本的にはRしかやったことない私ですが、



「そうだ、ゲームを作ろう」



と思い立ち、今日からC#を勉強してみることにしました!!

とりあえず、Rはプログラミング言語的には最弱(?)らしいので、未経験同然ってことですが、何やら調べてみたところ、



オブジェクト指向プログラミング



とやらを理解することが第一ステップのようなので、それについて調べた範囲でまとめてみました~。


オブジェクト指向プログラミングとは?

プログラミングをする動機と言えば「データ解析を行いたい」「ゲームを作りたい」「アプリを作りたい」等々あると思いますが、個人的にデータ解析を行うだけなら、プログラムは大した規模にはなりませんし、修正やアプデをする必要もそんなにありません。なので、コーディングの時点で整理をしなくても良いし、使いまわす関数も高々知れてるわけですが、ゲームアプリを作ったり、大きなシステムを管理したりといった話になってくると、だらだらコードを書いてたら乱雑に並んだプログラムが出来上がり、1個何かを修正したりアプデしたりしようとすると、そのプログラムの整合性を保つために色々な個所を修正する必要が生じます。

そこで、オブジェクト指向プログラミングが登場してくるわけです。

オブジェクト指向プログラミングを適切に行うと、修正等の変更が少なく済み、スムーズにシステムを運営することが出来るとのことでした。

オブジェクト指向プログラミングのイメージ

どうやら、クラスという名前の設計図を先に書いてしまって、その設計図であるクラスを元にしてオブジェクトという便利グッズを大量に作成する。作成したオブジェクトを組み合わせて大規模なプログラムを作り上げようという方法がオブジェクト指向プログラミングのようです。


例えば、RPGゲームのモブキャラなんかを思い出してもらうとわかりやすいかもしれません。
RPGゲームの道中に同じところをひたすらグルグル回り続けるモブのおじさんっていっぱいいますよね。
そして話しかけたらこんなことを言うわけです。


「きのみを与えるとHPが少し回復するぞ。」


このおじさんの元になっている設計図(クラス)を考えてみます。
1つのゲーム中に同じ顔なんだけども、セリフだけ違うモブのおじさんっていっぱい出てきますよね。つまり、セリフの中身はおじさん毎に変えたいわけです。一方どのおじさんであっても、要は「主人公が話しかけるとセリフを言う」「同じ場所を同じ間隔でグルグル回る」のは変わらないわけです。つまりこれは設計図として統一した方がスッキリします。

そこで クラス「おじさん」 は次のようになります。
・セリフに関する文字列を覚えさせることが出来る
・ある間隔で動く
・主人公が話しかけるとセリフを言う

そして作成したクラス「おじさん」を使ってオブジェクト「おじさん1」「おじさん2」「おじさん3」を作ります。
おじさん1,おじさん2,おじさん3にはそれぞれ異なる、具体的なセリフに該当する文字列を与えてやります。

これでクラス「おじさん」に基づいたオブジェクトを作ることが出来ました。


これがオブジェクト指向プログラミングです。


オブジェクト指向プログラミングのメリット・デメリット

イメージはわかったけど、クラス「おじさん」を作ることに何の意味があるんだ、別にいきなり「おじさん1」,...「おじさん3」を作ってしまえば良いじゃないか。そんな気もしてくるわけですが、このクラスからプログラムを作っていくのにはいくつかの理由があります。

具体例1

例えば、「おじさん」達を日付が月曜日の時だけきのみをプレゼントしてくれる「おじさん」に書き換えたいとします。
オブジェクト指向プログラミングを行っていれば、クラス「おじさん」に月曜日だけきのみをくれるという動きを加えてやるだけで全ての「おじさん」に適用されます。しかし、クラス「おじさん」が無いと、おじさん一人一人にきのみを与えるという動きを加えなければいけなくなります。これは非常に面倒くさいし、そもそも広大なプログラムの中の複数のおじさんを発見するのは大変です。

具体例2

今度は「おじさん」を5人に増やしたいとします。この時もオブジェクト指向プログラミングを行っていれば、クラス「おじさん」を元にオブジェクトのおじさん4,5を増やしてやるだけなので簡単です。

具体例3

チームでプログラムを作っているとすると、別の人に引き継ぎをする場面も出てくるかもしれません。そうすると整理されていないプログラムは最悪です。引き継いだ人がどこをどういじると整合性が崩れるか訳が分からない状態になります。また、引き継いだ人がプログラムを理解するにあたって、クラス「おじさん」が無いとおじさん1~おじさん5まで一つ一つ理解する必要がありますが、クラス「おじさん」さえ設定していれば、クラスを確認するだけでおじさんの性質が分かります。

メリット

つまり、次のようなメリットがあります
・変更が容易
・追加も容易
・引継ぎも容易

デメリット

じゃあオブジェクト指向プログラミングがカンペキかというとそういうわけでもないみたいです。デメリットは簡単に調べた限りは次の通り
・構造が複雑になる
・構造が複雑になるので、テストが増える
・メモリを食うし、時間がかかる
等々

後からのシステム変更を行う予定がある部分はクラス化しておくというのが基本的な考え方のようです。
ただし一方で、オブジェクト指向型プログラミングを習得している人はまだまだ少ないようで、習得してない人から見るとプログラムがチンプンカンプンに見えるので、逆に引継ぎが難しくなるといった現場の声もあるようです。

終わり

以上、オブジェクト指向型プログラミングについて調べた範囲でまとめてみました。
完全に初心者の記事ですので、あまり鵜呑みにせず、またプロフェッショナルの方がいらっしゃったらご指摘等々あるとありがたいです。
これから少しずつC#について学んだことをアウトプットしていこうと思います。