自分用メモ:メソッド内でメンバ変数を書き換えるときの悩みと神クラス
- kurisaka_konabe
- 5084
- 0
- 0
- 0
// 多用するけど、駄目な気がしてきた…副作用?的な意味で。引数でメンバを渡すべきなのかな?ってのが最近の悩み。HSP使ってた頃のgosubでグローバル変数書き換える文化と大差ない気が… void DoSomethingMethod(){ hoge_ = ....; }
2013-03-16 00:23:36@suibaka そうですね…パッといい例が思い付きませんが、「時間とともにhpが回復していく」とか。hp_ と回復量_ を引数で渡さないとテストも書き辛いんじゃなかろうかとか(書く習慣はない)悩んでいます。
2013-03-16 00:29:20@kurisaka_konabe ぐぬぅ、よくわからないです…。その例でいくなら回復量はまだしも hp を引数に渡してどうするんです?値渡しですよね?
2013-03-16 00:31:39@suibaka えーと、hpを弄らないといけないから参照渡しですね。メソッド内で「hp_ = ...;」ってメンバを書き換えちゃうのはあんまりお行儀が良くないのかなっていう。副作用言いたいだけなんじゃないか!という程度のノリというか、ある種の脅迫概念からというか。
2013-03-16 00:41:10@suibaka Playerクラスがあるとして、そのメンバメソッドです。自己回復(); で、自分のメンバ変数hp_を引数で渡さずに書き換えるメソッドってホントにいいのかな? っていう謎の脅迫概念に囚われてきています。
2013-03-16 00:47:38@kurisaka_konabe 自分のメンバ変数をどうやってメンバ関数に渡すんです?別のメンバ関数内からよびだすんです?とりあえず、自己回復って関数ならhpが変動するのは明らかだし副作用も何もない気がしますね
2013-03-16 00:49:23@suibaka PlayerクラスのパブリックなメソッドがUpdate()だとして、Update()内で呼ばれるprivateなメソッドに自己回復(hp_)って感じです。やはり気にしすぎですかね。アリガトです。
2013-03-16 01:07:55@kurisaka_konabe 気にしすぎですね。Updateなら変更が入るのは当たり前ですしおすし。でも似たようなことは思ったりするので気持ちは分かる気がします。
2013-03-16 01:09:55気にし過ぎであった。神クラス作ってしまうからメンバを弄るときに、あたかもグローバル変数を書き換えているような罪悪感を感じるのであった。
2013-03-16 01:12:59Update内で自動回復をしないのは別にありだとは思うけど、副作用って点で見るならそれは気にし過ぎな気がしてならないと感じましたまる
2013-03-16 01:13:20何処でどう悩んでいたのか忘れたので、最近のコードを久しぶりに開いたら、プレイヤクラスを頑張って分割して神クラス化を避けていた。で、分割したクラスにメンバを渡して仕事させていた。
2013-03-16 01:19:05@kurisaka_konabe そのあたりはUnityのGameObjectの構造が参考になります。というか今まで見たゲーム大体あーなってます
2013-03-16 01:31:44@waless_s 実際のゲームでもそうなっているんですか。なるほど勉強になります。最近意識的にあんな感じになるようにしています。神クラスばっか作って悩んでいましたが、Unityのゲームオブジェクトのコンポーネント指向は疎結合で管理しやすくていいなと。
2013-03-16 01:38:28