ご提示の状況を正しく解釈できてるか自信がないですが…
だいたい以下のような感じという認識であってますか??
(ご質問の際は書きかけでもいいので具体的なソースを載せていただいたほうが話が早いと思います)
C#
1//1のモデルとなるクラス
2public class SingleModel
3{
4 private readonly Dictionary<int, MultiModel> multiDic;
5
6 private readonly DateTime singleValue;
7
8 public SingleModel()
9 {
10 //共通で使いたい変数値(仮にDateTimeとする)
11 this.singleValue = DateTime.Now;
12
13 //何らかのキーでDictionaryにして保持?
14 this.multiDic = Enumerable.Range(1, 10)
15 .ToDictionary(n => n, n => new MultiModel(n));
16 }
17
18 public void CallDoSomething()
19 {
20 //多モデルオブジェクトすべてに対して関数呼び出し
21 foreach (var multi in multiDic.Values)
22 {
23 multi.DoSomething(this.singleValue);
24 }
25 }
26}
27
28//多のモデルとなるクラス
29public class MultiModel
30{
31 public MultiModel(int key)
32 {
33 }
34
35 public void DoSomething(DateTime date)
36 {
37 //何かする
38 ...
39
40 //何らかの条件で再帰したりする
41 //→再帰する度にDateTimeが生成されて無駄なのでは??
42 if (aCondition) DoSomething(date);
43 }
44}
そのうえで、「変数への参照を引数に渡せばいいのだ」というのは、
上記の MultiModel.DoSomething メソッドを
public void DoSomething(ref DateTime date)
という形にするという意味でおっしゃってますか?
もしそういう意味でしたら、個人的には賛成できません。
「多のモデルの関数の中でその設定値を用いた再帰を行う必要がある」というのは
多モデルクラスの内部実装の都合であって、
内部実装の都合によって外部からの呼び出しI/Fが決められてしまうのはスマートでないように思います。
特に「ref」は「引数で渡した値が変更されるかもしれないよ」ということを表現する目的で
使うのが一般的なので、コードの保守に際しては混乱の元にもなるかと思います。
どうしても参照で渡したければ、
- publicなDoSomethingメソッドで受け取った後に、そこからprivateな別メソッドを呼び出す際に
初めて引数をrefにする(そっちのprivateメソッドのほうで再帰する)
または
- その値のみをメンバに持つクラスを作成し、引数としてそのクラスのオブジェクトを渡す
(structでなくclassならば参照渡しになる)
C#
1public class SingleValue //実際の用途にあわせて意味のある名前をつける
2{
3 public DateTime Value { get; private set; }
4
5 public SingleValue(DateTime value)
6 {
7 this.Value = value;
8 }
9}
などの方法をとるほうが良いかなと思います。
ただ、多少再帰するからといって
パフォーマンスに影響するほどではないのでは?という気もします。
「予測するな、計測せよ」と言われるとおり、パフォーマンスについては
実際に動かしてみて初めて分かる部分も大きいです。
まずは素直な形で作って、動かしてみて、問題があれば初めて最適化を考えるでも良いかもしれません。
もっというと、不変な値なのであれば素直にコンストラクタで渡してしまっても良いようにも思いました。
「多のモデルのインスタンス変数にこの値を持たせるのは同じインスタンスのメンバ間では冗長」
という気持ちも確かにわかりますが、readonlyなメンバにしておけば整合が取れなくなる心配はありませんし、
オブジェクトの状態が安定するメリットのほうが大きいのではないかと思いました。
いろいろ書きましたが、正直にいうとケースバイケースです。
具体的な状況がわからない以上、あくまで「基本的にはこう考えます」程度の意見だと思ってください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/01/16 01:21