我的程序流程非常复杂,有很多不同的可能性。如何正确编程,是否有任何标准化的方法将其转换为体面的C#代码?体面的,我的意思不是一个充满if / else / goto语句的巨型方法。
这总是某种if / else结构还是我们可以使用状态机/自动机?我不知道如何开始这里。
答案 0 :(得分: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的实施。
<强>另外强>
请注意,&#34;凭据仍然有效?&#34; &#34;否&#34;选择应该反馈给#34; Ask For Credentials&#34;。没有别针创建新凭证没有意义。
答案 1 :(得分:1)
您可能需要考虑一个工作流程解决方案。他们的学习曲线陡峭,但一旦掌握,就可以轻松管理如此复杂的流程。
开沟控制台:Simple app using Windows Workflow and winforms NOT console
Next step would be passing parameters, I suppose.
因此,您可以在设计器中创建工作流程。控制将输入和输出工作流的所有输入和输出参数。您可以从控制台应用程序或任何应用程序启动工作流程在工作流程中,您的活动可能与您共享的流图像完全相同。
我个人很难赶上工作流基础,但我正在研究的系统无法在没有工作流方法的情况下维护,经过大约一周的教程后,我很高兴我学到了它。
毫无疑问,工作流基础并不是每个软件的解决方案。事实上,如果没有正确使用或没有经过深思熟虑的架构,它可能会使设计复杂化,而不是恢复。
@Bas Brekelmans,我看到了你的流程,我立即知道Workflow FOundation可以帮助你。我会尽我所能帮忙。
祝你好运
答案 2 :(得分:0)
您的代码作为一个整体将始终表达您拥有的所有条件(if / else)逻辑。但你想要做的是将这些问题分开处理,而不是一个大块。
例如,PIN号码是否有效的问题是验证PIN号码的类的责任。在PIN被发现有效之后进入哪个屏幕的问题可能是与导航有关的课程的责任。
因此,构建此方法的一种简单方法是:
许多与您的业务逻辑相关的课程:
构成GUI的许多屏幕类。
导航器类,负责根据业务对象的状态选择要显示的屏幕。所以 这是你的'状态机'。它可能有一个大型的开关 或者如果声明在其中,但它并没有完成你所有的逻辑 应用程序 - 只是在屏幕之间移动 - 所以这不是最糟糕的事情 世界。
或 如果你不喜欢这个单一的“导航器”想法,你可以给每个屏幕一个只知道业务的ViewModel 该屏幕所需的对象,并负责导航 仅从该屏幕。通过这种方式,你的国家的bahaviour 机器分布在不同的类之间。