2016-12-14 5 views
0

У меня есть код, который имеет такой способ, который модифицирует и возвращает переданный объект.Изменить и вернуть переданный параметр

Это сильно напоминает мне неприятный запах кода.

public class Creator { 
    public MyClass create(MyClass param) { 

    SomeClass attr1 = createAttr1(); 
    SomeClass attr2 = createAttr2(); 
    //... more creation 

    param.setAttr1(attr1); 
    param.setAttr2(attr2); 
    //... set other created attributes. 

    return param; 
    } 
} 


public class MyApp { 
    public static void main(String[] args) { 
    Creator creatorProcesss = new Creator(); 
    MyClass myClass = new MyClass(); 
    myClass = creatorProcesss.create(myClass); 
    } 
} 

Есть ли правильный способ рефакторинга?

ответ

3

Вы можете изменить тип возвращаемого вашего метода void и использование стало бы:

creatorProcesss.create(myClass); 

Или еще лучше:

creatorProcesss.initialize(myClass); 

, поскольку ваш метод не создает new instance, он инициализирует прошедший экземпляр.

Вы можете также обратный процесс - есть initialize метод в MyClass, который принимает Creator аргумент и модифицированный текущий MyClass экземпляра.

Тогда вы main бы стать:

Creator creatorProcesss = new Creator(); 
MyClass myClass = new MyClass(); 
myClass.initialize(creatorProcesss); 
0

Когда вы передаете ссылку, вы можете просто определить подпись как void вместо возвращения той же ссылки. Кроме того, вы можете вернуть логический флаг, основанный на успехе операции внутри вашего метода.

public class Creator { 
    public void create(MyClass param) { 

    SomeClass attr1 = createAttr1(); 
    SomeClass attr2 = createAttr2(); 
    //... more creation 

    param.setAttr1(attr1); 
    param.setAttr2(attr2); 
    //... set other created attributes. 

    return; 
    } 
} 
0

Я согласен, что это выглядит как неприятный запах кода - в частности, вы вводите side-effects, делая это.

Кроме того, почему объект должен быть создан (в том, что представляется полуинициализированным состоянием), а затем модифицируется впоследствии? Вероятно, я попытаюсь найти способ полностью инициализировать объект, прежде чем пытаться его использовать, возможно, используя фабрику или Builder Pattern (в интересах полного раскрытия эта ссылка указывает на одну из моих собственных статей).

Смежные вопросы