你怎么能管理这样的事情?我尽力将子系统设计为可重用的,但是只有某些必须自定义的站点特有的东西(例如,Account实体中的字段,或orm注释中的cfc =“”)。
我想过使用SVN并扩展自定义,但我们发现它非常麻烦,因为提交者每次都必须决定属于卡车或分支的增强/错误修复,一旦错过了什么,并不容易撤消。
那么......处理这种情况的最佳方法是什么?只需将代码集克隆到新的源代码控制中,并修复两个/所有源代码控件上的错误?
答案 0 :(得分:3)
假设您没有使用某种MVC框架......但是......
我使用了几种不同的方法来处理这些情况。
根据CFC之间的不同和相同之处,您可以:
如果您的绝大多数代码都相同,但每个项目只有一些差异,那么将公共代码重构为基础CFC,您可以为每个项目进行扩展。这允许您为大多数功能维护一组测试,然后只为每个项目的代码添加进一步的测试。
这样做的缺点是在修改基类时需要一些规划和纪律来保持向前兼容性。从本质上讲,您定义的是API,并且这样做并不是一件容易的事。
如果您似乎每次都重复的是功能/逻辑,那么请尝试将该逻辑重构为代码块,您可以将其包含在任何需要它的cfc中。请参阅Ben's experiments with mixins和Sean's comments on mixins。
可悲的是,与Ruby的模块不同,在CF中做得好的机制很弱。
如果您的需求与您在评论中描述的那样,“类似,逻辑/业务规则是相同的,但收集的输入和数据不一样”,我建议您查看Rails或Django灵感。
在我的情况下,我最终开发了一个框架,允许我在定义模型时扩展基础模型类,并简单地用一堆cfproperty标签填充它,其中定制属性定义了我的模型并被用于基本模型类和处理大多数业务逻辑的一组服务。这适用于95%的情况,在任何需要偏离框架逻辑的情况下,我会在模型cfc中添加其他函数,甚至覆盖基本模型的函数。
我的模特看起来像是:
<cfcomponent output="false" persistentLayer="GAE" persistentClass="asana" extends="com.bespokelogic.framework.BaseModel">
<cfproperty name="id" type="string" persistentDatatype="string" settable="true" gettable="true" required="true">
<cfproperty name="deckSet" type="string" persistentDatatype="string" settable="true" gettable="true" default="basic">
<cfproperty name="englishName" type="string" persistentDatatype="string" settable="true" gettable="true">
<cfproperty name="traditionalName" type="string" persistentDatatype="string" settable="true" gettable="true">
<cfproperty name="pronunciation" type="string" persistentDatatype="string" settable="true" gettable="true">
<cfproperty name="pronunciationNotes" type="string" persistentDatatype="string" settable="true" gettable="true">
<cfproperty name="description" type="string" persistentDatatype="string" settable="true" gettable="true">
<cfproperty name="type" type="string" persistentDatatype="string" settable="true" gettable="true">
<cfproperty name="anatomicalFocus" type="array" persistentDatatype="array" settable="true" gettable="true" default="#arrayNew(1)#">
<cfproperty name="therapeuticFocus" type="array" persistentDatatype="array" settable="true" gettable="true" default="#arrayNew(1)#">
<cfproperty name="benefits" type="string" persistentDatatype="string" settable="true" gettable="true">
<cfproperty name="variations" type="string" persistentDatatype="string" settable="true" gettable="true">
<cfproperty name="contraindications" type="array" persistentDatatype="array" settable="true" gettable="true" default="#arrayNew(1)#">
<cfproperty name="skill" type="string" persistentDatatype="string" settable="true" gettable="true">
<cfproperty name="instructions" type="string" persistentDatatype="string" settable="true" gettable="true">
<cfproperty name="skill" type="string" persistentDatatype="string" settable="true" gettable="true">
<cfproperty name="prelimAsana" type="asana" persistentDatatype="Key[]" settable="true" gettable="true" default="#arrayNew(1)#">
<cfproperty name="followupAsana" type="asana" persistentDatatype="Key[]" settable="true" gettable="true" default="#arrayNew(1)#">
<cfproperty name="thumbnailImage" type="string" persistentDatatype="string" settable="true" gettable="true">
<cfproperty name="primaryImage" type="string" persistentDatatype="string" settable="true" gettable="true">
<cfproperty name="images" type="array" persistentDatatype="array" settable="true" gettable="true" default="#arrayNew(1)#">
<cfproperty name="primaryVideo" type="string" persistentDatatype="string" settable="true" gettable="true">
<cfproperty name="videos" type="array" persistentDatatype="array" settable="true" gettable="true" default="#arrayNew(1)#">
</cfcomponent>
答案 1 :(得分:1)
在我看来,您尝试在两个站点之间重用代码,但代码存在细微差别。我知道这说起来容易做起来难,但我认为你必须将差异分开。因此,如果只有Accounts
CFC需要更改,则保留两个版本,每个站点一个。
然后您可以设置一些CF映射。然后,您可以为com.common.model
下的两个网站和com.mysite.model
下的另一个网站以及com.myothersite.model
下的另一个网站提供一组CFC。
这样就可以避免模型层中特定于站点的条件逻辑 - 这会很快变成一团糟。
希望有所帮助。