Nick Prozee
Nick Prozee

Reputation: 2913

How to determine wether it is better to create an object on method or on object

I was wondering how I should decide to create an object, on method or class instance.
Below a few examples to clarify. I want to the best approach to know how I should determine to choose between example 1 and 2.

IMPORTANT: Consider this a Windows Service (SVC) hosted in IIS.

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

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

Upvotes: 1

Views: 78

Answers (4)

Praveena
Praveena

Reputation: 96

If you want to limit the scope of the object to a method, It can be done by using "Method injection" as shown below. You can use the other setter and constructor injection methods if the scope of the object is through out the class.

    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();
     }
    }

Upvotes: 0

Patrick Hofman
Patrick Hofman

Reputation: 156948

It is all about state. Will the object preserve some state between the two method calls, or even within the method, or not? If so, you should keep the object alive. Else, you can create a new object every time you call the method, or maybe even make the method static if there is never any state involved.

So:

  • Class preserves state that should be kept across methods: make a class variable or pass the object along the methods.
  • Class preserves state that should be kept within the same method: make a local variable.
  • Class doesn't preserve any state: make the method static, no instance needed.

Upvotes: 3

user853710
user853710

Reputation: 1767

It is better to leave it inside of a method. Usually, it is being done inside of the constructor. This has the favor that it can incorporate a factory for different scenarios, or that it can be easily injected. I would strongly suggest to separate the responsibilities of the properties and let them be used as needed.

Upvotes: 0

The golden rule is to keep the scope as local as possible. From the second example if you are going to use doSomething() everywhere then it is better to create it once and have class level scope. If you need doSomething() only in one method, create the object locally within the method.

Upvotes: 3

Related Questions