3

メソッドを記述したSensorステート マシンがあります。Cycle()

  /// <summary>
  /// Cycle sets the machine to follow a path from one it's current state to the next. The 
  /// behavior of the sensor is to revert to it's default state should an invalid state be
  /// encountered.
  /// </summary>
  /// <returns></returns>
  public IState Cycle() {
     if(_currentState.Next.IsNullOrEmpty()) {
        _currentState = DefaultState.Set();
     } else {
        _currentState = _currentState.Cycle();
     }
     return _currentState;
  }

  public IEnumerator<IState> Cycle(Func<bool> HasWork) {
     while(HasWork()) {
        yield return Cycle();
     }
  }

実装:

  [TestMethod]
  public void SensorExperiment_CycleWhileFunc() {
     float offset = .5f;
     IState previousState = State.Empty;

     IStimulus temp = new PassiveStimulus(68f) {
        Offset = offset
     };
     ISensor thermostat = new Sensor(65f, 75f, temp);

     int cycles = 0;
     // using this func to tell the machine when to turn off
     Func<bool> hasWork = () => {
        previousState = thermostat.CurrentState;
        // run 10 cycles6
        return cycles++ < 10;
     };

     var iterator = thermostat.Cycle(hasWork);

     while(iterator.MoveNext()) {
        Console.WriteLine("Previous State: {0}\tCurrent State: {1}",
           previousState.Name, iterator.Current.Name);
     }
  }

IEnumeratorをStateMachineとして使用した問い合わせに対する Eric Lippert の回答を読みました。私の実装は IEnumerator の使用を悪用または活用していますか? 私の実装は、一連の状態の自動化を提供する方法だと考えています。

4

1 に答える 1

2

このように使用することは実際には悪用ではないと思います。結局のところ、結果をコレクションとして扱うのが一番です。

一方、ここでイテレータを使用する理由はわかりません。コードを次のように書き直しても、同じように機能するはずです。

while (hasWork())
    Console.WriteLine("Previous State: {0}\tCurrent State: {1}",
       previousState.Name, thermostat.Cycle().Name);
于 2012-06-10T17:17:18.240 に答える