問題を解決するための有効なアプローチはたくさんあります。Basile Starynkevitchは、「官僚主義のない」アプローチを提案しました。これは、シンプルなインターフェイスを提供し、インターフェイスを適切に使用するプログラマーに依存しています。私はこのアプローチが好きですが、もう1つ、より多くのeingineeringがありますが、コンパイラーがいくつかのエラーをキャッチできるようにします。
お使いのデバイスをにすることができ、様々な状態を識別しUninitialised
、
Started
、Configured
のように。リストは有限でなければなりません。¹
各状態について、定義struct
など、その状態に必要な追加情報は、関連する保持DeviceUninitialised
、
DeviceStarted
そしてそうで。
DeviceStrategy
メソッドが入力および出力として定義された構造を使用する場合、すべての処理を1つのオブジェクトにパックします。したがって、DeviceStarted DeviceStrategy::start (DeviceUninitalised dev)
メソッド(またはプロジェクトの慣習に応じたもの)を使用できます。
このアプローチでは、有効なプログラムはメソッドプロトタイプによって強制されるシーケンスでいくつかのメソッドを呼び出す必要があります。
さまざまな状態は無関係なオブジェクトです。これは、置換の原則によるものです。これらの構造に共通の祖先を共有させることが有用な場合は、訪問者パターンを使用して、抽象クラスのインスタンスの具体的なタイプを回復できることを思い出してください。
3.独自のDeviceStrategy
クラスについて説明しましたが、提供する機能をいくつかのクラスに分割したい場合があります。
それらを要約すると、私が説明した設計の重要なポイントは次のとおりです。
置換の原則により、デバイスの状態を表すオブジェクトは区別され、特別な継承関係を持たないようにする必要があります。
各デバイスまたはデバイスの状態はそれ自体のみを表示し、戦略はそれらすべてを表示し、それらの間の可能な遷移を表現するように、デバイス自体を表すオブジェクトではなく、スターティジーオブジェクトにデバイス処理をパックします。
これらの行に続くtelnetクライアントの実装の説明を見たことがありますが、それを見つけることはできませんでした。それは非常に便利なリファレンスだったでしょう!
¹:このためには、直観に従うか、リレーション「method₁〜method₂iff」の実際の実装でメソッドの等価クラスを見つけます。同じオブジェクトでそれらを使用することは有効です」-デバイス上のすべてのトリートメントをカプセル化した大きなオブジェクトがあると仮定します。状態をリストする両方の方法は素晴らしい結果をもたらします。
discovery
かhandshake
?