2015-04-14 3 views
1

Скажем, у меня есть WriteItem класс, который выглядит следующим образом:Побочные эффекты на предметы коллекции или возврат новой коллекции?

public class WriteItem 
{ 
    public string Name { get; set; } 
    public object Value { get; set; } 
    public int ResultCode { get; set; } 
    public string ErrorMessage { get; set;} 
} 

мне нужно обработать каждый элемент и установить его ResultCode и ErrorMessage свойства и я, хотя об определении метода, подобную этой:

public void ProcessItems(WriteItemCollection items) 
{ 
    foreach(var item in items) 
    { 
     // Process each item and set its result. 
    } 
} 

Обработка каждого элемента выполняется другим классом.

Это лучший способ сделать это?

Или лучше, чтобы метод возвращал коллекцию пользовательского класса результатов?

+2

«лучше» очень субъективно - но я не вижу ничего плохого в вашем методе. –

+0

«лучший» - это то, что вам подходит – adricadar

+0

Просто отредактировано, чтобы указать, что другой класс заботится о обработке элементов. – mainvoid

ответ

1

Оба варианта имеют свои преимущества и недостатки. Оба являются «прекрасными» в том смысле, что с ними нет ничего плохого, и они обычно используются в C#.

Вариант 1 имеет большое преимущество быть простым и легким. Вы даже можете сохранить ссылку на экземпляр WriteItem и проверить его статус после обработки.

Вариант 2 имеет более четкое разделение проблем: в Варианте 1 вам необходимо добавить комментарии к вашему классу WriteItem, чтобы определить, какие из них являются «входными» и которые являются «выходными» свойствами. Вариант 2 не нуждается в этом. Кроме того, Вариант 2 позволяет сделать WriteItem и ProcessingResult неизменным, что является хорошим свойством.

Вариант 2 также более расширяемый: Если вы хотите обработать что-то другое, чем WriteItem с (с теми же параметрами возврата), вы можете определить класс

class ProcessingResult<T> 
{ 
    public T Item { get; set; } 
    public int ResultCode { get; set; } 
    public string ErrorMessage { get; set; } 
} 

и использовать его в качестве ProcessingResult<WriteItem>, а также ProcessingResult<SomeOtherItem> ,

0

То, что вы написали, будет работать. Вы можете изменять свойства объекта без побочных эффектов во время итерации в коллекции.

Я бы не возвратил новую коллекцию, если вам не нужно хранить копию оригинальной коллекции нетронутой.

0

Я думаю, что все сводится к читабельности.

Когда вы вызываете ProcessItems, очевидно ли, что коллекция изменилась? Если вызвать метод следующим образом:

var items = GetItemsFromSomewhere(); 
ProcessItems(items); 

против называя это так:

var items = GetItemsFromSomewhere(); 
items = ProcessItems(items); 

или просто изменить свой имяМетода:

var items = GetItemsFromSomewhere(); 
items = UpdateItemStatuses(items); 

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

0

Лучше вернуть новый класс результатов.

Почему?

Как уже сообщалось, вы изменяете коллекцию, и это не совсем понятно. Но для меня это не главная причина. У вас могут быть процессы, которые изменяют объекты.

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

У вас также есть другой метод: ProcessItems_ForSomeOtherPurpose(List<WriteItem> items) Вы хотите расширить свой ResultCode int, чтобы иметь более значимые значения? вы добавляете другое свойство ResultCode_ForSomeOtherPurpose? что, если вам нужно обрабатывать один и тот же элемент несколько раз с несколькими процессорами?

Я бы дал вашей модели Id. Затем вы можете зарегистрировать несколько процессов против него

например.

пункт 1 - загружен

пункт 1 - собирание не удалось!

пункт 1 - выбрал

пункт 1 - поставляется

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