Как реорганизовать операцию для списка <объект> / объект?

1

Я работаю над видом mapper, который использует System.Reflection, и в одном случае у меня есть возможности иметь список объектов или обычный объект в моем значении и сделать с ним некоторую логику.

Похоже, это меньше:

if (myValue is IList) {
    foreach (var value in myValue) {
        ...
        DoSth(value);
        ...
    }
} else {
    ...
    DoSth(myValue);
    ...
}

и у меня нет концепции рефакторинга, и в этом случае не DoSth() код (DoSth()). Есть ли способ сделать это лучше?

  • 2
    Я бы не назвал два вызова DoSth() «дублированным кодом». Я вижу твой код в порядке.
  • 5
    Я не вижу проблемы. Многократный вызов методов - это не то, что вы называете дублирующим кодом . Если вы определили это так, вам не следует вызывать какой-либо метод дважды, что сводит на нет весь смысл методов. Дублирующий код - это некоторый фрагмент кода, повторяемый более чем одним методом.
Показать ещё 2 комментария
Теги:
refactoring

1 ответ

2

Если вероятное дерево относительно короткое, вы можете сделать что-то вроде:

void Process(object myValue) {
    if(myValue is IList) {
        foreach(object child in (IList)myValue) {
            Process(child);
        }
        return;
    }
    ...
    DoSth(myValue);
    ...
}

Если дерево глубокое, вы можете использовать объект стека или очереди (в зависимости от глубины - сначала vs bredth-first), чтобы исключить исключения переполнения из стеков-погружений.

Отметим также, что рекурсия является проблемой здесь; например, рассмотрим:

List<object> evil = new List<object>();
evil.Add(evil); // tempting to add a .Beget() extension method here
Process(evil);
  • 0
    Это может быть хорошей идеей, спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню