2016-07-28 3 views
1

내부적으로 내 조직 내의 다른 개발자에게 회귀 테스트 기능을 제공하는 응용 프로그램을 개발했으며 응용 프로그램의 프런트 엔드를 통해 인터페이스하는 주요 방법은 하드 코드 된 문자열C#을 사용하여 Readme를 serialize하는 스위치 사용

  case "BUILDTEST": 
       //Build the test with the supplied designator as 'arg_designator' 
       returnVal = BuildDesignator(); 
       break; 

      case "CHANGEROLE": 
       //Changes the user's role 
       returnVal = ChangeRole(); 
       break; 

      case "CHECKOUTDATA": 
       //Check out the data you wish to test 
       returnVal = CheckoutRoute(); 
       break; 

모든 빌드 readme 파일의 일종을 생성하는 경우 아래의 이름과 의견을 직렬화하는 가장 좋은 방법은 무엇입니까 : 같은과 같은 코드의 스위치 케이스 구조에? 이 예에서는 내가처럼 보이는 파일을 생성하고 싶습니다 :

FUNCTIONALITY 

BUILDTEST: Build the test with the supplied designator as 'arg_designator' 

CHANGEROLE: Changes the user's role 

CHECKOUTDATA: Check out the data you wish to test 

당신이 구조 조정의 조금 괜찮다면

답변

3

을 제공 어떤 도움을 주셔서 감사합니다, 여기를 직렬화보다 더 나은 솔루션입니다 switch 문의 내용 나는 당신이 정규식 찾기/바꾸기 소스를 통해 작업을 교체하거나 스위치 내용을 파생시키는 것을 돕기 위해 파일을 추가하는 것을 골칫거리로하고 싶지는 않다.

먼저 빌드 작업 클래스 각각이 기본 클래스에서 상속되는지 확인하십시오. 당신이 스위치 문을 제거하고 일반 공장으로 교체받을 수 있습니다 후

public abstract class BuildAction 
{ 
    public string Description { get; set; } 

    protected BuildAction(string description) 
    { 
     Description = description; 
    } 

    public abstract void PerformBuildAction(); 
} 

public class BuildTest : BuildAction 
{ 
    public BuildTest() : base("Build the test with the supplied designator as 'arg_designator'") { } 

    public override void PerformBuildAction() 
    { 
     // do stuff here 
    } 
} 

public class ChangeRole : BuildAction 
{ 
    public ChangeRole() : base("Change the user's role") { } 

    public override void PerformBuildAction() 
    { 
     // do stuff here 
    } 
} 

public class CheckoutData : BuildAction 
{ 
    public CheckoutData : base("Check out the data you wish to test") { } 

    public override void PerformBuildAction() 
    { 
     // do stuff here 
    } 
} 

: 당신이 그렇게하는 동안, 각 빌드 액션 클래스에게 일을 더 쉽게 만들 수있는 설명을 제공합니다. 당신이처럼 공장을 경우

public class BuildActionFactory 
{ 
    private static IDictionary<string, BuildAction> _buildActions = 
     new Dictionary<string, BuildAction>() 
     { 
      {"BUILDTEST", typeof(BuildTest)}, 
      {"CHANGEROLE", typeof(ChangeRole)}, 
      {"CHECKOUTDATA", typeof(CheckoutData)} 
     }; 

    public static BuildAction CreateBuildAction(string directive) 
    { 
     return _buildActions.ContainsKey(directive) ? 
      Activator.CreateInstance(_buildActions[directive]) : 
      null; 
    } 

    public static string BuildReadme() 
    { 
     return string.Join(Environment.NewLine + Environment.NewLine, 
      new [] {"FUNCTIONALITY"}.Union(_buildActions.Select(pair => pair.Key + ": " + pair.Value.Description)); 
    } 
} 

: 당신은 공장을 만드는 방법에 따라, 먼저 추가 정보를 위해를 통해 반복하고 명령 라우팅에 대한 조회를 단순화하기 위해 디렉토리를 구축하여 추가 정보 생성을 위해 그것을 활용할 수 switch 문을 BuildActionFactory.CreateBuildAction("BUILDTEST/CHANGEROLE/CHECKOUTDATA/etc whatever you got from the user").PerformBuildAction()에 대한 간단한 호출로 바꿀 수 있으며 readme 내용은 BuildActionFactory.BuildReadme()에 의해 생성 될 수 있습니다. 물론 솔루션을 빌드 할 때 readme 파일을 만들려면 래퍼 콘솔 응용 프로그램 프로젝트에서 BuildActionFactory.BuildReadme()을 호출하는 게시 빌드 작업을 추가해야합니다.이 작업은 readme를 생성 할 수있는 구성 파일을 읽는 리팩토링보다 간단합니다.

면책 조항 : 위의 코드는 모두 Sublime로 작성되었습니다. 그것들 중 어느 것도 컴파일되거나 테스트되지 않았지만이 접근법을 취하면 어떻게해야하는지에 대한 아이디어를 줄 것입니다.

+0

내 릴리스가 푸시 백되어서 구현하지 못했습니다. 푸시가 밀려 오면 몇 달 안에 당신을 계속 지켜 드리겠습니다. 그런 깊이있는 제안에 감사드립니다. – Rice