0

私はJavaで古典的な状態のデザインパターンを使用し、それをルビーに変換する際にいくつかの問題に直面している実用的なソリューションを持っています。私は Ruby を初めて使用しますが、問題は動的言語でパターンを実装する方法の違いにあると私は信じています。

私のインターフェイスは、モデルがすべての状態で実行できるアクションを記述しています。

public interface State {

    public void doTask1(Model a_model);
    public void doTask2(Model a_model);
    public boolean doTask3(Model a_model, Helper a_helper);
}

次に、状態インターフェイスを実装し、ロジックの具体的な状態を作成します。

    public class LogicState1 implements State {

 public void doTask1(Model a_model) {
  a_model.implementTask1();
 }

 public void doTask2(Model a_model) {
  a_model.implementTask2();
 }

 public boolean doTask3(Model a_model, Helper a_helper) {
                a_model.useHelper();
      return a_model.setState(a_model.getALogicstate(a_key));
}

ご覧のとおり、各具体的な状態はモデルに到達し、その状態を変更できます。カプセル化の問題を回避するために、現在の State への参照も持つ Model クラス内で具体的な状態をインスタンス化します。

public class Model {

private State currentState;

public void setState(State state){
 this.currentState = state;
 }

public State getState(){
 return currentState;
 }

private final Map<String, State> everyState = new HashMap<String, State>();

public Model(String initialStateKey){
   everyState.put("key1", new LogicState1());
   everyState.put("key2", new LogicState2());
   //...etc, instantiate and store all business logic states
   this.currentState = everyState.get(initialStateKey);
}

public State getALogicState(String key){
 return everyState.get(key);
}
public void useHelper(){...}

クライアントは次のようにモデルを使用します。

public void run(Model a_model) {
 a_model.getState().doTask1(a_model);
}

上記のJavaはすべて簡単だと思いますが、現在、この設計をRubyに移植しようとしています。タイプチェックの違いと、モジュールとミックスインが Java のインターフェースとは対照的に Ruby でどのように機能するかを認識しています。

つるはしの本で、Ruby の State デザイン パターンについても知りました。今、私はそのような変換を試みる最良の方法について少し混乱しています. 私はまだ Java ボックスの中で考えています。各状態の具体的な実装を別の .rb ファイルに入れ、それをクライアント クラスで要求する必要があるかどうか疑問に思っています。

delegate.rb ライブラリを使用せずに上記を実装する方法はありますか?

私の改宗をどのように開始するかについての提案は、熱烈に歓迎されます.

4

2 に答える 2

3

これを Ruby に変換するには、インターフェイスを省略して、他のすべてをそのままにしておくことができます。つまり、各状態はメソッドを定義するクラスであり、do_task_Nそれ以外の場合は他の状態クラスへの接続はありません (つまり、モジュールなどを混ぜて共通インターフェイスを「エミュレート」する必要はありません。まったく必要ありません)。

私はまだ Java ボックスの中で考えています。各状態の具体的な実装を別の .rb ファイルに入れ、それをクライアント クラスで要求する必要があるかどうか疑問に思っています。

いいですね、はい。

于 2009-09-27T15:16:27.330 に答える
0

特定のプログラムを Java から Ruby に移植しようとしていますか、それとも Ruby の書き方を学ぼうとしていますか?

#1の場合、なぜですか?

#2 の場合、Ruby スタイルを学ぶために、既存の Ruby コードを使用することをお勧めします。これには Ruby on Rails を強くお勧めします。これは非常によく書かれたフレームワークだからです。私は Rails から多くの教訓を学びました。これは、他の種類のプログラムや他の言語を作成するときにも使用できます。

于 2009-09-27T17:26:37.963 に答える