如何将DRY应用于迭代不同类的代码

时间:2012-12-28 08:20:18

标签: design-patterns

我有各种类以匹配的格式准备结果:一个List,其中对象是List,其中对象是List。这是目标应用程序所必需的。

源数据来自各种系统。这是一个:

var results = new List<object>();

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

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

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

            nameValuePairs.Add(nameValuePair);
        }

        results.Add(nameValuePairs);
    }
}

return results;

这可能是最干净的形式。这是另一个:

var results = new List<object>();

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<object>();

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

                propertyNameValuePairs.Add(propertyNameValuePair);
            }

            results.Add(propertyNameValuePairs);
        }
    }
}

return results;

如您所见,结构重复,但获取数据的方式不同。例如,在前者,它的记录[列],但在后者,它的sr.Properties [属性] [0] .ToString()(与整个&#39;如果&#39的复杂性;声明);加上加载数据的差异。模板方法是最好的方法还是我错过了什么?

1 个答案:

答案 0 :(得分:2)

提供返回名称/值对象的自定义迭代器。

这样你就可以使用它们:

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

通过这种方式,您可以获得仅负责提供数据的类。实际处理(在这种情况下将其添加到列表中)由调用者完成。