現在C++の練習のため、Dixq様の龍神録のプログラムをC++で書いています
現在11章の敵を呼び出すところまで実装したのですが、このような書き方でよいのか、おかしいところはないのか、もっとこうしたほうがいいというような組み方はないのか等、疑問がつきません
しかし、身近にはプログラムのわかる人がいないので推敲および訂正していただきたく投稿させていただきました
また、ファイルを添付するのが初めてなので、うまくいっていないかもしれません そのときは申し訳ございません 画像、csvファイルの二次配布はよくないと思ったので龍神録のサイトから引っ張ってきていただけるとうれしいです Dxライブラリは添付するとサイズが大きくなるので、添付しておりません
何卒よろしくお願いいたします
龍神録を参考にしたC++プログラムの推敲
Re: 龍神録を参考にしたC++プログラムの推敲
ヘッダファイルを中心に見ましたが、
・変数名がわかりづらい
・変数の数に対してクラスが少ない
というのが第一印象です。
ヘッダファイルは名刺・自己紹介ですので、パッと見て理解できないようでは困ります。
例えば、Playerクラスの m_slow_flag ですが、
Playerクラスに新しくメンバ関数を追加して、 m_slow_flag を利用するとしましょう。
m_slow_flag が true のときに遅いのか逆なのか曖昧な感じです。
実装を見ないといけなくなるようだと、クラスが大きくなればなるほど労力が大きくなって辛いです。
なので、こういう場合は、 is_slow とかがオススメです。下記のように英語っぽく読めます。 それと、クラスが少ないですね。まとめられる物はまとめないと読みづらいです。
例えば、x,yの位置情報をまとめて、位置クラスにするとか。
それに、enemyの実装を見てみたのですが、enemyクラス1つで敵全員の情報を扱っているように見えました。
この推測が当たっているとしたら、オブジェクト指向的には間違ったやり方です。
基本的に、クラスを書いたらそれは1つの物として実装します。
今回で言えば Enemyクラスのインスタンスは1体の敵と対応しなければなりません。
例えばEnemyクラスのRunメソッドは1体の敵に動くように指示するメソッドとして実装します。
このEnemyクラスを配列やコレクションで扱うことによって、敵全体を扱うという方法に直すべきです。
・変数名がわかりづらい
・変数の数に対してクラスが少ない
というのが第一印象です。
ヘッダファイルは名刺・自己紹介ですので、パッと見て理解できないようでは困ります。
例えば、Playerクラスの m_slow_flag ですが、
Playerクラスに新しくメンバ関数を追加して、 m_slow_flag を利用するとしましょう。
m_slow_flag が true のときに遅いのか逆なのか曖昧な感じです。
実装を見ないといけなくなるようだと、クラスが大きくなればなるほど労力が大きくなって辛いです。
なので、こういう場合は、 is_slow とかがオススメです。下記のように英語っぽく読めます。 それと、クラスが少ないですね。まとめられる物はまとめないと読みづらいです。
例えば、x,yの位置情報をまとめて、位置クラスにするとか。
それに、enemyの実装を見てみたのですが、enemyクラス1つで敵全員の情報を扱っているように見えました。
この推測が当たっているとしたら、オブジェクト指向的には間違ったやり方です。
基本的に、クラスを書いたらそれは1つの物として実装します。
今回で言えば Enemyクラスのインスタンスは1体の敵と対応しなければなりません。
例えばEnemyクラスのRunメソッドは1体の敵に動くように指示するメソッドとして実装します。
このEnemyクラスを配列やコレクションで扱うことによって、敵全体を扱うという方法に直すべきです。
Re: 龍神録を参考にしたC++プログラムの推敲
hide様、ご回答ありがとうございます
それとも、プレイヤーや敵の座標の値をそれぞれのクラスとは別に保存してあるクラスを作るということでしょうか?
確かにまとめた方が自機狙いを作るとき等、楽になりそうなので参考にさせていただきます
初めはそうしていたのですが、書いていくうちにどちらが正しい書き方なのか分からなくなり、今回の書き方にしました 自分の今回の一番の疑問点だったので有難い限りです
上にあげた2点ほどまたお時間あれば教えていただけると非常に嬉しいです 何卒よろしくお願いいたします
また、その他気になる点をまた見つけたときは教えてもらえると非常に助かります
改めましてご回答ありがとうございました
確かにその方が分かりやすいですね これからはそうするようにしようと思います例えば、Playerクラスの m_slow_flag ですが、
Playerクラスに新しくメンバ関数を追加して、 m_slow_flag を利用するとしましょう。
m_slow_flag が true のときに遅いのか逆なのか曖昧な感じです。
実装を見ないといけなくなるようだと、クラスが大きくなればなるほど労力が大きくなって辛いです。
なので、こういう場合は、 is_slow とかがオススメです。下記のように英語っぽく読めます。
これは、プレイヤーや敵に座標を持たせず、別のクラスで管理した方がいいということでしょうか?それと、クラスが少ないですね。まとめられる物はまとめないと読みづらいです。
例えば、x,yの位置情報をまとめて、位置クラスにするとか。
それとも、プレイヤーや敵の座標の値をそれぞれのクラスとは別に保存してあるクラスを作るということでしょうか?
確かにまとめた方が自機狙いを作るとき等、楽になりそうなので参考にさせていただきます
ということは、敵一体分の処理をする関数をRun関数というようにまとめ、それをforループなどで各敵分回すという考え方で良いのでしょうか?それに、enemyの実装を見てみたのですが、enemyクラス1つで敵全員の情報を扱っているように見えました。
この推測が当たっているとしたら、オブジェクト指向的には間違ったやり方です。
基本的に、クラスを書いたらそれは1つの物として実装します。
今回で言えば Enemyクラスのインスタンスは1体の敵と対応しなければなりません。
例えばEnemyクラスのRunメソッドは1体の敵に動くように指示するメソッドとして実装します。
このEnemyクラスを配列やコレクションで扱うことによって、敵全体を扱うという方法に直すべきです。
初めはそうしていたのですが、書いていくうちにどちらが正しい書き方なのか分からなくなり、今回の書き方にしました 自分の今回の一番の疑問点だったので有難い限りです
上にあげた2点ほどまたお時間あれば教えていただけると非常に嬉しいです 何卒よろしくお願いいたします
また、その他気になる点をまた見つけたときは教えてもらえると非常に助かります
改めましてご回答ありがとうございました
Re: 龍神録を参考にしたC++プログラムの推敲
直接int型のx,yで持たせずに、Pointクラスにしてプレイヤー、敵のpriavteなメンバにそれぞれ持たせましょうこれは、プレイヤーや敵に座標を持たせず、別のクラスで管理した方がいいということでしょうか?
それとも、プレイヤーや敵の座標の値をそれぞれのクラスとは別に保存してあるクラスを作るということでしょうか?
確かにまとめた方が自機狙いを作るとき等、楽になりそうなので参考にさせていただきます
という話ですね。
たとえばあとから、「キャラクターの座標をintではなくdoubleで管理したい」となったときに、
今のやり方だと全クラスを見て修正して回ることになります。
ですが、Pointクラスみたいな感じにしておけば、Pointクラスの実装を直せばそれだけで全キャラクター修正できることになるのです。
それで間違いないです。ということは、敵一体分の処理をする関数をRun関数というようにまとめ、それをforループなどで各敵分回すという考え方で良いのでしょうか?
敵一体分を処理する、というよりかは自身の情報を更新する。というイメージで作ってください。
クラスは、自身の情報をメンバに持っておいて基本滝に自分の情報だけが参照できる状態にするのが良いです。(カプセル化)
このやり方にすると、一時的にマスゲーム的な集団行動動作を実装しづらく感じるかもしれませんがメリットも大きいはずです。
とりあえずのところクラスを書くならば目指すべきはこういう形です。
http://dixq.net/Android/s02_02.html
Re: 龍神録を参考にしたC++プログラムの推敲
hide様、再びご回答ありがとうございます
クラスに出来そうなところを探して実践してみようと思います
おかげさまでこれからの章を作っていくとき正しい作り方で作っていくことが出来そうです
改めましてご回答ありがとうございました
なるほど理解しました 確かにその方が修正時等、楽そうです直接int型のx,yで持たせずに、Pointクラスにしてプレイヤー、敵のpriavteなメンバにそれぞれ持たせましょう
という話ですね。
クラスに出来そうなところを探して実践してみようと思います
ありがとうございました今回一番の疑問が解決いたしましたそれで間違いないです。
敵一体分を処理する、というよりかは自身の情報を更新する。というイメージで作ってください。
クラスは、自身の情報をメンバに持っておいて基本滝に自分の情報だけが参照できる状態にするのが良いです。
おかげさまでこれからの章を作っていくとき正しい作り方で作っていくことが出来そうです
改めましてご回答ありがとうございました