2017-11-23 11 views
1

조건부 및 중첩 된 조건문을 여러 개 작성하지 않고도 정교한 워크 플로우를 작성할 수있는 곳에 적용 할 수있는 디자인 패턴이 있습니까? 그 대답은 사양 패턴과 같은 것을 사용하는 어딘가에 있을지 모르지만 그 패턴이 어떻게 결합되어 있는지 확실하지 않습니다. 기음#?C# 술어와 작업 대리자를 사용하여 논리적 워크 플로를 작성하는 방법은 무엇입니까?

static void Main() 
    { 
     // I have some predicates 
     bool transientError = true; 
     bool fatalError = true; 
     bool maxRetriesReached = true; 

     // I have some actions 
     Action SendToDeadletter =() => { }; 
     Action Retry =() => { }; 
     Action Complete =() => { }; 

     // Is there a way of building the following without using conditional statements 
     // something like Specification Pattern? 

     // maxRetriesReached || fatalError => SendToDeadletter() 
     // transientError && !maxRetriesReached => Retry() 
     // !transientError && !fatalError => Complete() 

    } 
+0

심지어 나는 괜찮 조건문을 사용하도록 예에서 볼 수있는 다음과 같은 방법을 사용하여, 그러나, 당신은 [이] (HTTPS을 볼 수있다. codeproject.com/Articles/670115/Specification-pattern-in-Csharp) – Yahya

+1

[StateMachine] (https://www.hanselman.com/blog/Stateless30AStateMachineLibraryForNETCore.aspx)이 문제를 해결할 수 있습니다. –

답변

0

당신은 enum (또는 struct 더 많은 확장 성을 가지고)로 조건을 정의 할 수 있습니다

[Flags] 
public enum WorkflowFlags 
{ 
    SendToDeadletter, 
    Retry, 
    Continue 
} 

을 그리고 방법과 워크 플로우 항목을 정의, 플래그에 소요 true을 반환 ShouldExecute 말/false 항목을 실행해야합니다.

public class MyWorkflowItem : IWorkflowItem 
{ 
    public bool ShouldExecute(WorkflowFlags flags) 
    { 
     return (flags & WorkflowFlags.Retry) != 0; 
    } 
} 
0

당신은 아마 당신은 아마 온라인 예를 많이 발견

https://en.wikipedia.org/wiki/Specification_pattern

여기에이 작업을 수행하는 방법에 대한 C# 예제가있다 논리 를 코딩하는 사양 패턴을 사용할 수 있습니다.

설명을 사용하면 로직을 코딩하는 데 사양 패턴을 사용하는 이유를 이해하지 못합니다.

한순간에 조건문을 사용해야합니다.

그러나 그와 같은 것을 원할 수도 있습니다. // WWW :

public static void Reaction(this Func<bool> condition, Action conditionMet,Action conditionUnmet) 
{ 
    condition() ? conditionMet() : conditionUnmet(); 
} 

그것을

Func<bool> CanDoAction =()=> false; 
Action behaviorAction =()=> DoStuff; 
Action behaviorUnableToDoAction =()=> DoOtherStuff; 

CanDoAction.Reaction(behaviorAction ,behaviorUnableToDoAction);