我有一个非常复杂的程序流程,有很多不同的可能性。如何正确编程,是否有任何标准化方法可以将其转换为体面的 C# 代码?体面的意思不是一种充满 if/else/goto 语句的巨大方法。
这总是某种 if/else 构造,还是我们可以使用状态机/自动机?我不知道如何从这里开始。
我有一个非常复杂的程序流程,有很多不同的可能性。如何正确编程,是否有任何标准化方法可以将其转换为体面的 C# 代码?体面的意思不是一种充满 if/else/goto 语句的巨大方法。
这总是某种 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。
此外
请注意“凭据仍然有效吗?” “否”选项应反馈给“要求凭据”。在没有 pin 的情况下创建新凭据是没有意义的。
您可能需要考虑对此的工作流解决方案。他们有一个陡峭的学习曲线,但一旦掌握,这样一个复杂的流程将很容易管理。
放弃控制台:使用 Windows 工作流和 winforms 的简单应用程序不是控制台
因此,您在设计器中创建了一个工作流。控制所有输入和输出参数,这些参数将被提供给工作流并从工作流中预期。您从控制台应用程序或任何应用程序启动工作流。在工作流程中,您的活动可以与您共享的流程图像完全相同。
我个人很难赶上工作流基础,但是如果没有工作流方法,我正在开发的系统就无法维护,经过大约一周的教程,我很高兴我学会了它。
不言而喻,工作流基础并不是所有软件的解决方案。事实上,如果使用不当或没有经过深思熟虑的架构,它可能会使设计复杂化,无法恢复。
@Bas Brekelmans,我看到了您的流程,我立即知道工作流程基金会可以为您提供帮助。我会尽我所能提供帮助。
祝你好运
您的代码作为一个整体将始终表达您拥有的所有条件(if/else)逻辑。但是你想要做的是将这些问题分开处理,而不是放在一个大块中。
例如,PIN 号码是否有效的问题是验证 PIN 号码的类的责任。在发现 PIN 有效后转到哪个屏幕的问题可能是与导航相关的类的责任。
因此,一种简单的结构化方法是:
一些与您的业务逻辑相关的类:
许多 Screen 类,构成您的 GUI。
一个 Navigator 类,它负责根据业务对象的状态选择要显示的屏幕。所以这是你的“状态机”。它可能有一个很大的 switch 或 if 语句,但它并没有完成整个应用程序中的所有逻辑——只是在屏幕之间移动——所以它不是世界上最糟糕的事情。
或者,如果您不喜欢这个单一的“导航器”想法,您可以为每个屏幕提供一个 ViewModel,它只知道该屏幕所需的业务对象,并且只负责从该屏幕导航。这样,您的状态机的行为就分布在不同的类之间。