2016-09-05 18 views
2

現在、小さなペットプロジェクト、Math Parser/Lexerで作業し、最終的には楽しく学ぶためのソルバーです。私は基本的なプロトタイプを掘り下げ、これをTypeScriptに変換してクリーンアップを目指しています。プロトタイプは興味のある方はこちらhttps://github.com/chips5k/math-solver-prototypeをご覧ください。Math Parser/Lexer - トークンインターフェイスデザイン

私はトークンを扱うためのきれいなインタフェースベースのアプローチを考え出しています。私はこれを間違った方法で見ていると思われますが、うまくいけば誰かが役に立つアドバイスを提供することができます。

私のTSデザインでは、いくつかのインターフェースがあります。基本インターフェースはトークンで、NumericTokenとFunctionTokenはこれを拡張しています。私は次に、AdditionToken、VariableToken、NumberToken、PiToken、SineTokenなどのこれらのインターフェイスを実装するいくつかのクラスを持っています...

私の問題は、これらのインターフェイスで作業するためには、たとえばisNumeric、isFunction、isVariable、あるいは直接型=== TokenFactory.NUMERICなど...これは、私にとっては、基本的にインタフェースを使用する点が無効になるため、間違っていると感じます。私は、より良い/よりクリーンな多型アプローチを取ることができると思うが、残念ながら私はアイデアがなく、私がやっていることについての情報を見つけることができませんでした。一連のトークンを解決しようとすると

物事がバラバラになる場所の例は、それ自体を示しています

if(t.isFunction()) { 
    var a = stack.unshift(); 
    var b = stack.unshift(); 
    if(a.isNumeric() && b.isNumeric()){ 
     result.push(tokenFactory.create(t.evaluate<number>(a.evaluate<number>, b.evaluate<number>)); 
    } else { 
    //return to stack and move on, e.g can't solve x + 1 directly 
    } 
} else { 
    stack.push(t); 
} 

は、基本的にこのようなシナリオを処理するための理想的なアプローチと考えられるものを探している、と私はそれがかもしれない疑いがありますデザインへの代替アプローチになります。

TIA!

+0

私は追加する必要があります。上記のコードスニペットは、問題を実証するためのものです。 –

答えて

1

基本型例えばISNUMERIC、isFunction、isVariableまたは代わりに直接型=== TokenFactory.NUMERIC等...これは、私には、

いや

間違って感じています。これは、型がその機能性を制御するので、かなり慣用的です。

たとえば、タイプスクリプトchecker.tsには、タイプスクリプトASTノード識別子にある.kindSyntaxKind)のチェックが付いています。

また、再帰的なビジターを追加することをおすすめします。

function visit(item){ 

if (item.addition) { 
    return visit(item.left) + visit(item.right) 
} 

if (item.literal) { 
    return literal.value(); 
} 

// ETC. 
} 
+0

フィードバックをいただきありがとうございます、私はchecker.tsを見ていきます、私は今コーディングに戻ることができます:) –

関連する問題