1

私には2つのクラスがあり、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では実行できないシングルトンのようなことに対して実行できるもう1つのことは、グローバル変数を使用することです。これは多くの場合、ベストプラクティスとは見なされませんが、アプリケーションによって異なります(たとえば、ライブラリコードを作成する場合は大したことはありませんが、使用法によっては、エンドユーザーのようなものでも問題ない場合があります)。

さらに、クラス全体を避けてプレーンオブジェクトとして記述することも検討できます。インスタンスがなく、サブクラス化などを行わない予定の場合は、これはおそらく良い考えです。

于 2012-10-19T17:33:08.977 に答える