[英]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.