Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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# 优雅地设计一个包含2个重载的方法,一个接受一个对象,另一个不接受';T_C#_Oop - Fatal编程技术网

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的引用变量,创建不包含该变量的重写

为了补充Daniel所说的,SpecialObject构造函数需要userId和clientId,Method1有,但Method2没有。+1,特别是第一点。既然companyId出现在这两个版本中,它应该是第一个。这样,其余参数要么是参数列表,要么是包含所有参数的对象实例/值。