web-dev-qa-db-ja.com

状態パターンを使用してif elseステートメントを削除する

If、elseステートメントは臭いなのでコードから取り除く必要があります。状態パターンを実装してそれらを取り除くことができることはわかっていますが、私のコードでは、文字列入力が特定の演算子であるかどうかを確認してから、スタックで処理を行っています。これについてどうすればいいですか?数学とスタック操作を行うさまざまな状態を作成する必要がありますか?私の主な問題は、ifステートメントを使用せずにそれを実装する方法がわからないことです。たとえば、演算子に遭遇した場合、何かしたいのですが、いくつかの異なる演算子があるため、入力がaであることを確認する必要があります「+」は、そのセクションに必要なコードを実行します。

私のコードはここにあります:

package src;

import Java.util.Arrays;
import Java.util.List;
import Java.util.Stack;

public class RPNCalculator {

    public int solveEquation(final String input) {
        final Stack<Integer> operands = new Stack<Integer>();

        List<String> tokenizedInput = Arrays.asList(input.split(" "));

        for (String currentToken : tokenizedInput) {
            try {
                int inputAsInt = Integer.parseInt(currentToken);
                operands.Push(inputAsInt);
                continue; //
            } catch (NumberFormatException exception) {

            }

            if (currentToken.contains("+")) {
                int total = operands.pop() + operands.pop();
                operands.Push(total);

            } else if (currentToken.contains("-")) {
                int secondNum = operands.pop();
                int total = operands.pop() - secondNum;
                operands.Push(total);

            } else if (currentToken.contains("*")) {
                int total = operands.pop() * operands.pop();
                operands.Push(total);

            } else if (currentToken.contains("/")) {
                int secondNum = operands.pop();
                int total = operands.pop() / secondNum;
                operands.Push(total);

            }


2
Harv

Optionモナドとbothモナドは、ifステートメントの量を削除するのに適したモナドです。状態モナドはif else式とは無関係です。状態モナドは、複数の関数にまたがる共通のパラメーターのスレッドに関連しています。末尾呼び出しの最適化がない場合(コンパイラは呼び出し先の実行前に呼び出し元のスタックを解放します)、状態モナドはスタックオーバーフローを作成することもあります。

0
DetriusXii