Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么是合适的设计模式_C#_Oop_Design Patterns - Fatal编程技术网

C# 什么是合适的设计模式

C# 什么是合适的设计模式,c#,oop,design-patterns,C#,Oop,Design Patterns,我在决定在我的情况下使用哪种设计模式时遇到了一些问题。我的问题如下:我必须建立一个测试平台,在我工作的公司生产的物理设备上执行一些测试。因此,我: 1个ITest接口,它是所有接口的父接口: interface ITest { string Description {get; set;} void Run(); } 所以特定的测试应该继承这个接口并实现Description属性和Run方法 2 TestManager类,它保存要运行的测试集合。它还可以对测试执行一些操作,例如,它有

我在决定在我的情况下使用哪种设计模式时遇到了一些问题。我的问题如下:我必须建立一个测试平台,在我工作的公司生产的物理设备上执行一些测试。因此,我:

1个ITest接口,它是所有接口的父接口:

interface ITest
{
   string Description {get; set;}
   void Run();
}
所以特定的测试应该继承这个接口并实现Description属性和Run方法

2 TestManager类,它保存要运行的测试集合。它还可以对测试执行一些操作,例如,它有一个RunAll方法来运行它持有的所有测试

class TestManager
{
   public List<ITest> Tests {get; run;}
   void RunAll()
   {
       foreach (var t in Tests)
       {
           t.Run();  
       }
   }
}
此PreparationMessage将以某种方式提示用户,以便用户可以在我们要测试的设备上执行某些操作。但是TestManager有责任决定需要准备哪些测试,以及准备消息将以何种方式显示给用户。问题是,它持有ITest的集合,因此必须区分可准备测试和普通测试。当然我可以写这样的东西:

RunAll()
{
   foreach (var test in tests)
   {
       if (test is IPreparableTest)
       {
          MessageBox.Show(((IPreparableTest)test).PreparationMessage);
       }
       test.Run();
   }
}

但我不想这样写,因为这不是OOP风格。我想在这里使用一些图案,但我不知道应该使用哪一种。另外,我不想把准备逻辑放在测试上,因为这不是测试的责任,测试应该只有关于如何准备设备的信息,但是这个消息将如何显示给用户取决于TestManager。因此,基本上我想学习避免对象类型切换的方法。

您应该从现有的测试库(如NUnit或XUnit)中获得指导。它们有一些方法可以在一组测试之前和之后以及每个测试之前和之后运行。他们还使用反射来确定是否应该执行一个方法

伪代码:

[TestClass]
class MyTests
{
    [TestFixture]
    public void ThisIsATest()
    {
    }

    [BeforeAllTests]
    public void OncePerClass()
    {
    }

    [BeforeEachTest]
    public void OncePerTest()
    {
    }

    [AfterEachTest]
    public void AfterEachTest()
    {
    }

    [AfterAllTests]
    public void AfterAllTests()
    {
    }
 }

为什么不让ITest有一个BeforeRun和AfterRun方法呢?不需要实现它的类可以只有空方法。您似乎与UI高度耦合,这是不对的。或者甚至只是将prep消息移动到ITest并检查它是否为空?不管怎样,这个问题恐怕过于基于观点,不适合堆栈溢出。不要重新发明轮子。除非这只是一个练习,否则请使用NUnit或XUnit。它们在CI/CD中得到很好的支持,可以将结果输出到各种测试报告工具。它们在VS中直接受支持。我认为接口继承没有明显的优势。与相互继承的接口相比,更喜欢多接口实现。想要比想要多输入一个字符。
[TestClass]
class MyTests
{
    [TestFixture]
    public void ThisIsATest()
    {
    }

    [BeforeAllTests]
    public void OncePerClass()
    {
    }

    [BeforeEachTest]
    public void OncePerTest()
    {
    }

    [AfterEachTest]
    public void AfterEachTest()
    {
    }

    [AfterAllTests]
    public void AfterAllTests()
    {
    }
 }