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
}
}