Unityでインディゲーム道!

プログラム、Unity初心者がインディゲーム制作を目指して日々思うことなどを書き綴ります。

Unityのための打倒C#[1] オブジェクト志向、クラスという罠。

初心者がオブジェクト指向を気にする必要は無いのではないか?という主張をまとめてみました。 

 

C#はプログラミング完全初心者にとって最適な、より現代的で合理化されたプログラミング言語という風に言われています。加えてUnityC#で動かせる!ってことで勉強し始めたわけです。

まだ全然未熟者ですけども、ある程度出来るようになった今では確かにそう思います。C#visual studioがなかったら多分一生プログラムなんて出来なかったんじゃないかとすら思います。

 

一応音楽に携わるものとしては、音楽制作用のVSTプラグインDAWに追加できる個別のソフト)などはまだまだ多くのものがC++で書かれているようで、ちょっと悩んだんですが(プラグインインストール時にC++もよくインストールされるので)おそらくC++からだと挫折していたとでしょう。

C#は見た目の字面も、かなり普通の英文に近くみえますし、抵抗は少ないかなと。これに慣れてしまうと他の言語に違和感を感じてしまうといった部分はありますが、C#から勉強し始めてよかったと思います。

  

C#自体は悪くない・・・けど

とまあ、とにかくC#が最初に学ぶ言語としては最適だ、というのは間違いないなと思います。みんなそう言うし。

 

がしかし、だからといって初心者にとってふさわしい適切なテキスト、書籍があるかといえばそうでは無いのがまた現状なのではないでしょうか?

 

Unityのための打倒C#と題し、シリーズものとしていかに挫折しないでプログラミングできるようになるか!という格闘の様子を記していきたいと思います。罠が多すぎますよ!
またそもそもUnity上でC#を使うということと、通常のC#でのプログラミングでは多少異なるので、そこは注意が必要だと思います。(そういう点でいきなりUnityから始めた方がいいよ!っていう人がいるんでしょうが・・・、うーん。)

  

“オブジェクト思考”、及び“クラス”というものについて!

おそらく多くのC#の入門本で“クラス”について重要な概念としてかなり早い段階で言及されることだと思います。ただし、ここに大きな罠が待ち受けています。

よく言われるのが“クラス”というものは青写真、設計図である、ということです。オブジェクト指向とは、その設計図を元に実体(オブジェクト)を作り、その実体を通して、動作をさせることを念頭にプログラムしていくことだ、というような説明がなされる訳です。(しかし初心者がこのように説明されてわかるはずもありません。その理由については後で説明します。)

 

おそらく多くのC#入門書において、このような説明がされていることだと思います。しかし、同時に“クラス”は囲い、器の役割も持っています。これは英語の“クラス”という言葉の本来の意味である『同様な性質を持ったものをまとめたもの』、と意味に由来するわけで、ここも押さえておかなければいけないと思います。

 

以上のことから“クラス”というものは、うまく使えさえすれば良い事しかありません。

 

 クラスを上手く使うと・・・

・囲い、一種のケースとして利用すれば、データおよび変数や関数をうまく整理でき、他のものと混同する恐れが減るし、可読性が高まる。

・分業しやすくなるので作業効率も高まる。よって保守性も高まる。

カプセル化することでグローバル変数において起こりうる、誤った数値を代入してしまうというような事故を防ぐ。

・後から機能を追加する場合であっても容易になり、高い拡張性が保持できる・・・

 いいことがこんなにたくさん!

 

こうして書いてみると、本当に良い事しかありませんね。しかし現実に“クラス”というものに有効性を見いだすことのできる状況というのは、より大規模な開発においてなわけでしょうし(あるいは中規模)初心者はそもそもプログラムしたことないのだから理解出来るわけないです。

初心者にとっては別に最初から覚えておく必要はないんじゃないか?というのが正直な感想です。勉強し始めていきなり教えられてもなぁ、と。

  

クラスは後天的なもの

プログラミング自体はそれなりに長い歴史を持っており、そうした中で試行錯誤があって、より良い機能であったり、改良が加えられてきたんだと思います。C++もそもそも“クラス”を追加したC言語、というのが出発点みたいですし。そうした面から見ますと、“クラス”および“オブジェクト指向”という概念は、プログラミングにおける諸問題に対する対応策として追加された、いわば後天的な機能であると言えると思います。

 

プログラミング初心者が学ぶべきものは、当然まず先天的なことでそれをよく理解した上で、応用編として後天的なものを勉強するべきじゃないかと。それが物事の自然な順序だと思います。しかし、そうした視点から書かれた本はないように思います。
あったらぜひ教えていただきたいんです。まあページの都合上もあるでしょうし、めんどくさいんでしょうね。(ケンカ腰。)

 

先天的なものっていうのはすなわち変数であったり、その宣言、配列、関数、比較演算子やfor文、if文などの制御構文、だと思います。まずはHello World!からはじめないといけないわけで。Hello!World!を書くのにクラスは必要ないですから。

 

そうしたプログラミングの基本的なことを覚えた上で、かつある程度の実際のプログラミング経験を経て初めて“クラス”というものを理解できるようになるのだと思います。初めから初心者に“クラス”を説明したところで混乱するでしょうし、およびクラスの乱用を招いてしまうのではないでしょうか?

  

クラスを作ること自体が目的ではない、はず・・・。

何でもかんでもクラスに分けてしまうこと、その結果クラスとして意味を成していないものを“フェイククラス”と言うらしいです。クラスというのものはあくまでサポートする機能であるのにかかわらず、クラスを作ることそれ自体が目的になってしまうような状況が本業のプログラマの方々でも多々あるようです。プログラマの考え方がおもしろいほど身につく本』( V.Anton Spraul著) においてそうした危険性が指摘されています。

 

とにかく、何より大事なことは、ホントの初心者はまず“クラス”を理解する必要は無いのだ!ということを断言したいと思います。

 

Unityにおいては、C#自体のこうした根本的事柄についての説明が、公式にすらありませんのでやはり最初はプログラミングから勉強したほうがいいのかなぁと個人的に思います。

 以上、独学でプログラミングを学んでいるものの意見、感想です。