簡體   English   中英

我該怎么寫這個更短?

[英]How can I write this shorter?

public static string GetUa(HttpRequest hr)
{
    try
    {
        string visitorBrowser = hr.UserAgent.ToString();
        string originalBrowser = hr.ServerVariables["X-OperaMini-Phone-UA"];
        string anotherOriginalBrowser = hr.ServerVariables["X-Device-User-Agent"]; //novarra

        if (!String.IsNullOrEmpty(originalBrowser))
        {
            return "OPERAMINI " + originalBrowser;
        }
        else
        {
            if (!String.IsNullOrEmpty(anotherOriginalBrowser))
            {
                return "NOVARRA " + anotherOriginalBrowser;
            }
            else
            {
                return visitorBrowser;
            }
        }
    }
    catch
    {
        return "No UA Found";
    }
}

我更關心可讀性。 這對我來說似乎更好:

var operaAgent = hr.ServerVariables["X-OperaMini-Phone-UA"];
var deviceAgent = hr.ServerVariables["X-Device-User-Agent"];

operaAgent = string.IsNullOrEmpty(operaAgent) ? null : "OPERAMINI" + operaAgent;
deviceAgent = string.IsNullOrEmpty(deviceAgent) ? null : "NOVARRA" + deviceAgent;

return operaAgent ?? deviceAgent ?? hr.UserAgent ?? "Not Found";

當然,如果您不需要將這些字符串作為UA的前綴,並且不需要關注空字符串用戶代理,那么它只是:

return hr.ServerVariables["X-OperaMini-Phone-UA"] ??
       hr.ServerVariables["X-Device-User-Agent"] ??
       hr.UserAgent ??
       "Not Found";

我認為沒有任何方法可以大大縮短這一點。

保存幾行的一種方法是擺脫第一個周圍的大括號:

if (!String.IsNullOrEmpty(originalBrowser))
{
    return "OPERAMINI " + originalBrowser;
}
else if (!String.IsNullOrEmpty(anotherOriginalBrowser))
{
    return "NOVARRA " + anotherOriginalBrowser;
}
else if (!String.IsNullOrEmpty(visitorBrowser))
{
    return visitorBrowser;
}
else
{
    return "No User Agent Detected";
}

您也應該小心使用流控制的異常。 statenjason有正確的想法。

現在,你所擁有的是清晰易讀的。 如果你想用更少的處理時間到達那里,我認為你不會去做。 如果你想用更少的代碼行來到那里,你可以,但它會變得很難看。

在屏幕上縮短它的一種簡單方法(相同的LOC計數,-1)是刪除一些花括號而不是存儲visitorBrowser

public static string GetUa(HttpRequest hr)
{
    try
    {
        string originalBrowser = hr.ServerVariables["X-OperaMini-Phone-UA"];
        string anotherOriginalBrowser = hr.ServerVariables["X-Device-User-Agent"]; //novarra

        if (!String.IsNullOrEmpty(originalBrowser))
            return "OPERAMINI " + originalBrowser;
        else
            if (!String.IsNullOrEmpty(anotherOriginalBrowser))
                return "NOVARRA " + anotherOriginalBrowser;
            else
                return hr.UserAgent.ToString();
    }
    catch
    {
        return "No UA Found";
    }
}

對我來說,這可讀性稍差,但可能仍然適合居住。

現在你可以通過使用條件運算符( ?: :)來使它變得非常簡短,但它對於可讀性來說也是非常討厭的。 如果我在代碼審查中看到如下代碼,我會讓開發人員為了清楚起見重寫它:

public static string GetUa(HttpRequest hr)
{
    try
    {
        string visitorBrowser = hr.UserAgent.ToString();
        string originalBrowser = hr.ServerVariables["X-OperaMini-Phone-UA"];
        string anotherOriginalBrowser = hr.ServerVariables["X-Device-User-Agent"]; //novarra

        return !(string.IsNullOrEmpty(originalBrowser)) ? "OPERAMINI " + originalBrowser :
               !(string.IsNullOrEmpty(anotherOriginalBrowser)) ? "NOVARRA " + anotherOriginalBrowser : visitorBrowser);
    }
    catch 
    {
        return "No UA Found";
    }
}

說真的, 不要做第二個例子。 (我不是百分百肯定會編譯;我現在正在Mac上寫下它。但我99.9%肯定它會,並且會工作,下一個開發人員會討厭你為它。)

像這樣,例如:

