把一切关于面向对象的设计放在一篇文章中真的很难,但我可以试试。
很久以前,有人向我解释是这样的:
类是所有有关的行为。每次添加一些愚蠢的字段时,您都无法定义新的类或子类。你应该以懒惰和常识(大部分)为指导。所以,如果你告诉我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可言。
无数次尝试和失败后,你会发现自己感觉,例如,从Car
有MetalSlug
很长的路要走,不应该从它继承。但Car
离Truck
还不太远,他们可能有一个共同的父母 - Vehicle
。
谢谢,这确实有所帮助。但是,如果没有大量的经验,我怎么能判断是否有很大的差异?例如,写一些行为,如果30%不同,那很大? – bluemihai
更新了我的答案。以防万一你错过了。 – marvelousNinja