web-dev-qa-db-ja.com

「マネージャー」クラスの懸念の分離

現在のアプリケーションの状態を「制御」するクラスApplicationStateManagerがあります。アプリケーションの可能な状態をリストするEnumがあります

enum ApplicationState
{ 
    Idle,
    Starting,
    Started,
    Stopping,
    Stopped
}

ApplicationStateManagerには次のようなメンバーが含まれます:

public static ApplicationState CurrentState = ApplicationState.Idle;

public static void ChangeCurrentState(ApplicationState newState)
{
      CurrentState = newState;
}

ApplicationStateManager.CurrentState;を使用してCurrentState静的フィールドをクエリし、これらの行に沿ってコード実行または何かを続行できるかどうかを確認できます。

ここで問題は、ApplicationStateChangerを使用して問題を分離しようとしていたことですが、問題は、CurrentState変数をどこに貼り付けるかです。

5
Joao Vitor

アプリケーションの動作がその状態に依存している場合、これは Finite State Machine として実装する可能性があることを明確に示しています。

これは State Pattern または Visitor Pattern を使用して実現できます。状態の数がより頻繁に変化する傾向がある場合は前者を使用し、状態の変化をトリガーできるイベントの数がより頻繁に変化する傾向がある場合は後者を使用する必要があります。

3
Vladimir Stokic

現在のアプリケーションの状態を「制御」するクラスApplicationStateManagerがあります。

アプリケーションは、その状態に責任を持つ唯一のものでなければなりません。これは、OOPと呼ばれる カプセル化 の基本的な特性です。OOP内のオブジェクトは、それ自体の状態を維持する責任があります。

ここで問題は、ApplicationStateChangerを使用して問題を分離しようとしていたことです

上記の理由により、そのようなクラスは存在しないはずです。アプリケーションはその状態を変更する責任があります。

しかし問題は、CurrentState変数をどこに固定するかです。

Vladimir Stokicによって提案されたように、Stateパターンを実装しようとすることができます。しかし、これはやり過ぎかもしれませんそれはあなたの状態変更ロジックが厳密にシーケンシャルであるように見えるからですしたがって、別のアプローチは、不変オブジェクトのセットを実装することです:

class Idle implements Application
{
    public function __construct()
    {
    }

    public function next()
    {
        return new Starting();
    }
}

class Starting implements Application
{
    public function __construct()
    {
    }

    public function next()
    {
        return new Started();
    }
}

状態パターンに関してすべての状態機能またはコンテキストに相互関係がある場合、同じコードを継承または Decoratorパターン のいずれかで実装できますが、私はあなたの詳細を知りません多くの詳細を掘り下げます。

2
Zapadlo

質問は、ApplicationStateChangerを使用して問題を分離しようとしていたのですが、問題は、CurrentState変数をどこに固定するかです。

提供されているコード例では、アプリの状態のゲッターとセッターのみを示しています。懸念事項について話し合うには、さらに詳細が必要です。

とりあえず、これらのごく一部の詳細で、状態のゲッター/セッターと、特定の状況に基づいてこれらの状態を変更するように指定された他の外部オブジェクトを持つApplicationクラスがいくつかあります。

0
Emerson Cardoso