Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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#_Class_Design Patterns - Fatal编程技术网

C# 如何构建类以便于消费者和测试人员理解

C# 如何构建类以便于消费者和测试人员理解,c#,class,design-patterns,C#,Class,Design Patterns,我正试图找出最好的方法来构造我的类,以便类的消费者能够以最少的努力使用它们 举两个例子: public class Foo { public List<Bar> Bars { get; private set; } public Foo() { Bars = new List<Bar>(); Method1(); Method2(); } private void Method1

我正试图找出最好的方法来构造我的类,以便类的消费者能够以最少的努力使用它们

举两个例子:

public class Foo
{

    public List<Bar> Bars { get; private set; }

    public Foo()
    {
        Bars = new List<Bar>();
        Method1();
        Method2();
    }

    private void Method1()
    {
        // code
    }

    private void Method2()
    {
        // code
    }
}
公共类Foo
{
公共列表栏{get;private set;}
公共食物(
{
条=新列表();
方法1();
方法2();
}
私有void方法1()
{
//代码
}
私有void方法2()
{
//代码
}
}
在本例中,类的使用者不需要知道如何使用该类,并且(假设method1/2在条形图上执行某些操作),用户只需要实例化该类以获得所需的信息-条形图

或者应该这样做(或者完全不同):

公共类Foo
{
公共列表栏{get;private set;}
公共食物(
{
条=新列表();
}
公共空间
{
方法1();
方法2();
}
私有void方法1()
{
//代码
}
私有void方法2()
{
//代码
}
}
在本例中,使用者需要知道如何调用DoStuff(),以便正确使用该类。在类变得臃肿的情况下,如果用户需要确定调用方法的顺序,这可能会让他们感到非常困惑。在这个例子中,我知道在最佳实践中,类应该是精简的,并且遵循SRP,但是如果不是这样的话,是否有理由使用一种方法来比较另一种方法


有些关联,因为我的Method1和Method2在我的条形图中操纵数据,所以Method1和Method2是否会引入列表参数然后应用到条形图,或者是否可以直接使用条形图而不将参数引入对象,这有一条规则/最佳实践。是否有理由在构建类时不调用这两个方法


在构建实例后的某个时间点调用这两个方法是否有正当的理由

在给定实例上多次调用这些方法是否无效

如果上述任何一项是正确的,那么该功能在第一个选项中不可用,但在第二个选项中可用。如果该功能实际上很重要,那么第一个选项*不提供所需的功能

如果上面所有的问题都是“不”,那么第二个问题就不是一个选择。您提供的功能,消费者只能做错事。他们只会因为没有做正确的事情而破坏事情,所以你最好为他们做正确的事情,不要给他们犯错的机会


另一方面,如果第一个选项没有提供所需的功能,但仍然存在某些限制(即不能多次调用它们,但希望尽可能推迟工作,在完成此工作之前不能调用其他方法等),则两者都是错误的。您需要非常明确地说明您的实际约束是什么,以及所有必需的(可能也是很好的)功能是什么,以尝试找到满足所有约束的解决方案,同时仍然提供所需的所有功能。

在构造类时,是否有正当理由不调用这两个方法


在构建实例后的某个时间点调用这两个方法是否有正当的理由

在给定实例上多次调用这些方法是否无效

如果上述任何一项是正确的,那么该功能在第一个选项中不可用,但在第二个选项中可用。如果该功能实际上很重要,那么第一个选项*不提供所需的功能

如果上面所有的问题都是“不”,那么第二个问题就不是一个选择。您提供的功能,消费者只能做错事。他们只会因为没有做正确的事情而破坏事情,所以你最好为他们做正确的事情,不要给他们犯错的机会


另一方面,如果第一个选项没有提供所需的功能,但仍然存在某些限制(即不能多次调用它们,但希望尽可能推迟工作,在完成此工作之前不能调用其他方法等),则两者都是错误的。您需要非常明确地说明您的实际约束是什么,以及所有必需的(可能也是很好的)功能是什么,以尝试找到一个满足所有约束的解决方案,同时仍然提供所有必需的功能。

您似乎已经回答了自己的问题。您是否有一个更具体的例子,可以更清楚地说明您考虑第二个例子的原因


构造函数应该做所有必要的事情来初始化类,以便它可以使用,就像第一个示例一样。由于从用户的角度来看,条形图是只读的,而且显然初始化条形图列表和包含条形图对象的DoStuff()方法不带任何参数,因此应该在构造函数中执行此操作。

看起来您已经回答了自己的问题。您是否有一个更具体的例子,可以更清楚地说明您考虑第二个例子的原因

构造函数应该做所有必要的事情来初始化类,以便它可以使用,就像第一个示例一样。由于从用户的角度来看,条形图是只读的,而且显然初始化条形图列表和包含的条形图对象的DoStuff()方法不带任何参数,因此应该在构造函数中执行此操作。

您可能会发现
public class Foo
{

    public List<Bar> Bars { get; private set; }

    public Foo()
    {
        Bars = new List<Bar>();
    }

    public void DoStuff()
    {
        Method1();
        Method2();
    }

    private void Method1()
    {
        // code
    }

    private void Method2()
    {
        // code
    }
}