簡體   English   中英

這是什么設計模式?

[英]What design pattern does this?

很久以前我做過一次,當時我遵循了一個設計模式。 現在,我需要再做一次,我真的不記得我以前是怎么做的,也想不出幫助我做這件事的模式。

我有一個包含大量變量/屬性的類。 有些是基於其他計算的,並且這些屬性之間會進行各種交叉計算。

當我第一次實例化時一切都很好 - 所有的值和計算都很好。 我的問題是,當一個值發生變化時,我希望從中派生的所有計算值都能根據新值自動更新。 如果我不需要,我不想手動編寫每個單獨的重新計算 - 每當這個類被更新或添加時,它就會成為很多開銷,試圖追蹤你需要傳播任何更改的所有位置你在做。

我想你跟着我。

無論如何,誰能想到是什么模式使這成為可能? 我發誓我曾經知道它。 估計變老了。

// Like this...
class foo
{
    decimal A = 1233;
    decimal B = 42;

    decimal C = A / B; // I want this to update whenever
                       // the value of either A or B changes.
    decimal D = 123;
    decimal E = 321;

    decimal F = D + E; // I don't want this one to change when
                       // A or B or even C for that matter changes,
                       // and I don't wan to have to cycle through
                       // all of the calculated values that don't
                       // need to change just for find the few that do.
}

觀察員。 您需要在模型上使用某種.Subscribe()方法來注冊回調 - 在您的特定情況下,這些只是采用新值並基於該值重新計算其他一些值的函數。 只要你的編程環境有rxjs實現,我強烈建議堅持使用那個。 否則你會因為多線程和內存泄漏而受苦。

我建議避免在這里過度設計。 您作為示例提供的內容有 6 個成員,它們之間具有簡單的依賴關系,可以輕松地重新計算。 我確實理解這可能只是一個簡化的例子,所以讓我們的目標是例如 10-20 個成員,以及不需要數據庫查找或磁盤訪問的依賴項(作為較重的操作的一個例子)。

您可以將所有依賴項放入一個方法中(我們稱之為Update ),如果任何成員被修改,您將調用該方法。 為了不用擔心記得調用Update() ,您將所有成員移動到一個單獨的“狀態”類中:

class FooState
{
    private int _a;

    public int A
    {
        get { return _a; }
        set
        {
            _a = value;
            Update();
        }
    }

    private int _b;

    public int B
    {
        get { return _b; }
        set
        {
            _b = value;
            Update();
        }
    }

    public double C { get; private set; }

    // other members

    private void Update()
    {
        C = A * B + 3;
        // other updates
    }
}

class Foo
{
    private FooState _state;

    public Foo()
    {
        _state.A = 1;
        _state.B = 2;
        Debug.Write($"C = {_state.C}");
    }
}

你得到什么:

  • 發生了什么事情馬上就清楚了。 對於任何會碰巧修改此代碼的人。
  • 成員之間的所有依賴項都在一個方法中,易於閱讀,易於修改。 您的業​​務邏輯不會被這些細節污染。
  • 你不能忘記重新計算你的依賴成員。
  • 是的,您可以進行比嚴格要求更多的重新計算,因為即使不相關的成員被修改,您也會重新計算所有依賴成員。 在我在真實文件中看到的大多數類似案例中,這不是問題。
  • 如果您有循環依賴(這是另一回事),則此方法不起作用。

隨意實現“觀察者”模式並進行比較。

我不認為這種簡單的方法有名字。 不要將它與有點不同的“狀態”模式混淆。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM