我有一个非常简单的应用程序,它包含一个ASP.NET前端站点,WCF Windows服务执行繁重的后端逻辑。
用户有一个简单的页面,他选择一些参数并按下“提交”按钮。该页面调用WCF服务并将参数传递给它。该服务实例化了一个'Job'类的实例,将参数发送给构造函数,然后调用'Run()'方法完成所有工作 - 将'job'记录插入到具有用户名,时间的数据库中启动等...向第三方供应商发出请求,获取数据,将数据放入数据库,执行其他业务逻辑,然后将作业标记为已完成。
然后,用户可以在第二个简单页面中搜索他的作业(按日期排序的可搜索组合框,显示与该作业相关的多个字段),然后在屏幕上显示与该作业对应的数据 - (作业表中的大多数字段,例如,开始时间,完成时间,状态等,在面板中显示为标签)以及我们从第三方供应商提取的实际数据(在面板下方呈现为网格)。 / p>
现在我的问题 - 所以我有一个Job类,它包含上面提到的所有字段,以及它的公共Run()方法和构造函数。它有一些简单的私有函数,以及几个私有成员,它们是IParser,IVendorConnection,IDataAccess等类的接口 - 完成上述所有实际工作的类..实际的Job类和Run()方法做得不多实际工作,几乎只是委托工作到它的复合对象(在其他方面提供良好的可测试性)。
现在,这个Job类有3种不同的使用/状态。它的主要用途是在Service中,使用Run()函数来实际运行作业。它还有另外两个用途 - 作为我上面描述的面板的模型,并充当我上面描述的组合框的模型。工作类有3个公共构造函数,每个构造函数为3个状态中的一个设置它。在所有情况下,每个不同的“国家”只关心其他两个州不关心的某些成员 - 在某些情况下,某些成员在所有3个州都使用。 “组合框状态”是最简单的 - 在这种情况下,我只需要3个只读字段。在“面板状态”中,我关心6个只读字段..在“工作”状态下,我基本上在工作进展时创建这些字段值 - 并且它们都应该是私有的。
我只是想找一个更干净的方法来做这件事。如果我在状态A中实例化一个Job类,我知道访问成员X将无法工作,或者调用函数Y将失败。但它仍然是可编译的代码。
我确信其他人之前都遇到过这个问题。我想将一个基本的Job类标记为MustInherit / abstract,然后有3个派生类,每个状态一个。将共享成员放在基础中,将特定于状态的成员放在派生中,并在适当的时候使用我的代码中的派生类。这对我的目的来说似乎很简单并且解决了我的问题。也许我也可以拥有某种JobFactory ......我想我只是在寻找其他人如何解决这个问题,因为我可能不会在盒子外思考...我之前有很多课程都是状态机业余爱好者游戏开发日 - 但这是不同的,因为这些类的实例可以改变状态(例如,'敌人'类可以将其状态从'attack_mode'更改为'等待')在我的情况下,没有变化的状态 - 一旦创建,作业必须保持其状态,并且永远不要尝试在不同的行为中表现。如果在不处于给定状态时使用方法/成员,则跟踪状态并抛出异常似乎很脆弱且工作量太大。基于你以前如何解决这个问题的任何建议?而我正在努力做过度杀戮?如果工作开始变得越来越多不同的状态,我认为不会 - 但也许如果它确实得到了许多不同的状态,那么我需要考虑将它分成不同的类别......只需要寻找你的2美分。
答案 0 :(得分:1)
您创建具有3个派生类的单个基类作业的想法听起来就像我将要做的那样。创建JabFactory可能会进一步帮助这种设计。在某些情况下创建一个对象的某些部分未使用或非法使用可能是不好的做法。因此,仅使用必要部件创建派生类显然是更好的设计。这不是矫枉过正。