1

我有两个类,一个依赖于另一个。它是这样实现的:

class myns.ClassA
  constructor(@serviceB): ->

  publicFunctionA: ->
    privateFunctionB.call this

  privateFunctionB = ->
    @serviceB.someFunction()

然后我用胶水实例化它:

myns.classA = new myns.ClassA(myns.serviceB)

并用作:

myns.classA.publicFunctionA()

这里的问题是我想从 privateFunctionB 访问 serviceB。除了使用之外,还有更合适的方法call吗?

或者我的整个方法可能被我的 Java 背景污染太多了?我需要的是相互依赖的代码模块,相当于单例服务。我知道我可以使用 coffeescript 类函数并避免实例化,但是如何以干净的方式处理注入 serviceB 呢?

4

2 回答 2

2

您可以将ClassA实例作为参数而不是作为this. 如果您将每个类保存在自己的文件中,然后在没有--bare选项的情况下进行编译,我建议将该私有函数放在类之外并将其用作普通函数(它将是文件私有的,因此无需担心外面的东西泄漏):

privateFunctionB = (a) ->
  a.serviceB.someFunction()

class myns.ClassA
  constructor(@serviceB): ->

  publicFunctionA: ->
    privateFunctionB @

如果您不喜欢将函数放在文件的顶层,您也可以将它放在类中(我更喜欢将它放在那里,因为我认为它只是一个简单的函数更容易理解)。

于 2012-10-19T16:49:36.150 回答
1

关于您关于 Java 习语的问题:

CoffeeScript 中没有公共和私有的概念。你privateFunctionB只是在类的闭包中声明的一个普通函数。模拟私有函数通常不是一个好习惯,因为这些函数具有非常不同的语义(例如,如果privateFunctionB是类之外的变量,它将被覆盖,而publicFunctionA.

因此,最好的办法是将这两个函数编写为普通的类属性(这就是您所说的公共函数。然后您的代码简化为:

class myns.ClassA
  constructor(@serviceB): ->

  functionA: ->
    @functionB()

  functionB: ->
    @serviceB.someFunction()

对于在 CS 中可以但在 java 中不能做的类似单例的事情,您可以做的另一件事是使用全局变量。这通常不被认为是最佳实践,但这取决于您的应用程序(例如,如果编写库代码,这是一个很大的禁忌,但在最终用户之类的事情中可能没问题,具体取决于使用情况)。

此外,您还可以考虑避免使用整个类并将其编写为普通对象,如果没有实例并且您打算不进行子类化等,这可能是一个好主意。

于 2012-10-19T17:33:08.977 回答