5

你怎么能管理这样的事情?我尽我所能将子系统设计为可重用,但只有某些特定于站点的东西必须自定义(例如 Account 实体中的字段,或 orm 注释中的 cfc="")。

我曾想过使用 SVN 并扩展自定义,但我们发现它非常麻烦,因为提交人员每次都必须决定属于卡车或分支的增强/错误修复,一旦遗漏了什么,就不容易撤消。

那么......处理这种情况的最佳方法是什么?只需将一组代码克隆到一个新的源代码控制中,并修复两个/所有源代码控制上的错误?

4

2 回答 2

3

假设你没有使用某种 MVC 框架......但是......

我使用了几种不同的方法来处理这些情况。

根据 CFC 之间的差异和相同点,您可以:

1)使用继承

如果您的绝大多数代码是相同的,但每个项目只有一些差异,那么将通用代码重构为您为每个项目扩展的基本 CFC。这允许您为大多数功能维护一组测试,然后只需为每个项目偏离的代码添加进一步的测试。

这样做的缺点是在修改基类时需要一些计划和纪律来保持前向兼容性。本质上,您是在定义一个 API,而要做好这件事并不是一件容易的事。

2)使用混音

如果您似乎每次都在重复功能/逻辑,那么请尝试将该逻辑重构为您将其包含到任何需要它的 cfc 中的代码块。请参阅Ben 的 mixins 实验Sean 对 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>
于 2011-04-15T12:47:51.840 回答
1

在我看来,您正在尝试在两个站点之间重用代码,但代码存在细微差别。我知道这听起来说起来容易做起来难,但我认为你必须区分差异。因此,如果只有AccountsCFC 需要更改,则维护两个版本,每个站点一个。

然后你可以设置一些 CF 映射。然后,您可以为两个站点提供一组 CFC,另一个站点位于 下com.common.model,另一个站点位于com.mysite.modelcom.myothersite.model

这样你就可以避免在模型层中使用特定于站点的条件逻辑——这会很快变成一团糟。

希望有帮助。

于 2011-04-15T06:48:21.313 回答