0

現在、私のクラスは次のようになっています。

private boolean hungry;
private boolean sleepy;
private boolean happy;

...

private setState(List<KeyValuePair> pairs) {
   for (KeyValuePair pair : pairs) {
       String key = pair.getKey();
       String value = pair.getValue();

       if (key.equals("hunger") && value.equals("Y")) hungry = true;
       if (key.equals("tired") && value.equals("Y")) sleepy=true;
       if (key.equals("sad") && value.equals("N")) happy = true;
   }
}

これは問題ありませんが、この特定の条件付きロジックに大きく依存しています。残念ながら、KeyValuePair のアイデアを変更することはできません (これは外部的なものです)。

(キー、値) ペアで適切な変数を true に設定するより堅牢な方法は何ですか? (常に true になり、false になることはありません)

これを簡単に読みやすく拡張可能にしたいと思います。

私が考えることができる唯一のことはMap<Map<String,String>,String>、特に実行時に静的に構築する必要があるため、 を作成することです。

何か案は?

4

5 に答える 5

1

どうですか:

private setState(List<KeyValuePair> pairs) {
   for (KeyValuePair pair : pairs) {
       String key = pair.getKey();
       String value = pair.getValue();

       hungry = (key.equals("hunger") && value.equals("Y")) || hungry;
       sleepy = (key.equals("tired") && value.equals("Y")) || sleepy;
       happy = (key.equals("sad") && value.equals("N")) || happy;
   }
}

いずれかの状態が評価されたtrue場合、他の反復に関係なく true のままになります。これをより単純にする (ロジックを削除する) という点では、そこにマップとリストが奇妙に混在しているとしたら、どうすればそれができるのかわかりません。

于 2012-05-04T19:39:23.600 に答える
0

条件付きロジックに特に問題はないと思います。明確で簡潔です。

1 つの可能性は、これをある種のデータ駆動型の設計に変えようとすることですが、設定した変数 ( hungryet al) をコンパイル時に認識しなければならないことを考えると、それで多くが得られるとは思えません。

于 2012-05-04T19:41:15.783 に答える
0

あなたのKeyValuePair実装の可能性はかなりありますequals。そうであれば、あなたは書くことができます

final KeyValuePair kvHungry = new KeyValuePair("hunger", "Y");
boolean hungry = false;
for (KeyValuePair pair : pairs) hungry |= pair.equals(kvHungry);

他の人も同じです。

于 2012-05-04T20:12:50.613 に答える
0

まず第一に、状態を表す列挙型を作成します。これは、そのために作成されたものだからです。それだけでもすっきりしますが、本当に拡張性を高めたい場合は、抽象的な StateResolver クラスを作成します。HungerStaterResolver、SleepStateResolver、HappynessStateResolver によって拡張されます。次に、これらの人は、入力に基づいて結果の状態を返す解決メソッドを持っています。実際、これは拡張可能ですが、階層を作成することになることを考慮する必要があり、それには独自の意味もあります。

于 2012-05-04T19:56:34.333 に答える
0

楽しみのために:

import java.util.Comparator;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;

public class State
{
  public static class KeyValuePair
  {
    private final String key;
    private final String value;

    public KeyValuePair( String key, String value )
    {
      super();
      this.key = key;
      this.value = value;
    }

    public String getKey()
    {
      return this.key;
    }

    public String getValue()
    {
      return this.value;
    }

  }

  public boolean setState( List<KeyValuePair> pairs )
  {
    //
    boolean happy = false;

    //
    final Comparator<KeyValuePair> comparator = new Comparator<KeyValuePair>()
    {
      @Override
      public int compare( KeyValuePair o1, KeyValuePair o2 )
      {
        int compareTo = o1.getKey().compareTo( o2.getKey() );
        if ( compareTo == 0 )
        {
          compareTo = o1.getValue().compareTo( o2.getValue() );
        }
        return compareTo;
      }
    };
    final SortedSet<KeyValuePair> matchingKeyValuePairSet = new TreeSet<KeyValuePair>( comparator );
    matchingKeyValuePairSet.add( new KeyValuePair( "hunger", "Y" ) );
    matchingKeyValuePairSet.add( new KeyValuePair( "tired", "Y" ) );
    matchingKeyValuePairSet.add( new KeyValuePair( "sad", "N" ) );

    for ( KeyValuePair pair : pairs )
    {
      happy |= matchingKeyValuePairSet.contains( pair );
    }

    //
    return happy;

  }

}

JUnit テストケース:

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import java.util.Arrays;
import java.util.List;

import org.junit.Test;

public class StateTest
{
  private State state = new State();

  @Test
  public void testSetState()
  {
    {
      final List<State.KeyValuePair> pairs = Arrays.asList( new State.KeyValuePair( "hunger", "Y" ) );
      assertTrue( this.state.setState( pairs ) );
    }
    {
      final List<State.KeyValuePair> pairs = Arrays.asList( new State.KeyValuePair( "hunger", "N" ) );
      assertFalse( this.state.setState( pairs ) );
    }
    {
      final List<State.KeyValuePair> pairs = Arrays.asList( new State.KeyValuePair( "hunger", "N" ),
                                                            new State.KeyValuePair( "sad", "N" ) );
      assertTrue( this.state.setState( pairs ) );
    }
  }

}
于 2012-05-04T19:59:35.213 に答える