0

我有一个非常复杂的程序流程,有很多不同的可能性。如何正确编程,是否有任何标准化方法可以将其转换为体面的 C# 代码?体面的意思不是一种充满 if/else/goto 语句的巨大方法。

这总是某种 if/else 构造,还是我们可以使用状态机/自动机?我不知道如何从这里开始。

流动

4

3 回答 3

3

你把这个复杂化了。

请注意,图中的许多节点具有相同的功能。快速分析后,您需要一些具有类似接口的类

// 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。


此外

请注意“凭据仍然有效吗?” “否”选项应反馈给“要求凭据”。在没有 pin 的情况下创建新凭据是没有意义的。

于 2013-09-10T10:11:50.187 回答
1

您可能需要考虑对此的工作流解决方案。他们有一个陡峭的学习曲线,但一旦掌握,这样一个复杂的流程将很容易管理。

基本设置

工作流程设计细节

放弃控制台:使用 Windows 工作流和 winforms 的简单应用程序不是控制台

我想下一步将是传递参数。

因此,您在设计器中创建了一个工作流。控制所有输入和输出参数,这些参数将被提供给工作流并从工作流中预期。您从控制台应用程序或任何应用程序启动工作流。在工作流程中,您的活动可以与您共享的流程图像完全相同。

我个人很难赶上工作流基础,但是如果没有工作流方法,我正在开发的系统就无法维护,经过大约一周的教程,我很高兴我学会了它。

不言而喻,工作流基础并不是所有软件的解决方案。事实上,如果使用不当或没有经过深思熟虑的架构,它可能会使设计复杂化,无法恢复。

@Bas Brekelmans,我看到了您的流程,我立即知道工作流程基金会可以为您提供帮助。我会尽我所能提供帮助。

祝你好运

于 2013-09-10T09:52:02.433 回答
0

您的代码作为一个整体将始终表达您拥有的所有条件(if/else)逻辑。但是你想要做的是将这些问题分开处理,而不是放在一个大块中。

例如,PIN 号码是否有效的问题是验证 PIN 号码的类的责任。在发现 PIN 有效后转到哪个屏幕的问题可能是与导航相关的类的责任。

因此,一种简单的结构化方法是:

  • 一些与您的业务逻辑相关的类:

    • 证书
    • 登录会话(负责计数尝试等)
    • 引脚验证器
    • 凭证验证器
    • PIN 复杂性要求检查器
    • 互联网
    • 凭证存储器
  • 许多 Screen 类,构成您的 GUI。

  • 一个 Navigator 类,它负责根据业务对象的状态选择要显示的屏幕。所以这是你的“状态机”。它可能有一个很大的 switch 或 if 语句,但它并没有完成整个应用程序中的所有逻辑——只是在屏幕之间移动——所以它不是世界上最糟糕的事情。

    或者,如果您不喜欢这个单一的“导航器”想法,您可以为每个屏幕提供一个 ViewModel,它只知道该屏幕所需的业务对象,并且只负责从该屏幕导航。这样,您的状态机的行为就分布在不同的类之间。

于 2013-09-10T11:01:39.253 回答