C# 优雅地设计一个包含2个重载的方法,一个接受一个对象,另一个不接受';T
我需要设计一个方法,它可以潜在地将一个对象作为参数,如果它不这样做,那么该方法必须自己创建一个新对象 这是一个好方法吗C# 优雅地设计一个包含2个重载的方法,一个接受一个对象,另一个不接受';T,c#,oop,C#,Oop,我需要设计一个方法,它可以潜在地将一个对象作为参数,如果它不这样做,那么该方法必须自己创建一个新对象 这是一个好方法吗 public void Method1(int companyId, int userId, int clientId) { Method1(null, companyId, userId, clientId); } public void Method1(SpecialObject o, int companyId) { if(o == null)
public void Method1(int companyId, int userId, int clientId)
{
Method1(null, companyId, userId, clientId);
}
public void Method1(SpecialObject o, int companyId)
{
if(o == null)
o = new SpecialObject(userId, clientId);
}
我不会那么做的。听起来这超出了
Method1
的范围/职责。为什么你不能在调用Method1
之前构造SpecialObject
?对我来说似乎是一个非常好的设计模式
(我不知道你的“o”的首字母是否有效,但这不是重点)
我在编写单元测试时使用了类似的方法
在正常(非测试)情况下,被测试的类构造自己的成员对象。然而,当它被测试时,如果合适的话,我可以通过一个模拟或存根来使用
例如,这里有一些C++(我知道问题不是C++,而是技术是可转移的)代码来说明我使用的技术。
class Foo {
public:
Foo() : m_bar(new Bar()) {}//normal (non-test constructor)
Foo(Bar* bar) : m_bar(bar) {} //constructor used when unit testing
private:
Bar * m_bar;
};
这里的区别是,我使用构造函数,而不是一般的方法这不是一个好的设计。如果Method1是一个创建操作,它应该返回正在创建的对象。如果是常规更新操作,则应要求提前创建对象
最有可能的是,Method1的主体实际上应该是SpecialObject的方法(然后可能只接收companyId)。根据Daniel的回答,我经常使用以下模式:
public void Method1(int companyId, int userId, int clientId)
{
Method1(new SpecialObject(userId, clientId), companyId);
}
public void Method1(SpecialObject o, int companyId)
{
// if needed
if (o == null)
{
throw new ArgumentNullException("o")
}
...
}
您的代码片段不清楚。在第一次重写中,调用尚未显示的Method1重写。在第二个重写中,将userId和clientId传递给SpecialObject的构造函数,但不显示userId和clientId的定义位置 无论如何,一些通用方法包括
- 对参数进行排序,以便将出现在更多替代中的参数放在第一位
- 期望引用变量为非null(检查并可能引发ArgumentNullException),以及
- 对于可以为null的引用变量,创建不包含该变量的重写