2014-02-12 30 views
1

我有一个应用程序,它允许用户输入操作(25分钟时间块)。我正在使用Ruby on Rails,但现在我只是试图用Cucumber来描述我想要的行为。行动vs PlannedActions:我需要一个新的资源吗?

很长一段时间,我只允许用户为这个时间块创建一个Action(一个Action总是要在半个小时内开始)。

但是,现在我想添加计划操作。唯一的区别是状态(不完整),它需要一个日期(计划在哪一天)而不是日期时间。然后,用户可以选择创建新的NOW Action或PLANNED Action(从当天的可用计划操作中选择)。

这是我需要创建一个新资源的情况吗?更一般地说,我如何知道是否需要添加新模型,新控制器还是两者都不需要?

感谢您的帮助!

回答

0

把一切关于面向对象的设计放在一篇文章中真的很难,但我可以试试。

很久以前,有人向我解释是这样的:

类是所有有关的行为。每次添加一些愚蠢的字段时,您都无法定义新的类或子类。你应该以懒惰和常识(大部分)为指导。所以,如果你告诉我Sun是Circle的一个子类...我不想生活在这样的世界里。

基本上,你需要考虑你的模型的行为。在Rails中,他们遵循active record pattern。它们结合了数据存储和业务逻辑的特点。因此,如果计划行动与简单行动之间存在很大差异(不是以数据的方式,而是以不同的行为方式,处理方式等等),那么您需要一个新的模型。

控制器本身从资源到资源非常相似,我们中的一些人使用像Inherited Resources这样的宝石来编写更少的代码。通常,您的应用程序中有各种资源的控制器。

我希望它能回答你的问题。至少有一点。

更新

让我们围绕您的示例(Actions/Planned Actions)跳舞。 您已经添加了status字段,并用date替换了datetime(它实际上几乎没有变化)。因此,您很有可能添加了新的特征 - status字段并跟踪当前的动作状态。我相信随着他们的进步或其他事情,会有一些启动此类行动的逻辑。 这一方面可以开始,停止和跟踪正在进行的动作与简单的Action的特征完全不同。即使只有一个功能,其中一个方面的行为足以将该功能提取到一个单独的类中。

您可以将对象视为来自真实世界的对象投影。 Action是一个抽象的概念,并且您已经选择了它的一些特征来呈现在您的应用程序中(忽略其他所有内容)。

当你介绍PlannedAction时,你需要考虑你想要的特征。在某些情况下,PlannedAction可能只是Action(例如,您需要显示给定日期的所有操作的某种时间表)?

如果在某些情况下看到PlannedAction需要替代Action,则需要从Action继承PlannedAction。基类永远不会知道status字段等类似内容,但会为PlannedAction提供基本功能。

但是,如果PlannedAction是从一个简单的Action(不同的使用情况和行为)太不一样了,你可以考虑做PlannedAction一个单独的类,没有inhertance可言。

无数次尝试和失败后,你会发现自己感觉,例如,从CarMetalSlug很长的路要走,不应该从它继承。但CarTruck还不太远,他们可能有一个共同的父母 - Vehicle

+0

谢谢,这确实有所帮助。但是,如果没有大量的经验,我怎么能判断是否有很大的差异?例如,写一些行为,如果30%不同,那很大? – bluemihai

+0

更新了我的答案。以防万一你错过了。 – marvelousNinja