2

我试图通过阅读 Matt Gifford 的书“ColdFusion 中的面向对象编程”来巩固我公认的 ColdFusion OOP 知识。我的 ColdFusion 知识有点落后;我精通 CFML,因为它适用于 ColdFusion 8,但对 9 和 10 中的新功能并没有太大的影响(它们在我的待办事项中,但我希望它们需要时间,我想要一个答案现在这一点)。我的公司最近将他们的服务器更新到 10 台,我们打算利用这些新特性和功能。

我的问题是基于书中掩盖的一些内容,当我在 Google 上进行搜索时,这导致我得到令人困惑和相互矛盾的答案。我对 CF8 中的 ORM 开发的理解(使用像 Transfer 这样的 ORM 框架,以及书籍示例和其他阅读材料)将 bean 的属性放在 variables.instance 范围内,以将对象属性与应用程序属性隔离开来变量范围。但是在 CF9 中使用内置的 ORM 不会使用实例范围;而是将对象和应用程序属性放在变量范围内。对我来说,这引发了我的开发方法论,因为我倾向于在我的许多对象中创建一个函数,该函数一次返回所有对象属性(便于初始化对象,

我需要解释为什么以这种方式进行;对我来说这没有意义。烘焙的 ORM 中是否存在其他功能来复制我缺少或尚未遇到的所有属性功能?我读过这个属性命名过程和你可能在函数中创建的其他变量之间存在潜在的冲突,这些变量不是由 var 作用域限制的;我不知道这些东西是否在 10 内解决了,或者这只是胡说八道。任何澄清都会有所帮助。

4

2 回答 2

2

所谓的“Instance”范围只是 CF 社区编造的东西,Adobe 没有采用它,因此它不在 Adob​​e 的 ORM 实现中。它有其优点和缺点,我不会在这个答案中解释,但和你一样,我也喜欢它。

要在没有“实例”范围的情况下实现备忘录模式,您需要编写自己的getMemento()函数来返回所有属性的结构:

function getMemento()
{
  var instance = {};

  instance.propertyA = variables.propertyA;
  instance.propertyB = variabels.propertyB;

  return instance;    // note: safer to return a Duplicate() of instance
}

或使用 编写一个通用的GetMetaData(),请参阅:

于 2012-09-26T18:44:04.333 回答
1

您的问题归结为:“我需要解释为什么以这种方式完成”。好的,这是一件值得怀疑的事情,我认为 CF 如果出于您所引用的原因使其可配置,它可能会更加灵活。

但是,如果你得到了我需要解释为什么以这种方式完成的答案,你会从那里做什么?知道这些信息对你来说不会特别有用。

答案是——据我所知——“Adobe CF 团队并没有尽可能多地考虑它,而现在我们就是这样”。那里。直白,但真实。必须记住,CF 团队实际上并不是 CF 开发人员(他们是 Java 开发人员),所以他们对使用 CF 并不是那么熟悉,所以他们不会遇到大部分 CF 所遇到的问题开发人员有这会导致他们认为“实际上,将这些直接放在变量范围内并不是一个好主意”。我不会为此责怪个别开发人员(拥有一个优秀的 Java 开发人员比拥有一群也了解 Java 的 CF 专家要好),但我确实责怪 Adob​​e 在 CF 开发团队中也没有专业的 CF 开发人员,理智地检查这些东西。

我认为这里的一个行动点是向 Adob​​e 提出一张票,以便在 CF11 中处理这个问题。如果你提出,我会投赞成票(因为我在这方面的经历和你完全一样)。错误库在这里

在此期间你能做什么?好吧,您不必使用 CF 为您创建的生成的访问器,您可以自己滚动,并将属性值粘贴到您喜欢的任何地方。您可以通过利用 onMissingMethod() 为每个属性编写单独的访问器,并查找对 getPROPERTYNAME() 和 setPROPERTYNAME() 的方法调用并将它们传递给通用 getter/setter,从而节省自己的时间。或类似的东西。

于 2012-09-26T19:53:40.677 回答