繁体   English   中英

是否可以重写此C#方法重复(Lambdas?代表?)?

[英]Can this C# method duplication be rewritten (Lambdas? Delegates?)?

忍受lambda的世界,等等正在伤害我的头部。 我什至不知道下面的代码示例是否是有人使用lambda的示例。

public static void AddDownloadMimeTypesToWebApps()
{
    var webApps = from svc in SPFarm.Local.Services.OfType<SPWebService>()
                  from SPWebApplication webApp in svc.WebApplications
                  where webApp.IsAdministrationWebApplication == false
                  select webApp;
    foreach (SPWebApplication webApp in webApps)
    {
        foreach (FileExtensionData fed in MimeTypes)
        {
            webApp.AllowedInlineDownloadedMimeTypes.Add(fed.MimeType);
        }
        webApp.Update();
    }
}

public static void DeleteDownloadMimeTypesFromWebApps()
{
    var webApps = from svc in SPFarm.Local.Services.OfType<SPWebService>()
                  from SPWebApplication webApp in svc.WebApplications
                  where webApp.IsAdministrationWebApplication == false
                  select webApp;
    foreach (SPWebApplication webApp in webApps)
    {
        foreach (FileExtensionData fed in MimeTypes)
        {
            webApp.AllowedInlineDownloadedMimeTypes.Remove(fed.MimeType);
        }
        webApp.Update();
    }
}

除了Add()或Remove()调用之外,这两种方法都是相同的。

有没有一种方法可以重构这些方法,而不会通过将方法名称作为字符串等传入而涉及一些奇怪的反射调用?

干杯!

最初,我建议您编写一种获取webApp的方法:

public static IEnumerable<SPWebApplication> GetWebApps()
{
    var webApps = from svc in SPFarm.Local.Services.OfType<SPWebService>()
                  from SPWebApplication webApp in svc.WebApplications
                  where webApp.IsAdministrationWebApplication == false
                  select webApp;
    return webApps;   
}

然后,尽管事实上其余的代码非常相似,但是由于它们执行不同的操作,因此我不会将它们加入一种方法。

public static void AddDownloadMimeTypesToWebApps(IEnumerable<SPWebApplication> webApps)
{
    foreach (var webApp in webApps)
    {
        foreach (var fed in MimeTypes)
        {
            webApp.AllowedInlineDownloadedMimeTypes.Add(fed.MimeType);
        }
        webApp.Update();
    }
}

public static void DeleteDownloadMimeTypesFromWebApps(IEnumerable<SPWebApplication> webApps)
{
    foreach (var webApp in webApps)
    {
        foreach (var fed in MimeTypes)
        {
            webApp.AllowedInlineDownloadedMimeTypes.Remove(fed.MimeType);
        }
        webApp.Update();
    }
}

现在,您有三种不同的方法,分别承担三种不同的职责。 第一, GetWebApps ,返回序列WebApps 第二增加下载MIME类型,你作为一个参数传递,网络应用AddDownloadMimeTypesToWebApps ,最后一个, DeleteDownloadMimeTypesFromWebApps删除它们。

这样很容易记住每种方法的确切作用。 它们的目的非常明确。 此外,您不会对方法的使用者隐藏任何需要输入的内容。 例如,某人读取第二种方法的名称。 第一个问题是哪些网络应用程序? 在原始代码中,我们不将Web应用程序作为参数传递,而是将其获取到Mehtod体内。 这是没有意义的,因为根据方法的名称,我们只想将下载的mime类型添加到某些Web应用程序中,而不是获取它们,然后添加下载的mime类型。

最后但并非最不重要的一点是,由于在添加和删除两种情况下Web应用程序的检索都是相同的,因此我们必须将其隔离为一种恰好可以满足此要求的方法。 最后一个动作不仅增强了上述功能,而且清楚地体现了DRY原理, 请不要重复自己 ,这有助于我们编写更具可维护性的代码。 现在,如果将来在任何时候都需要对Web应用程序的检索进行一些更改,则只需要查看一个位置,而不需要两个或多个位置。

如何将这样的东西打包成lambda:

private static void DownloadMimeTypesToWebApps(Action<SPWebApplication,FileExtensionData> action)
{
    var webApps = from svc in SPFarm.Local.Services.OfType<SPWebService>()
              from SPWebApplication webApp in svc.WebApplications
              where webApp.IsAdministrationWebApplication == false
              select webApp;
    foreach (SPWebApplication webApp in webApps)
    {
       foreach (FileExtensionData fed in MimeTypes)
       {
           action.Invoke(webApp,fed);
       }

       webApp.Update();
    }   

}

public static void AddDownloadMimeTypesToWebApps()
{
    DownloadMimeTypesToWebApps((webApp,fed) => webApp.AllowedInlineDownloadedMimeTypes.Add(fed.MimeType));
}

public static void DeleteDownloadMimeTypesToWebApps()
{
    DownloadMimeTypesToWebApps((webApp,fed) => webApp.AllowedInlineDownloadedMimeTypes.Remove(fed.MimeType));        
}

那仅仅是一个普通的旧参数又如何呢?

public static void EditMimeTypesToWebApps(int editType) // maybe you can make it an enum
{
    var webApps = from svc in SPFarm.Local.Services.OfType<SPWebService>()
                  from SPWebApplication webApp in svc.WebApplications
                  where webApp.IsAdministrationWebApplication == false
                  select webApp;
    foreach (SPWebApplication webApp in webApps)
    {
        foreach (FileExtensionData fed in MimeTypes)
        {   
            if(editType == 0)
            {
                webApp.AllowedInlineDownloadedMimeTypes.Remove(fed.MimeType);
            }
            else
            {
                webApp.AllowedInlineDownloadedMimeTypes.Add(fed.MimeType);
            }
        }
        webApp.Update();
    }
}

足够容易阅读。 易于维护,适合任何级别。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM