如何确定是在方法上还是在对象上创建对象更好

本文关键字:更好 创建对象 对象 方法 何确定 | 更新日期: 2023-09-27 18:35:44

我想知道如何决定在方法或类实例上创建一个对象.
下面有几个例子来澄清。我想找到最好的方法来了解我应该如何确定在示例 1 和 2 之间进行选择。
重要说明:将此视为 IIS 中托管的 Windows 服务 (SVC)。例 1

public class mySvcService
{
    ReusableClass rClass = new ReusableClass();
    public void MethodOne()
    {
        //Do Method One Stuff...
        rClass.doSomething();
    }
    public void MethodTwo()
    {
        //Do Method Two Stuff...
        rClass.doSomething();
    }
}
public class ReusableClass
{
    string valueOne;
    string valueTwo;
    string valueThree;
    public void doSomething()
    {
        //DoSomeWork
    }   
}

例 2

public class mySvcService
{
    public void MethodOne()
    {
        ReusableClass rClass = new ReusableClass();
        //Do Method One Stuff...
        rClass.doSomething();
    }
    public void MethodTwo()
    {
        ReusableClass rClass = new ReusableClass();
        //Do Method Two Stuff...
        rClass.doSomething();
    }
}
public class ReusableClass
{
    string valueOne;
    string valueTwo;
    string valueThree;
    public void doSomething()
    {
        //DoSomeWork
    }   
}

如何确定是在方法上还是在对象上创建对象更好

这完全与状态有关。对象是否会在两个方法调用之间保留某种状态,甚至在方法中保留某种状态?如果是这样,则应使对象保持活动状态。否则,您可以在每次调用该方法时创建一个新对象,或者如果从不涉及任何状态,甚至可以将该方法设为静态。

所以:

    类保留
  • 了应该跨方法保留的状态:创建一个类变量或沿方法传递对象。
  • 类保留应保留在同一方法中的状态:创建一个局部变量。
  • 类不保留任何状态:使方法静态,不需要实例。

黄金法则是尽可能保持范围本地。从第二个例子中,如果你打算在任何地方使用 doSomething(),那么最好创建它一次并具有类级范围。如果只需要在一个方法中执行 doSomething(),请在该方法中本地创建对象。

最好将其保留在方法中。通常,它是在构造函数内部完成的。这样做的好处是它可以针对不同的场景合并工厂,或者可以轻松注入。我强烈建议将属性的职责分开,并根据需要使用它们。

如果要将对象的范围限制为方法,可以使用"方法注入"来完成,如下所示。如果对象的范围贯穿于类,则可以使用其他 setter 和构造函数注入方法。

    public interface IReusable
    {
     void doSomething();
    }
    public class Reusable: IReusable
    {
     public void doSomething()
     {
     //To Do: Some Stuff
     }
    }
    public class mySvcService
    {
     private IReusable _reuse;
     public void MethodOne(IReusable reuse)
     {
     this._reuse= reuse;
     _reuse.doSomething();
     }
     public void MethodTwo(IReusable reuse)
     {
     this._reuse= reuse;
     _reuse.doSomething();
     }
    }