我現在玩的想法是擁有一個多級分析對象的「層級」系統,該系統對一個通用對象執行特定計算,然後根據其結果創建一組新的分析對象。新創建的分析對象將自行運行並可選擇創建更多分析對象,等等。問題的關鍵是孩子的分析對象將始終在創建它們的對象之後執行,這是相對重要的。整個設備將被單線程調用,所以我現在不關心線程安全性。只要滿足一定的基本條件,我並不認爲這是一個不穩定的設計,但我仍然對它有點不安。帶分析小工具的分層設計 - 此代碼是否有氣味?
這是一些嚴重的代碼味道,還是應該繼續實施它?有沒有更好的辦法?
下面是一個簡單的實現:
namespace WidgetTier
{
public class Widget
{
private string _name;
public string Name
{
get { return _name; }
}
private TierManager _tm;
private static readonly Random random = new Random();
static Widget()
{
}
public Widget(string name, TierManager tm)
{
_name = name;
_tm = tm;
}
public void DoMyThing()
{
if (random.Next(1000) > 1)
{
_tm.Add();
}
}
}
//NOT thread-safe!
public class TierManager
{
private Dictionary<int, List<Widget>> _tiers;
private int _tierCount = 0;
private int _currentTier = -1;
private int _childCount = 0;
public TierManager()
{
_tiers = new Dictionary<int, List<Widget>>();
}
public void Add()
{
if (_currentTier + 1 >= _tierCount)
{
_tierCount++;
_tiers.Add(_currentTier + 1, new List<Widget>());
}
_tiers[_currentTier + 1].Add(new Widget(string.Format("({0})", _childCount), this));
_childCount++;
}
//Dangerous?
public void Sweep()
{
_currentTier = 0;
while (_currentTier < _tierCount) //_tierCount will start at 1 but keep increasing because child objects will keep adding more tiers.
{
foreach (Widget w in _tiers[_currentTier])
{
w.DoMyThing();
}
_currentTier++;
}
}
public void PrintAll()
{
for (int t = 0; t < _tierCount; t++)
{
Console.Write("Tier #{0}: ", t);
foreach (Widget w in _tiers[t])
{
Console.Write(w.Name + " ");
}
Console.WriteLine();
}
}
}
class Program
{
static void Main(string[] args)
{
TierManager tm = new TierManager();
for (int c = 0; c < 10; c++)
{
tm.Add(); //create base widgets;
}
tm.Sweep();
tm.PrintAll();
Console.ReadLine();
}
}
}
'_tiers'作爲其正在迭代不會改變;每次調用'Widget.DoMyThing()'都會向* next * teir添加一個'Widget'。 – Randolpho 2010-03-29 21:36:44