Как применить DRY к итерации кода по разным классам

У меня есть различные классы, которые готовят результаты с соответствующим форматом: Список, где объекты представляют собой List, где объекты являются List. Это необходимо целевому приложению.

Исходные данные поступают из различных систем. Вот один из них:

var results = new List();

using (var csvReader = new CsvReader(exportFilePath))
{
    csvReader.ValueSeparator = '$';
    var header = csvReader.ReadHeaderRecord();

    foreach (var record in csvReader.DataRecords)
    {
        var nameValuePairs = new List();

        foreach (var column in header.Values)
        {
            var nameValuePair = new List(2);
            nameValuePair.Add(column);
            nameValuePair.Add(record[column]);

            nameValuePairs.Add(nameValuePair);
        }

        results.Add(nameValuePairs);
    }
}

return results;

и это, вероятно, самая чистая форма. Вот еще один:

var results = new List();

var searchRootPath = "LDAP://OU=Standard Users Accounts,OU=...,DC=local";
var filter = "(&(objectClass=user)(objectCategory=person))";
var propertiesToLoad = new string[] { "sAMAccountName", "employeeNumber", 
    "mail", "telephoneNumber"};
using (var searchRoot = new DirectoryEntry(searchRootPath))
using (var ds = new DirectorySearcher(searchRoot, filter, propertiesToLoad, SearchScope.OneLevel))
{
    ds.PageSize = 100;

    using (var src = ds.FindAll())
    {
        foreach (SearchResult sr in src)
        {
            var propertyNameValuePairs = new List();

            foreach (var property in propertiesToLoad)
            {
                var propertyNameValuePair = new List(2);
                propertyNameValuePair.Add(property);
                if (sr.Properties[property].Count == 0)
                    propertyNameValuePair.Add("");
                else
                    propertyNameValuePair.Add(sr.Properties[property][0].ToString());

                propertyNameValuePairs.Add(propertyNameValuePair);
            }

            results.Add(propertyNameValuePairs);
        }
    }
}

return results;

Как вы можете видеть, структура повторяется, но способ получения данных отличается. Например, в первом, это запись [столбец], но в последнем это sr.Properties [свойство] [0]. ToString() (с усложнением целого оператора «if»); плюс различия в загрузке данных. Является ли метод шаблонов наилучшим подходом или я что-то упускаю?

0
nl ja de

1 ответы

Предоставьте пользовательские итераторы, которые возвращают объект Name/Value.

Чтобы вы могли использовать их так:

UserCsvReader csvReader = new UserCsvReader();
while (csvReader.Read())
{
    users.Add(csvReader.Current.Name, csvReader.Current.Value);
}

Таким образом вы получаете классы, которые отвечают только за предоставление данных. Фактическая обработка (в этом случае добавляет ее в список) выполняется вызывающим.

2
добавлено
Да. Но преобразование классов в итераторы делает код намного меньшим и, следовательно, более удобным. Все итераторы содержат повторяющийся код.
добавлено автор jgauffin, источник
Я вижу вашу мысль: S SOLID. Но я все еще повторяюсь в пользовательских итераторах. :-(
добавлено автор ssg31415926, источник