非常に複雑なプログラム フローがあり、さまざまな可能性があります。これを正しくプログラミングするにはどうすればよいですか?これを適切な C# コードに変換する標準化された方法はありますか? 適切とは、if/else/goto ステートメントでいっぱいの 1 つの巨大なメソッドではないことを意味します。
これは常に何らかの if/else 構造になりますか、それともステート マシン/オートマトンを利用できますか? ここから始める方法がわかりません。
非常に複雑なプログラム フローがあり、さまざまな可能性があります。これを正しくプログラミングするにはどうすればよいですか?これを適切な C# コードに変換する標準化された方法はありますか? 適切とは、if/else/goto ステートメントでいっぱいの 1 つの巨大なメソッドではないことを意味します。
これは常に何らかの if/else 構造になりますか、それともステート マシン/オートマトンを利用できますか? ここから始める方法がわかりません。
あなたはこれを複雑にしすぎています。
ダイアグラム内のノードの多くは同じ機能であることに注意してください。簡単な分析の後、次のようなインターフェイスを持ついくつかのクラスが必要です
// This is your credentials type
class Credentials : ICredentials
{
static ICredentials Load();
static void Save(ICredentials credentials, IPin pin);
static void Delete(ICredentials credentials);
bool Validate();
bool CheckPin(IPin pin);
}
class Pin : IPin
{
static IPin Validate(string pin);
}
static class Internet
{
static bool Available { get; }
}
残りの作業と大部分の作業には、GUI の実装が含まれます。
さらに
「Credentials Still Valid?」というメッセージが表示されることに注意してください。「いいえ」を選択すると、「認証情報を要求する」にフィードバックされます。PIN なしで新しい資格情報を作成するのは意味がありません。
これに対するワークフロー ソリューションを検討することをお勧めします。学習曲線は急ですが、習得すれば、このような複雑なフローを簡単に管理できます。
コンソールの廃止: コンソールではなく Windows ワークフローと winforms を使用したシンプルなアプリ
そのため、デザイナーでワークフローを作成します。ワークフローに供給され、ワークフローから期待されるすべての入力引数と出力引数を制御します。コンソール アプリまたは任意のアプリからワークフローを起動します。ワークフロー内では、アクティビティは、共有したフロー イメージとまったく同じにすることができます。
個人的にはワークフローの基礎に追いつくのに苦労しましたが、私が取り組んでいるシステムはワークフローのアプローチなしでは維持できず、約 1 週間のチュートリアルで習得できてよかったです。
また、言うまでもなく、ワークフロー基盤はすべてのソフトウェアのソリューションではありません。実際、適切に使用されなかったり、よく考えられたアーキテクチャがなければ、設計が複雑になり、回復できない可能性があります。
@Bas Brekelmans、私はあなたの流れを見て、ワークフロー財団があなたを助けることができるとすぐに知りました. できる限りお手伝いします。
幸運を
コード全体は、常にすべての条件 (if/else) ロジックを表現します。しかし、あなたがしたいのは、これらの質問をすべて 1 つの大きなブロックで扱うのではなく、個別に処理することです。
たとえば、PIN 番号が有効かどうかの問題は、PIN 番号を検証するクラスの責任です。PIN が有効であることが判明した後にどの画面に移動するかという問題は、ナビゲーションに関連するクラスの責任である可能性があります。
したがって、これを構造化する簡単な方法の 1 つは次のようになります。
ビジネス ロジックに関連するいくつかのクラス:
GUI を構成するいくつかの Screen クラス。
ビジネス オブジェクトの状態に基づいて、表示する画面を選択する役割を持つ Navigator クラス。これがあなたの「ステートマシン」です。大きなスイッチや if ステートメントが含まれている可能性がありますが、アプリ全体のすべてのロジックを実行しているわけではなく、画面間を移動しているだけなので、世界で最悪のことではありません。
または、この単一の「ナビゲーター」のアイデアが気に入らない場合は、その画面に必要なビジネス オブジェクトのみを認識し、その画面からのナビゲーションのみを担当する ViewModel を各画面に与えることができます。このようにして、ステート マシンの動作が異なるクラス間で分散されます。