2017-06-27 5 views
0

私は最近私のアクタをリファクタリングし、俳優の一員である多くのヘルパーメソッドで終わりました。これは正しいことですか?すべてのヘルパーメソッドが自分の俳優であるべきですか?どのようにして分離を行うのですか?ベストプラクティス - akkaアクターのヘルパーメソッド

public class MyActor extends UntypedActor { 



     public MyActor() { 

     } 

     @Override 
     public void onReceive(Object msg) throws Exception { 


     if (msg instanceof doSomethingComplex) { 
       doSomethingComplex message = (doSomethingComplex) msg; 
       doSimple(message.prop); 
} 

private void doSimple(String prop){ 
doSimpler(prop); 
.... 
} 

private void doSimpler(String prop){ 
... 
.... 
} 

}

ヘルパーメソッドはすべきですか?これらは俳優でなければなりませんか?

答えて

1

すべてのヘルパーメソッドが独自のアクターであるべきですか?どのように分離するのですか?

これらの質問に対処するには、俳優が何であるかを考えることが役立ちます。デレク・ワイアット、彼の著書アッカ同時実行で、(次は彼の本の自由に利用できるfourth chapterからの抜粋です)俳優と人とのアナロジーを描く:

あなたの日々の世界です並行性がいっぱいです。あなたはそれをあなた自身の周囲の人々と同様に に課し、あなたにそれを課す。現実世界の 相当のクリティカルセクションとロック、同期メソッド とデータは、すべて自分自身とあなたの世界の人々によって自然に処理されます。 人々は文字通り一度に1つのことをやってこれを管理します。 私たちはマルチタスクができると思っていますが、それは単に真実ではありません。意味のあるものはどれも 私たちはそのことを一つだけ行うことが必要です。私たちはその仕事を一時停止して とし、後で再開し、何か他のものに取り掛けてからそれに戻ってから に戻ってきますが、実際には一度に複数のことをしています。

一度に複数のことをしたいのですが?答えは かなり明白です:私たちは複数の人を使っています。 の世界では、それが恩恵を受けていることはあまりありません。それは、才能豊かな人々の怒鳴りによって作られたものではありません。 人。

これは、俳優が私たちのアプリケーション開発をより直感的にする理由であり、 私たちのアプリケーションデザインは簡単に推論できます。彼らは の日々の生活をモデルにしています。同じ章の

以降、彼は書いている:

俳優は一度に一つのことを行います。これが並行処理のモデルです。 複数のものが同時に発生したい場合は、 複数のアクターを作成してその作業を行う必要があります。これはかなり良い意味で、 の権利ですか?私たちは、その俳優のプログラミングのすべてが、あなたの日常生活の経験である に多くを描いていると言ってきました。作業をより速くしたい場合は、 人を追加してください。

アクターシステムを設計する際には、システムの主要部分を別個の責任を持つアクターに割り当てることが良い原則です。たとえば、ETLパイプラインでは、次のようになります。

  1. 新しいデータのキューにサブスクライブするアクタ。
  2. 生データを解析するアクタ。
  3. ユーザーが興味を持っている情報について解析されたデータをフィルタリングするアクタ。
  4. 結果をデータベースに保存するアクタ。
  5. ユーザが購読可能なキューに結果を公開するアクタ。

パーサーアクターがヘルパーメソッドを使用しているとします。このメソッドを代わりに独自のアクターにカプセル化するかどうかは、メソッドが何をするかによって異なります。タスクをサブタスクに分割することをお勧めしますが、ある時点では、タスクが小さすぎて自分の俳優にはなりすぎないと判断する必要があります。

アナロジーに戻って、パイプラインの各ステージを人として視覚化しましょう。パーサーの人が自分の仕事をするために尖った鉛筆を必要としているとしましょう。現在、パーサは自分自身でペンシルを取得しています。ワイアットの本から別のイラストを借りている貧弱なインターンを雇うことは理にかなっていますか?唯一の仕事は、鉛筆を鋭利にして、要請があればそれをパーサーに渡すことです。大量のデータが流入した場合、インターンを雇うことなくパーサーの人数を増やすだけで十分でしょうか? 10人のパーサーに30人の鉛筆削りインターンを持たせることは効率的ではないでしょう。言い換えれば、パーサーの数に関係なく、インターンの人数を独立して調整する必要はないでしょう。もしそうする必要があれば、インターンの仕事はインターンを雇うことを正当化するのに十分重要であることを示すでしょう。はっきりと明確な責任を持つ部分にあなたのシステムを分解

  • :思考のために、この主観的な食べ物を要約する

    。各パートをアクタに割り当てます。

  • 必要に応じて、各部分を分解してサブタスクにします。各サブタスクをアクタに割り当てます。さらなる分解が必要かどうかを判断するための重要な方法は、サブタスクを独立してスケールすることが生産的であるかどうかを判断することです。
  • 独自のアクタになるには小さすぎる機能は、必要に応じてヘルパーメソッドの内部に配置できます。ヘルパーメソッドがあるべき

アイデアのカップル:

  • ヘルパーメソッドのみが特定の俳優に関連している場合は、あなたがやっているよう俳優の内側にそれを宣言する。
  • ヘルパーメソッドは、俳優の異なる種類で使用することができれば、utility classでそれを宣言する。または、アクター内のstatic methodとして宣言します。
+0

これを説明していただきありがとうございます。リソースをリンク感謝し、私は、Javaで使用し、特に苦労アッカフレームワークのドキュメントの「ベストプラクティス」の種類を見つけることがあります –

0

ヘルパーメソッドは、別のメソッドを実行して タスクを実行するのに役立つメソッドです。これらは通常、メソッドがいくつかの小さなタスクで構成される複雑なタスク を実行する必要がある場合に使用されます。 小さなタスクは、多くの場合、ヘルパーメソッドによって実行されます。

ヘルパーメソッドは、通常、大きなタスクをより小さなより組織化されたメソッドに分割するためにのみ使用されます。ヘルパーメソッドは、ヘルパーメソッドを使用しているクラスの階層内に存在する必要があります。

+0

これは、同じクラスの一部を意味するのでしょうか?はい、それは –

+0

だろうか?ヘルパーメソッドの – Ryan

+0

あなたがラッパークラスを検討する私はそれを行うような方法 –

関連する問題