我有两个课程,一个依赖另一个课程。它实现如下:
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呢?
答案 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中使用类似单身的东西来使用全局变量。这通常不被认为是最佳实践,但它取决于您的应用程序(例如,如果编写库代码,这是一个很大的问题,但根据使用情况,最终用户可能会这样做)。
此外,您还可以考虑避免整个类的事情并将其写为普通对象,如果没有实例并且您计划不进行子类化等,这可能是一个好主意。