public static string GetUa(HttpRequest hr) {
  try {
    string originalBrowser = hr.ServerVariables["X-OperaMini-Phone-UA"];
    string anotherOriginalBrowser = hr.ServerVariables["X-Device-User-Agent"];
    return
      !String.IsNullOrEmpty(originalBrowser) ? "OPERAMINI " + originalBrowser :
      !String.IsNullOrEmpty(anotherOriginalBrowser) ? "NOVARRA " + anotherOriginalBrowser :
      hr.UserAgent;
  } catch {
    return "No UA Found";
  }
}

像這樣(其他一切只是額外的代碼什么都不做):

public static string GetUa(HttpRequest hr) 
{ 
    if (!String.IsNullOrEmpty(hr.ServerVariables["X-OperaMini-Phone-UA"])) 
        return "OPERAMINI " + hr.ServerVariables["X-OperaMini-Phone-UA"])) ; 
    if (!String.IsNullOrEmpty(hr.ServerVariables["X-Device-User-Agent"])) 
        return "NOVARRA " +   hr.ServerVariables["X-Device-User-Agent"])) ; 
    return hr.UserAgent ?? "Not Found"; 
} 

並且您不應該在正常的應用程序流路徑中使用異常。

這是一個濃縮版本。 因為你正在每個if語句中return ,你可以消除你的else 此外,我消除了使用流異常的需要。

    public static string GetUa(HttpRequest hr)
    {
        string visitorBrowser = hr.UserAgent;
        string originalBrowser = hr.ServerVariables["X-OperaMini-Phone-UA"];
        string anotherOriginalBrowser = hr.ServerVariables["X-Device-User-Agent"]; //novarra
        if (string.IsNullOrEmpty(visitorBrowser))
            return "No UA Found";
        if (!String.IsNullOrEmpty(originalBrowser))
            return "OPERAMINI " + originalBrowser;
        if (!String.IsNullOrEmpty(anotherOriginalBrowser))
            return "NOVARRA " + anotherOriginalBrowser;
        return visitorBrowser;
    }
public static string GetUa(HttpRequest hr)
{
    try
    {
        string visitorBrowser = hr.UserAgent.ToString();
        string originalBrowser = hr.ServerVariables["X-OperaMini-Phone-UA"];
        if (!String.IsNullOrEmpty(originalBrowser)) return "OPERAMINI"+originalBrowser;
        string anotherOriginalBrowser = hr.ServerVariables["X-Device-User-Agent"]; //novarra
        if (!String.IsNullOrEmpty(anotherOriginalBrowser)) return "NOVARRA" + anotherOriginalBrowser;
        return visitorBrowser;
    }
    catch
    {
        return "No UA Found";
    }
}

第二個if-statment:

return (!String.IsNullOrEmpty(anotherOriginalBrowser) ? ("NOVARRA " + anotherOriginalBrowser) : visitorBrowser);

您也可以將此與第一個if-statment結合使用

我不喜歡什么時候做它不需要做的工作。 所以我會寫如下:

   public static string GetUa(HttpRequest hr)
    {
        string browser = hr.ServerVariables["X-OperaMini-Phone-UA"];
        if (!String.IsNullOrEmpty(browser))
            return "OPERAMINI " + browser;

        browser = hr.ServerVariables["X-Device-User-Agent"]; //novarra 
        if (!String.IsNullOrEmpty(browser))
            return "NOVARRA " + browser;

        if (!String.IsNullOrEmpty(hr.UserAgent))
            return hr.UserAgent;

        return "No UA Found";
    } 

一種稍微動態的.NET 4方法:

    private static readonly Tuple<string, string>[] SpecialUas =
        {
            Tuple.Create("X-OperaMini-Phone-UA", "NOVARRA"),
            Tuple.Create("X-Device-User-Agent", "OPERAMINI")
        };

    public static string GetUa(HttpRequest r)
    {
        return (
                   from specialUa in SpecialUas
                   let serverVariable = r.ServerVariables[specialUa.Item1]
                   where !string.IsNullOrEmpty(serverVariable)
                   select string.Concat(specialUa.Item2, " ", serverVariable)
               ).FirstOrDefault() ?? (
                   string.IsNullOrEmpty(r.UserAgent)
                   ? "No UA Found"
                   : r.UserAgent
               );
    }

通過添加更多元組,可以非常輕松地使用其他特殊UA進行自定義。

如果你沒有在.NET 4上運行,用其他東西替換元組並不困難。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM