• ベストアンサー

クラスを使用したプログラミングの練習

クラスを使用したプログラミングは学校で習ったことがあるのですが、 机上での学習のみで実習はありませんでした。 クラスを使用したプログラムを勉強したいのですが、 どんなプログラムを作る練習をすればいいのでしょうか? ちなみに今パソコンで使用可能な言語でクラスの概念が用いられているのは RPGツクールVXに付いているRGSS2だけです。

質問者が選んだベストアンサー

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.5

4番の回答者です。 >例えば、普通のプログラム言語では「入力した文字を表示するだけのプログラム」や「合計を求めるプログラム」などのような課題から学習していきますよね。 >それでは、クラスの概念を用いたプログラムはどんな課題から学習していくものなのかという素朴な疑問をしただけです。 >「クラスってこういうふうに使うものなのか」がわかればいい程度で、 >実際に実用的な何かを作りたいというわけではありません。 「実用的」ですか……自分としてはぜんぜん実用的じゃないと思ってたんですが……。 クラスの概念を用いたプログラムのエッセンスを体験できる課題を自分なりに考えたものなのですが、課題の意図を書かなかったのが問題かもしれないのですね。 以下に課題の意図を書いていきます。 1. クラスの定義、クラス≠インスタンス(オブジェクト)ということ、クラスで定義したメソッドの使い方 この課題ですが、ただ指定のメッセージを表示させるだけなら(Rubyの場合)  puts "モンスターは殴りかかってきた" で終わってしまう内容です。それをそうせずに、クラスを定義してそのクラスのインスタンスを作成し、インスタンスのメソッドを呼び出すということを行ってください、ということです。 これが出来ないと、そもそもクラスを使ったプログラミングもなにもあったものではありません。 2. カプセル化、コンストラクタの書き方 モンスターの名前を表す変数とMonsterクラスのインスタンスを別々に用意して処理を行っても指定のメッセージを表示させることは可能です。しかし、そのようなことをすると、モンスターのデータが名前とそれ以外とで分かれてしまいます。 一緒に取り扱うデータは一まとめにすべきで、そのための器としてクラスがあるのです。 その際、そのクラスが持っているデータはクラスの外側からは直接変更できないようにすべきです。 3. クラスの継承、コピペコードは最悪である 2.の課題の結果をコピペしてメッセージを書き換えるだけで課題が要求するメッセージ表示は可能です。 でも、コピペは今は楽でも後々苦労することになります。そりゃあもうコピペしたやつの首を絞めたくなるくらい(そしてそれが3ヶ月前の自分だったということもよくある)。 クラス継承という仕組みを使ってコピペを減らす努力をしてほしいというのがこの課題の意図です。 この課題は課題4.をこなす上での準備でもあります。 4. 抽象クラス、is-a とはいえ、むやみに継承するのは問題です。今回の課題の場合、通常攻撃を行うモンスターから炎を吐くモンスターに派生させていますが、これが問題です。継承を使う場合、is-a関係(「~は~である」という関係)を表現すべきです。「炎を吐くモンスターは通常攻撃を行うモンスターである」というのはおかしいですよね? この場合、「炎を吐くモンスターはモンスターである」「通常攻撃を行うモンスターはモンスターである」というのが正しい関係で、そのような関係を表現できるように継承関係を修正すべきです。 なお、is-a関係だけで継承を考えるのは問題があることが分かっています(正方形は長方形ですが、縦横を変更可能な長方形クラスを派生して正方形クラスを作り、縦の長さを変更したらどうなるかを考えてみてください)。厳密には「リスコフの置換原則」(参考URL)というものに沿っているかどうかで継承関係を考えてください。 5. 多態性 これをよく考えずにやったら、「スケルトンならば××、ドラゴンなら○○」という処理が表示部分に現れます。今回のプログラムなら1回だけですが、実際には1回だけで終わるわけがありません。また、音波攻撃をするモンスター、全体攻撃を仕掛けてくるモンスター、……等が追加されたとき、いちいち表示部分を書き換える必要が出てきます。 これを避け、条件分岐をインスタンス生成部分のみにすることが出来るようになるのがこの課題のミソです。

参考URL:
http://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%B9%E3%82%B3%E3%83%95%E3%81%AE%E7%BD%AE%E6%8F%9B%E5%8E%9F%E5%89%87
viajarse
質問者

お礼

皆様回答ありがとうございました。

その他の回答 (4)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.4

1~3番の回答者が言っているとおり、RGSS2はRPGツクールと密接に結びついているため、エラーが発生したときに作成したプログラムの問題かRGSS2の仕様上の問題か切り分ける必要があります。したがって、純粋にプログラムを学習する上ではちょっと問題があると思います。 あなたがRGSS2に慣れているのであれば、プログラミングの勉強はその基となったRubyで行ったほうがいいでしょう。 ただ、Rubyでは変数の型について厳格とはいえない部分がありますので、クラスの派生の部分を学習する上ではJavaなどで学習したほうがよいでしょう(課題を作っている最中に気づいた)。 とはいえ、あなたの質問はプログラミング言語は何を選べばいいのかではなくどのような学習をしたらいいのかですので、簡単な課題を出します。 1. モンスターをあらわすクラスMonsterを一から作成して、そのMonsterクラスにプレイヤーを攻撃するattackメソッドをとりあえず「モンスターは殴りかかってきた」と言うメッセージを返すように実装してください。次に、そのMonsterクラスを使って、プログラムを起動したら上記のメッセージを表示して終了すると言う処理を書いてください。 2. 1.で作ったMonsterクラスを、インスタンスを作成するときにモンスターの名前を指定するように変更し、メッセージを「(モンスターの名前)は殴りかかってきた」となるようにattackメソッドを修正してください。モンスターの名前は取得することはできても変更することができないようにします。次に、上記のメッセージ表示プログラムを(多分あるであろう)、Monsterクラスのnew部分のみを書き換えて、プログラムを起動したら「スケルトンは殴りかかってきた」を表示して終了するようにしてください。 3. 2.のMonsterクラスから派生させたBreathMonsterを作成し、そのattackメソッドを「(モンスターの名前)は炎を吹いた」と表示するようにオーバーライドしてください。オーバーライドする部分とコンストラクタ以外はBreathMonsterに書いてはいけません。次にメッセージ表示プログラムを、{Javaの場合、変数の型を変えずに}Monsterクラスをnewしている部分のみを書き換えて、プログラムを起動したら「ドラゴンは炎を吹いた」を表示して終了するようにしてください。 4. 3.の状態から、Monsterクラスから派生させたNormalMonsterを作成し、Monsterクラスのattackメソッドをnormal_attackメソッドに改名してprotectedメソッドにします。{Javaの場合、attackメソッドをabstractメソッドとして定義します。}次にNormalMonsterクラスのattackメソッドを、Monsterクラスのnormal_attackメソッドを呼び出すだけの処理で実装します。最後にメッセージ表示プログラムを、3.と同じ制約で書き換えて、2.と同じ表示を行うようにしてください。 5. 4.のプログラムを、「スケルトンは殴りかかってきた」というメッセージと「ドラゴンは炎を吹いた」というメッセージを半々の割合で表示するように書き換えてください。ただし、修正していいのはMonsterクラスの派生クラスをnewしている部分のみです。{Javaの場合さらに、変数の型はMonsterのままにしてください。} たぶんこれで基礎の基礎は実感できると思います。 ……しかし、「オブジェクト指向での教科書的な仕様」で「すべてがオブジェクト指向」だから「Javaを勉強することはオブジェクト指向を勉強することになる」ですか……。

viajarse
質問者

お礼

質問と回答がずれているのですが……。 例えば、普通のプログラム言語では「入力した文字を表示するだけのプログラム」や「合計を求めるプログラム」などのような課題から学習していきますよね。 それでは、クラスの概念を用いたプログラムはどんな課題から学習していくものなのかという素朴な疑問をしただけです。 「クラスってこういうふうに使うものなのか」がわかればいい程度で、 実際に実用的な何かを作りたいというわけではありません。

回答No.3

>RPGツクールVXの中にRGSS2という機能があるわけではありません。 と言うことはRPGツクール(ランタイム)なしでRGSS2単体のランタイムがあると言うことですか? >RGSS2は通常のプログラム言語と同等の機能を有しています。 RGSSはRubyをベースにしているみたいですね。 で http://ja.wikipedia.org/wiki/RGSS を見てみると >初心者にはエラーが起きても原因が分かりにくい。 ってあるけどまともなデバッガはあるのか? まともにプログラミングを勉強するならデバッガは重要。 それとJavaを奨めたのはJavaがオブジェクト指向での教科書的な仕様だから。 オブジェクト指向の事をクラスって言うあたり質問者の素人さの現れですけど そんな人が中途半端な物で勉強するよりしっかりとしたもので勉強した方がいいため。 >クラスを使用したプログラムを勉強したいのですが、 >どんなプログラムを作る練習をすればいいのでしょうか? Javaはすべてがオブジェクト指向だからJavaを勉強することはオブジェクト指向を勉強することになる。

回答No.2

>「どんな言語がいいか」ということではなく、 >「どんなプログラムを作る練習をすればいいか」ということをお願いします。 マイナーな言語では資料もするないしメジャーな資料が豊富な言語で勉強して それから好きな言語でやった方がいいよ。 それと >どんなプログラムを作る練習をすればいいか っていうけどRPGツクールVXではRPGツクールVXの制限内のことしかできないでしょ。 だったらまずはオブジェクト指向の勉強をしっかりやるべき。 そのためにオブジェクト指向の勉強も向いているJavaってわけ。

viajarse
質問者

お礼

>っていうけどRPGツクールVXではRPGツクールVXの制限内のことしかできないでしょ。 いや、結構普通のプログラム言語と同等のことができますが……。

viajarse
質問者

補足

RPGツクールVXの中にRGSS2という機能があるわけではありません。 RGSS2は通常のプログラム言語と同等の機能を有しています。

回答No.1

オブジェクト指向を勉強するならJavaが一番いいでしょう。

viajarse
質問者

お礼

「どんな言語がいいか」ということではなく、 「どんなプログラムを作る練習をすればいいか」ということをお願いします。

関連するQ&A

専門家に質問してみよう