私は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 ライブラリを使用せずに上記を実装する方法はありますか?
私の改宗をどのように開始するかについての提案は、熱烈に歓迎されます.