как получить преимущество структуры без гражданства
Я хотел бы использовать http://code.google.com/p/stateless в моем коде, чтобы отделить функциональность от ее зависимостей. Я не нашел никаких продвинутых примеров использования, поэтому этот вопрос касается лучших практик безгосударственной структуры.
У меня есть следующая конфигурация (это просто пример, имеет только одно состояние функции):
var stateMachine = new StateMachine(State.Stopped);
stateMachine.Configure(State.Stopped)
.Permit(Trigger.Failed, State.Error)
.Permit(Trigger.Succeed, State.GenerateMachineData);
stateMachine.Configure(State.GenerateMachineData)
.Permit(Trigger.Failed, State.Error)
.Permit(Trigger.Succeed, State.Finished);
public enum State
{
Stopped,
GenerateMachineData,
Finished,
Error
}
public enum Trigger
{
Succeed,
Failed
}
Где тогда называть фактическую функциональность. У меня были следующие идеи, но каждая из них имеет свои преимущества и недостатки:
1) Установите функциональность, а также следующий огонь в OnEntry():
stateMachine.Configure(State.GenerateMachineData)
.OnEntry(() => {
try {
Generate();
stateMachine.Fire(Trigger.Succeed);
} catch {
stateMachine.Fire(Trigger.Error);
}
})
.Permit(Trigger.Failed, State.Error)
.Permit(Trigger.Succeed, State.Finished);
Так что если я просто позвоню
stateMachine.Fire(Trigger.Succeed);
Он заканчивается либо в состоянии.Законченный или государственный.Ошибка
- преимущества-все вместе
- disadvatages-решение не может быть действительно непроверенным
2) разделите statemachine и функциональность следующим образом:
{[3]}
Void Main() { пока (государственная машина.Государство != Государство.Успешный && государственная машина.Государство != Государство.Ошибка) { Дотестуфф(); } }
- преимущества: статическая машина может быть протестирована сама
- недостатки: мне это совсем не нравится
3) какое-то другое решение?
Я буду рад любому ответу
2 ответа:
Мне нравится BugTrackerExample, который у них есть в исходном коде.
Таким образом, ваша машина, вероятно, будет выглядеть следующим образом:
class Generator { private readonly StateMachine state; public Generator() { state = new StateMachine(State.Stopped); // your definition of states ... state.Configure(State.GenerateMachineData) .OnEntry(() => { Generate(); }) .Permit(Trigger.Failed, State.Error) .Permit(Trigger.Succeed, State.Finished); // ... } public void Succeed() { state.Fire(Trigger.Succeed); } public void Fail() { state.Fire(Trigger.Fail); } public void Generate() { // ... } }
В этом случае тесты не должны быть проблемой.
Если вам нужно дальнейшее разделение, вы можете использовать событие, делегат или шаблон стратегии вместо метода
Generate
.
Николас Блюмхардт написалХороший пост об апатридной структуре.