合作coffeescript服务/课程

时间:2012-10-19 15:29:15

标签: javascript oop dependency-injection coffeescript

我有两个课程,一个依赖另一个课程。它实现如下:

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呢?

2 个答案:

答案 0 :(得分:2)

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

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

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

  publicFunctionA: ->
    privateFunctionB @

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

答案 1 :(得分:1)

关于Java习语的问题:

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

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

publicFunctionA

你可以做的另一件事就是你可以在CS中而不是在java中使用类似单身的东西来使用全局变量。这通常不被认为是最佳实践,但它取决于您的应用程序(例如,如果编写库代码,这是一个很大的问题,但根据使用情况,最终用户可能会这样做)。

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