2

我有一个非常简单的应用程序,它由一个 ASP.NET 前端站点组成,一个 WCF Windows 服务执行繁重的后端逻辑。

用户有一个简单的页面,他在其中选择一些参数并按下“提交”按钮。该页面调用 WCF 服务并将参数传递给它。该服务实例化了一个“Job”类的实例,将参数发送到构造函数,然后调用一个“Run()”方法,该方法完成所有工作 - 将一个“job”记录插入到具有用户名、时间的数据库中开始等... 向第 3 方供应商发出请求,获取数据,将其放入数据库,执行一些其他业务逻辑,然后将作业标记为已完成。

然后用户有第二个简单的页面,他现在可以在其中搜索他的工作(按日期排序的可搜索组合框,显示与该工作相关的多个字段),然后在屏幕上显示与该工作相对应的数据 - (大部分工作表中的字段,例如开始时间、完成时间、状态等,在面板中显示为标签)和我们从第三方供应商那里提取的实际数据(呈现为网格,在面板下方)。

现在谈谈我的问题 - 所以我有一个 Job 类,它包含上面提到的所有字段,以及它的公共 Run() 方法和构造函数。它有一些简单的私有函数和几个私有成员,它们是 IParser、IVendorConnection、IDataAccess 等类的接口——这些类完成上述所有实际工作。实际的 Job 类和 Run() 方法并没有做太多实际工作,几乎只是将工作委托给它的复合对象(在其他方面具有良好的可测试性)。

现在,这个 Job 类有 3 种不同的可能用途/状态。它的主要用途是在服务内部,用于使用 Run() 函数从字面上运行作业。它还有 2 个其他用途——作为我上面描述的面板的模型,以及作为我上面描述的组合框的模型。作业类有 3 个公共构造函数,每个构造函数都为 3 个状态之一设置它。在所有情况下,每个不同的“州”只关心其他 2 个州不关心的某些成员 - 在某些情况下,一些成员在所有 3 个州中都使用。“组合框状态”是最简单的——在这种情况下,我只需要 3 个只读字段。在“面板状态”中,我关心 6 个只读字段。在“工作”状态下,我基本上是在工作进行时创建这些字段值——它们都应该是私有的。

我只是在寻找一种更清洁的方法来做到这一点。如果我在状态 A 中实例化一个 Job 类,我知道访问成员 X 将不起作用,或者调用函数 Y 将失败。但是它仍然是可编译的代码。

我敢肯定,其他人以前也遇到过这个问题。我想有一个标记为 MustInherit/abstract 的基本 Job 类,然后有 3 个派生类,每个状态一个。将共享成员放在基类中,将特定于状态的成员放在派生类中,并在我的代码中适当地使用派生类。这对于我的目的来说似乎很简单,并且解决了我的问题。也许我也可以拥有某种 JobFactory ......我想我只是在寻找其他人如何解决这个问题,因为也许我没有足够的开箱即用......我之前有很多类是状态机爱好者游戏开发日 - 但那是不同的,因为这些类的实例可能会改变状态(例如,“敌人”类的状态可能会从“攻击模式”变为“等待”)在我的情况下,没有变化的状态 - 一旦创建,作业必须保持其状态,并且永远不会尝试以不同的状态表现。如果在未处于给定状态时使用方法/成员,则跟踪状态并引发异常似乎很脆弱且工作量太大。基于您之前如何解决此问题的任何建议?我想要做的是过度杀伤吗?如果 Job 开始获得越来越多的不同状态,我认为不会 - 但也许如果它确实获得了这么多不同的状态,那么我无论如何都需要考虑将它分成不同的类别......只是寻找你的 2 美分。基于您之前如何解决此问题的任何建议?我想要做的是过度杀伤吗?如果 Job 开始获得越来越多的不同状态,我认为不会 - 但也许如果它确实获得了这么多不同的状态,那么我无论如何都需要考虑将它分成不同的类别......只是寻找你的 2 美分。基于您之前如何解决此问题的任何建议?我想要做的是过度杀伤吗?如果 Job 开始获得越来越多的不同状态,我认为不会 - 但也许如果它确实获得了这么多不同的状态,那么我无论如何都需要考虑将它分成不同的类别......只是寻找你的 2 美分。

4

1 回答 1

1

您创建具有 3 个派生类的单个基类作业的想法听起来与我也会做的完全一样。创建 JabFactory 可能会进一步帮助此设计。创建一个对象的某些部分未使用或在某些情况下非法使用的对象可能是不好的做法。所以创建只包含必要部分的派生类显然是更好的设计。这不是矫枉过正。

于 2009-11-30T03:44:06.027 回答