はい、私は知っています、可変オブジェクトについてのさらに別の質問。一般的な背景についてはこれを、私の質問に最も近い類似物についてはこれを参照してください。(ただし、ここでは適用されないC ++固有の倍音がいくつかあります)
次の擬似コードが最良のインターフェース設計を表していると仮定しましょう。つまり、これはビジネスセマンティクス(現在の状態)をOOタイプに最も明確に表現したものです。当然のことながら、UglyDataとそれを使用して実行するタスクは、段階的に変更される可能性があります。
public class FriendlyWrapper
{
public FriendlyWrapper(UglyDatum u)
{
Foo = u.asdf[0].f[0].o.o;
Bar = u.barbarbar.ToDooDad();
Baz = u.uglyNameForBaz;
// etc
}
public Widget Foo { get; private set; }
public DooDad Bar { get; private set; }
public DooDad Baz { get; private set; }
// etc
public WhizBang Expensive1 { get; private set; }
public WhizBang Expensive2 { get; private set; }
public void Calculate()
{
Expensive1 = Calc(Foo, Bar);
Expensive2 = Calc(Foo, Baz);
}
private WhizBang Calc(Widget a, DooDad b) { /* stuff */ }
public override void ToString()
{
return string.Format("{0}{1}{2}{3}{4}", Foo, Bar, Baz, Expensive1 ?? "", Expensive2 ?? "");
}
}
// Consumer 1 is happy to work with just the basic wrapped properties
public string Summarize()
{
var myStuff = from u in data
where IsWhatIWant(u)
select new FriendlyWrapper(u);
var sb = new StringBuilder();
foreach (var s in myStuff)
{
sb.AppendLine(s.ToString());
}
return sb.ToString();
}
// Consumer 2's job is to take the performance hit up front. His callers might do things
// with expensive properties (eg bind one to a UI element) that should not take noticeable time.
public IEnumerable<FriendlyWrapper> FetchAllData(Predicate<UglyDatum> pred)
{
var myStuff = from u in data
where pred(u)
select new FriendlyWrapper(u);
foreach (var s in myStuff)
{
s.Calculate(); // as written, this doesn't do what you intend...
}
return myStuff;
}
ここでの最良のルートは何ですか?私が見ることができるオプション:
- 上記のように、明示的なCalculate()メソッドを使用した可変オブジェクト
- 高価な計算がゲッターで行われる(そしておそらくキャッシュされる)可変オブジェクト
- 一方が他方から継承する(またはおそらく構成する?)2つのオブジェクトに分割します
- 上にリンクされたC++の質問のように、ある種の静的+ロックメカニズム
私は自分自身で#2に傾いています。しかし、すべてのルートには潜在的な落とし穴があります。
#1または#2を選択した場合、可変性に対するConsumer2のループを明確で正しい方法でどのように実装しますか?
#1または#3を選択した場合、一部のプロパティのみを計算し、他のプロパティは計算したくない将来の状況をどのように処理しますか?N個のヘルパーメソッド/派生クラスを作成しますか?
#4を選んだら、あなたは頭がおかしいと思いますが、気軽に説明してください