自分用メモ:メソッド内でメンバ変数を書き換えるときの悩みと神クラス

極めて私的な自分の悩みと頂いたアドバイスなど メンバ変数書き換えるときは、メンバを引数で渡すべきか? などという謎の悩みに囚われる
0
栗坂こなべ @kurisaka_konabe

// 多用するけど、駄目な気がしてきた…副作用?的な意味で。引数でメンバを渡すべきなのかな?ってのが最近の悩み。HSP使ってた頃のgosubでグローバル変数書き換える文化と大差ない気が… void DoSomethingMethod(){  hoge_ = ....; }

2013-03-16 00:23:36
栗坂こなべ @kurisaka_konabe

神クラス作んなって話な気がする。もっと小さな粒度でクラスを。

2013-03-16 00:24:27
suibaka @suibaka

@kurisaka_konabe DoSomethingMethodが何する関数なのかよくわかってないので教えてもらえますか

2013-03-16 00:24:43
suibaka @suibaka

クラスは疎結合のほうがそりゃやりやすいですね。分けられないものは分けられないけど。

2013-03-16 00:25:36
栗坂こなべ @kurisaka_konabe

@suibaka そうですね…パッといい例が思い付きませんが、「時間とともにhpが回復していく」とか。hp_ と回復量_ を引数で渡さないとテストも書き辛いんじゃなかろうかとか(書く習慣はない)悩んでいます。

2013-03-16 00:29:20
suibaka @suibaka

@kurisaka_konabe ぐぬぅ、よくわからないです…。その例でいくなら回復量はまだしも hp を引数に渡してどうするんです?値渡しですよね?

2013-03-16 00:31:39
suibaka @suibaka

理解力に乏しいのが悲しい

2013-03-16 00:32:01
suibaka @suibaka

そもそも DoSomethingMethod からクラスのメンバ変数は可視で変更可能なのか

2013-03-16 00:32:56
栗坂こなべ @kurisaka_konabe

@suibaka えーと、hpを弄らないといけないから参照渡しですね。メソッド内で「hp_ = ...;」ってメンバを書き換えちゃうのはあんまりお行儀が良くないのかなっていう。副作用言いたいだけなんじゃないか!という程度のノリというか、ある種の脅迫概念からというか。

2013-03-16 00:41:10
suibaka @suibaka

@kurisaka_konabe あーなるほど。それは別に良くないですか?

2013-03-16 00:42:54
suibaka @suibaka

@kurisaka_konabe ちょっとまてよ、そのMethodってメンバ関数です?

2013-03-16 00:44:13
suibaka @suibaka

メンバ変数変更可能な時点でメンバ関数だと思うけど

2013-03-16 00:45:44
suibaka @suibaka

さすがにそれは副作用気にし過ぎな気もする

2013-03-16 00:47:36
栗坂こなべ @kurisaka_konabe

@suibaka Playerクラスがあるとして、そのメンバメソッドです。自己回復(); で、自分のメンバ変数hp_を引数で渡さずに書き換えるメソッドってホントにいいのかな? っていう謎の脅迫概念に囚われてきています。

2013-03-16 00:47:38
suibaka @suibaka

@kurisaka_konabe 自分のメンバ変数をどうやってメンバ関数に渡すんです?別のメンバ関数内からよびだすんです?とりあえず、自己回復って関数ならhpが変動するのは明らかだし副作用も何もない気がしますね

2013-03-16 00:49:23
栗坂こなべ @kurisaka_konabe

もしかして、○脅迫観念? ×脅迫概念

2013-03-16 00:49:48
栗坂こなべ @kurisaka_konabe

@suibaka PlayerクラスのパブリックなメソッドがUpdate()だとして、Update()内で呼ばれるprivateなメソッドに自己回復(hp_)って感じです。やはり気にしすぎですかね。アリガトです。

2013-03-16 01:07:55
suibaka @suibaka

@kurisaka_konabe 気にしすぎですね。Updateなら変更が入るのは当たり前ですしおすし。でも似たようなことは思ったりするので気持ちは分かる気がします。

2013-03-16 01:09:55
栗坂こなべ @kurisaka_konabe

気にし過ぎであった。神クラス作ってしまうからメンバを弄るときに、あたかもグローバル変数を書き換えているような罪悪感を感じるのであった。

2013-03-16 01:12:59
suibaka @suibaka

Update内で自動回復をしないのは別にありだとは思うけど、副作用って点で見るならそれは気にし過ぎな気がしてならないと感じましたまる

2013-03-16 01:13:20
suibaka @suibaka

それは神クラスが悪い

2013-03-16 01:14:11
suibaka @suibaka

どうしても気になるなら仕方なく関数にコメント書いとけばいいんでないでしょうか

2013-03-16 01:15:41
栗坂こなべ @kurisaka_konabe

何処でどう悩んでいたのか忘れたので、最近のコードを久しぶりに開いたら、プレイヤクラスを頑張って分割して神クラス化を避けていた。で、分割したクラスにメンバを渡して仕事させていた。

2013-03-16 01:19:05
waless @waless_s

@kurisaka_konabe そのあたりはUnityのGameObjectの構造が参考になります。というか今まで見たゲーム大体あーなってます

2013-03-16 01:31:44
栗坂こなべ @kurisaka_konabe

@waless_s 実際のゲームでもそうなっているんですか。なるほど勉強になります。最近意識的にあんな感じになるようにしています。神クラスばっか作って悩んでいましたが、Unityのゲームオブジェクトのコンポーネント指向は疎結合で管理しやすくていいなと。

2013-03-16 01:38:28