Как применить 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, источник