C# 是否可以重写此C方法副本(Lambdas?委托?)?

C# 是否可以重写此C方法副本(Lambdas?委托?)?,c#,lambda,refactoring,C#,Lambda,Refactoring,请容忍我,兰姆达斯等的世界让我头疼。我甚至不确定下面的代码示例是否有人会使用lambda public static void AddDownloadMimeTypesToWebApps() { var webApps = from svc in SPFarm.Local.Services.OfType<SPWebService>() from SPWebApplication webApp in svc.WebApplications

请容忍我,兰姆达斯等的世界让我头疼。我甚至不确定下面的代码示例是否有人会使用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调用之外,这两种方法都是相同的

有没有一种重构方法不涉及一些奇怪的反射调用,将方法名作为字符串传递,等等


干杯

一个普通的旧参数怎么样?如果有其他参数呢

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

容易阅读。任何级别都可以轻松维护。

一个普通的旧参数怎么样?如果是,则:

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

容易阅读。任何级别都可以轻松维护。

首先,我建议您编写一种获取webApps的方法:

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

现在,您有三种不同的方法和三种不同的职责。第一个是GetWebApps,返回WebApps的序列。第二个参数将下载mime类型添加到作为参数传递的web应用中,即AddDownloadMimetypeTowebapps,最后一个参数是DeleteDownloadMimeTypesFromWebApps delete

通过这种方式,很容易记住每个方法的具体作用。他们的目的非常明确。此外,您也不会向方法的使用者隐瞒所需的输入。例如,有人读取第二个方法的名称。第一个问题是哪些web应用程序?在原始代码中,我们不将web应用程序作为参数传递,而是在方法体中获取它们。这是没有意义的,因为根据方法的名称,我们只想将下载mime类型添加到一些web应用程序中,而不是获取它们,然后添加下载mime类型


最后但并非最不重要的一点是,由于web应用程序的检索对于添加和删除两种情况都是相同的,因此我们必须将其分离为一种方法,该方法正好可以满足这一要求。最后一个动作不仅增强了上面提到的功能,而且还明确应用了DRY原则,即不要重复自己,这有助于我们编写更易于维护的代码。现在,如果将来您需要在检索web应用程序时进行一些更改,您将只有一个位置,而不是两个或多个位置。最初,我建议您编写一种获取web应用程序的方法:

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

现在,您有三种不同的方法和三种不同的职责。第一个是GetWebApps,返回WebApps的序列。第二个参数将下载mime类型添加到作为参数传递的web应用中,即AddDownloadMimetypeTowebapps,最后一个参数是DeleteDownloadMimeTypesFromWebApps delete

通过这种方式,很容易记住每个方法的具体作用。他们的目的非常明确。此外,您也不会向方法的使用者隐瞒所需的输入。例如,有人读取第二个方法的名称。第一个问题是哪些web应用程序?在原始代码中,我们不将web应用程序作为参数传递,而是在方法体中获取它们。这是没有意义的,因为根据方法的名称,我们只想将下载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));        
}

像这样的东西怎么样,我们可以把唯一的代码变成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));        
}

@克里斯托斯的回答更符合我通常的重构方式。我认为这个答案是正确的,因为它符合我原来问题的目的。我想问一下作为后续。。。对于某些人来说,哪种重构更可取,这会有所不同吗?lambda语法还是Christos回答的语法,在我听说Lambdas之前,我会这样做?提前感谢您的回复!这对看到lambda非常有帮助。我的头脑仍然在试图理解参数的工作方式。干杯@克里斯托斯的回答更符合我通常的重构方式。我认为这个答案是正确的,因为它符合我原来问题的目的。我想问一下作为后续。。。这对一个人来说有区别吗
哪种重构更可取?lambda语法还是Christos回答的语法,在我听说Lambdas之前,我会这样做?提前感谢您的回复!这对看到lambda非常有帮助。我的头脑仍然在试图理解参数的工作方式。干杯我在很久以前就做过这样的方法,但我更倾向于让这些方法在它的功能上更加独特。更清楚的是,调用一个名为Delete*或Add*的方法将或者至少应该这样做。谢谢你的回答。我将lambda的示例标记为与我的原始问题所要学习的内容相符。再次感谢!干杯:没问题,这是我的观点。每个人都有自己的风格:-我在遥远的过去做过这样的方法,但我更喜欢这种方法在它的功能上更加独特。更清楚的是,调用一个名为Delete*或Add*的方法将或者至少应该这样做。谢谢你的回答。我将lambda的示例标记为与我的原始问题所要学习的内容相符。再次感谢!干杯:没问题,这是我的观点。每个人都有自己的风格:-谢谢你的回复。事实上,我通常会做一些有影响的事情。我通常把提取的WebApps代码称为FilterWebApps。您的重构与我通常编写的内容基本相同:我的兴趣是学习更多关于lambdas的知识,以及如何将它们应用到我的代码中。我觉得由于没有更好地理解lambdas/anonymous函数,我缺少了编码的一个相当重要的部分。干杯谢谢你的回复。事实上,我通常会做一些有影响的事情。我通常把提取的WebApps代码称为FilterWebApps。您的重构与我通常编写的内容基本相同:我的兴趣是学习更多关于lambdas的知识,以及如何将它们应用到我的代码中。我觉得由于没有更好地理解lambdas/anonymous函数,我缺少了编码的一个相当重要的部分。干杯