2013-07-01 3 views
1

Я вижу код в нашей унаследованной системе, где общедоступные методы класса, клонируют объект, выполняют мутацию состояния и возвращают новую копию объекта.Должен ли метод объекта возвращать новую копию объекта

Это просто неправильно, но просто интересно, знает ли кто-нибудь об известной причине. В противном случае, если кто-нибудь знает о действительно плохих причинах сделать это, вы можете помочь. Мне просто нужно вооружиться некоторыми аргументами и для этой ситуации, прежде чем я пойду и предложим большие перемены.

Благодаря

Пример кода

public Class MyClass 
{ 
    public string MyProp { get; set; } 
    public MyClass Cancel() 
    { 
     var newObj = this.Clone(); 
     newObj.Status = Status.Cancelled; 
     return newObj; 
    } 
} 
+0

Я уверен, что есть причина, по которой ваша устаревшая система делает это. – Uooo

+1

Похоже на применение [неизменности] (http://en.wikipedia.org/wiki/Immutable_object), который имеет некоторые очень хорошие преимущества (а также очевидные недостатки). – Oak

+1

Это изменение, которое может легко привести к ошибкам/ошибкам - так что если у вас нет хороших тестов и нет причин для бизнеса, не делайте этого. Это не имеет никакого отношения к прямой оо, это больше вопрос о протоколе и семантике ваших классов, если имеет смысл возвращать новые экземпляры или выполнять изменения на копии. – weismat

ответ

7

Это типичный шаблон с immutable объектов, как String в Java или .Net, например. Возвращая новый объект с изменением, ссылки на старый объект не видят изменения состояния. Быть способным полагаться на не меняющийся объект может быть очень полезным. Разумеется, неизменяемые объекты приходят со стоимостью, что каждое изменение состояния требует выделения нового экземпляра.


Как MattDavey точки в комментариях по этому вопросу, что образец кода (при условии, что недостающие биты добавлены в) создает класс с изменяемыми экземплярами, потому что MyProp «s set является общедоступным. Таким образом, кажется, что он обеспечивает невосприимчивость к Status, но не для MyProp, что было бы довольно необычно. Это более типично для того, чтобы экземпляр был неизменным или нет, но не частично. Я предполагаю, что это побочный продукт редактирования кода для вопроса, хотя ...

+0

Строки хранятся в пулах, что уменьшает количество фактических экземпляров. –

+0

@Templar: Иногда и действительно, это одно из преимуществ непреложных объектов. Не по умолчанию в Java (кроме литералов). Я не могу говорить за .Net. –

+0

То же самое относится к .NET. – MattDavey

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