個人的にもそこまでクラスを理解しているつもりはないのですが、かつてQuoraで見たことのある回答がかなり腑に落ちましたので記憶からご紹介します。
その方はプログラミングを教えている方で、受講生にゲームを作ってもらう課題を出したそうです。あえて最初はクラスを教えていない状態で。
ゲームを作る場合、例えばいろんな武器を使える設定であれば、いろんな銃・弾丸などがあって、それぞれに火力や射程距離などの共通したスペックを設定しますよね。ものがあって、それについての情報がある。
クラスを使わずにそれらを頑張って書いていくと、武器の数だけ同じコードが量産されます。
例えば後になってから「重さもパラメータに含めよう」と思った場合は、実装した武器の数だけコードの修正が発生するわけです。武器が100種類とかあったら、100箇所の修正です。やってられないし、ミスも容易く起こりそうです。
そこまでやらせてからクラスを教えると、クラス、およびインスタンスというものがいかに便利かわかる…というのがその回答の内容でした。なるほどと思います。
Progateで「クラスとは設計図のことです」などといわれてもピンとこないのはよくわかります。
が、効率的なコーディングのためには絶対に必要不可欠であることは、何かをつくってみればよーくわかりますので
そこがわかれば、マイグレーションの意味もO/Rマッパーの扱いもだんだん腑に落ちてくると思います。
すでに「まとも」な回答がありますが、クラスは「ちょっと便利な関数ライブラリ」と割り切って『理解したつもり』になっておく、のが第一歩です。クラスではないライブラリでは(言語仕様にもよりますが)関数は前回呼ばれた時の情報が保存できず毎回毎回初期状態です。また関数の間で変数を共用できないので、関数内で設定した情報を他の関数に知らせるのはかなり面倒です。
クラスなら共有変数を簡単に定義できるので、単純なライブラリに比べると圧倒的に便利です。クラスは変数を持つことを前提にしているので、変数を初期化するためのコンストラクタが用意されています。
第2ステップ以降は、「ちょっと便利な関数ライブラリ」を日常的に使うようになってから学べばよいでしょう。プログラミングにおいては Do not repeat yourself (DRY) が決定的に重要であると理解しましょう。
Do not repeat yourself!
0 件のコメント:
コメントを投稿