web-dev-qa-db-ja.com

コードをビジネスロジックで分離する方法

2つのクラスを分離するのに苦労しています。

私は、インターフェイス(xamlで定義)を微調整するために使用するコード( "クラスA"と呼びます)を使用しています。

次に、ロジックのみのクラスBがあります。しかし、ロジックの実行中は、UIを更新する必要があります。

私の問題は、Bが機能を終了していないため、UIを更新するためにクラスBからAに「戻る」ことができないことです。また、AとBを結合するため、ビュー自体をBに変更することはできません。

いくつかのインターフェイスロジックを使用する必要があると思いますが、方法がわかりません。

例えば ​​:

Class A
{
     private void OnClickEvent()
     {
         var B = new(B);
         b.work();
     }

     private void UpdateUI()
     {
        ...
     }
}


Class B
{
    public void work()
    {
        while (...)
        {
             ...
             //Here, how to call A.UpdateUI() ?
             ...
        }
    }
}

よろしくお願いします!

3
Doctor

おそらくwork()を非同期で実行し、イベントを使用してUIの更新を引き起こす可能性のある変更を通知します。イベントの利点は、イベントソースがサブスクライバーについて何も知らないため、ビジネスロジック(B)をビュー(A)から切り離したままにできることです。

1
JacquesB

インターフェースを導入するだけです:

class A : BUpdateTarget
{
     private void OnClickEvent()
     {
         var B = new(B);
         b.work(this);
     }

     public void UpdateUI()
     {
        ...
     }
}


interface BUpdateTarget
{
    UpdateUI();
}

class B
{
    public void work(BUpdateTarget updateTarget)
    {
        while (...)
        {
             //...
             updateTarget.UpdateUI()
             //...
        }
    }
}
0
Euphoric

Bはいくつかのユーザーインターフェイスのロジックを表し、Aは同じユーザーインターフェイスの分離コードクラスを表すようです。

MVVMを使用できない場合は、BクラスにINotifyPropertyChangedインターフェースを実装して、クライアント(Aクラス)での変更を通知できるようにすることをお勧めしますその状態(たとえば、コレクション内の更新など)。変更が発生すると、Aに通知が送られ、必要な処理をすべて実行できます。

0
Emerson Cardoso