2016-07-25 9 views
-3

こんにちは私は、ユーザーが異なるコマンドを入力できるJavaプログラムを作成しようとしています。このクラスはすべてのコマンドを識別でき、それに基づいて3-4の異なるクラスからメソッドを呼び出します。非常に多くのコマンドがありJavaのif文が多すぎます。

if (input.equals("change category FOOD"){...} 
if (input.equals("Sort by price FOOD"){...} 
if (input.equals("logout"){...} 

、と私はこれを短縮する方法があるかどうかを知りたいと思った:現在、各コマンドのために、私は、次のような文と異なる場合があります。 「ステートメントは、」{...}あなたは、あなたの質問に入れ表し

switch(input) { 
     case "change category FOOD": 
      statement; 
      break; 
     case "Sort by price FOOD": 
      statement; 
      break; 
     case "logout": 
      statement; 
      break; 
     default: 
      statement; 
    } 

:文字列でswitchステートメントを使用して

+2

おそらく。 '{...} 'セクションに何があるのか​​を私たちに伝える必要があります。 –

+1

'switch/case'文を使うことができます。あるいは、コマンドが 'HashMap'にある何らかの種類のコマンドパターンです。 –

+1

'' Map 'を使って、コマンドとオブジェクトの間のマッピングを定義します(' [something] '部分)。あなたは命令が何であるか教えてくれていないので、何かが何であるかは分かりません。 –

答えて

-1

まず、入力を処理するたびに、すべてのif文をチェックしています。コードをよりクリーンで効率的に保つためにif/elseを使用する場合は、

などがあります。

また、セミロング文字列と完全に一致する入力を求めています。これは実際には起こりませんほとんどないとあなただけのできるだけきれいにあなたのコードを維持しようと、最後

String newString = string.split(" "); 

を使用して配列に文字列を分割し、短い引数をお願いしなければならないのいずれか。小切手を短くすることはできないので、コードを読みやすくして、巨大なコードブロックを1か所に置かないでください。

+0

なぜあなたは-1でしょうか? –

0

は自動的にstring.equalsメソッドを実装します。

これは、if/elseステートメントが積み重なり始めるときの良い選択肢です。 default:ケースを必ず追加してください。ケースのどれも満たされていない場合の最終的な 'else'ステートメントとして機能します。

0

は、コマンドを表し、第1のタイプは文字列です地図を使用し、第2のタイプは、あなたが実行することができますクラスで、@Jimギャリソンさんのコメントに展開します。コマンドが必要ない場合は、Runnableを使用し、各コマンドにRunnable実装を記述し、setup関数でマップエントリを作成します。

さらに詳しい情報が必要な場合は、onCommand(...)メソッドを持つn interface SomeInterfaceを作成し、必要なデータを渡します。ここでもまた、各コマンドの実装を追加し、コマンドの各マッピングをcommand-runnerにマップに追加します。したがって、正しいコマンド実装を実行するだけでよいでしょう。

map.get( "command")。onCommand(...);

+0

私はそれを試しましたが、それはそれが多くのクラスを作成することを意味し、sooは多くのコマンドを持っていますので、soo多くのクラスも同様です –

+0

したがって、あなたはすべてのコマンドを何か別の方法を通過する必要があります。方法にかかわらず、基本的には、ある時点で、各文字列をチェックするいくつかの可能なコマンドを実行します。あなたができることは、それをより読みやすくすることです。クラスに分けることはこれをかなり読みやすい方法ですが、実際には決定的な要素であるコーディングスタイルです。 – TheNumenorean

+0

ああ大変ありがとう! –

0

コマンドとして文字列のキーと、適切なFunctionを設定しMap<String,Function>

を作成します。

この機能は、マップから呼び出すことで実行できます。

+0

試してみます –

0

他の回答は確かに実行可能なmapを使用して提案しています。例えば ​​-

  • はあなたがテストすることが困難な場合がシングルトンマップ
  • が必要になります

    • あなたは永遠にequalsに限定されているアクションにコマンドを一致させる:しかしそれは潜在的な欠点のカップルを持っていますコマンドを嘲笑することは、シングルトンを公開することを意味します。

    コマンドのセットをカプセル化する別の方法は、enumに実行可能変数を使用することです。たとえば:

    public enum Command { 
        CHANGE_CATEGORY("change category",() -> { 
         // change category 
        }), 
        SORT_BY_PRICE("sort by price",() -> { 
         // sort by price 
        }), 
        ... 
        DEFAULT("",() -> { 
         // default action 
        }); 
    
        private final String commandText; 
        private final Runnable action; 
    
        Command(String commandText, Runnable action) { 
         this.commandText = commandText; 
         this.action = action; 
        } 
    
        public static void run(String text) { 
         Arrays.stream(values()) 
          .filter(c -> c.commandText.equals(text)) 
          .findAny().orElse(DEFAULT) 
          .action.run(); 
        } 
    } 
    

    これは次のように使用されます。Command.run(text)

    これは、あなたが一箇所でのコマンドに関連付けられているすべてのロジックを配置することができますし、テキストを一致させるためのロジックを変更することが容易になります(たとえば、スペースを無視し、ケース)を変更します。この列挙型もシングルトンですが、言語はそれを初期化するときの複雑さをすべて処理しています。

  • 関連する問題