C#的編碼規(guī)范詳細(xì)說明
首先我們要明白一下幾點(diǎn),
1.代碼寫出來除了讓他跑起來還有個非常非常重要的作用是維護(hù),因?yàn)闆]有一成不變的代碼,需求變化代碼就不可避免的要變化。
2.你不是一個人在寫代碼,你身后有一個團(tuán)隊(duì),這個團(tuán)隊(duì)中任何一個人都有可能會改你的代碼,你如果寫的不規(guī)范,后面的人會跟著寫。舉一個例子,最初的代碼可能是這樣的,
if (OrderInfo.O_OrdersEntity.DirectFlightChannel.Trim().ToUpper() == "CZ-SP")
{
OrderCostAndWeightEntity e = new OrderCostAndWeightEntity();
e.FlightAgency = InsuranceCommon.GetStrategyFlightAgencyNew(OrderInfo.O_OrdersEntity.DirectFlightChannel);
e = ReGetFlight.GetDirectFlightHighWeightEntity(OrderInfo.O_FlightEntity, "", e.FlightAgency);
e.Sendticketcity = int.Parse(ConfigurationManager.AppSettings["SendticketcityOfDirectFlights_HU"].ToString());
regetFlightInitData.HighCostAndWeightEntity = e;
regetFlightInitData.TicketType = "0001";
//如果是海航,則不需要政策倒查驗(yàn)證
regetFlightInitData.ReSearchNoFlight = false;
}
else
{
OrderCostAndWeightEntity e = new OrderCostAndWeightEntity();
e.Sendticketcity = int.Parse(ConfigurationManager.AppSettings["SendticketcityOfDirectFlights_HU"].ToString());
e.FlightAgency = InsuranceCommon.GetStrategyFlightAgencyNew(OrderInfo.O_OrdersEntity.DirectFlightChannel);
e.CostRate1 = 1.0M;
regetFlightInitData.HighCostAndWeightEntity = e;
//如果是海航,則不需要政策倒查驗(yàn)證
regetFlightInitData.ReSearchNoFlight = false;
}
但是過一時間又來個需求,對于“MU-WS”也需要走上面的邏輯,你會怎么寫,如果你只是完成任務(wù)可能會像下面這樣寫
if (OrderInfo.O_OrdersEntity.DirectFlightChannel.Trim().ToUpper() == "CZ-SP" || OrderInfo.O_OrdersEntity.DirectFlightChannel.Trim().ToUpper() == "MU-WS")
{
OrderCostAndWeightEntity e = new OrderCostAndWeightEntity();
e.FlightAgency = InsuranceCommon.GetStrategyFlightAgencyNew(OrderInfo.O_OrdersEntity.DirectFlightChannel);
e = ReGetFlight.GetDirectFlightHighWeightEntity(OrderInfo.O_FlightEntity, "", e.FlightAgency);
e.Sendticketcity = int.Parse(ConfigurationManager.AppSettings["SendticketcityOfDirectFlights_HU"].ToString());
regetFlightInitData.HighCostAndWeightEntity = e;
regetFlightInitData.TicketType = "0001";
//如果是海航,則不需要政策倒查驗(yàn)證
regetFlightInitData.ReSearchNoFlight = false;
}
else
{
OrderCostAndWeightEntity e = new OrderCostAndWeightEntity();
e.Sendticketcity = int.Parse(ConfigurationManager.AppSettings["SendticketcityOfDirectFlights_HU"].ToString());
e.FlightAgency = InsuranceCommon.GetStrategyFlightAgencyNew(OrderInfo.O_OrdersEntity.DirectFlightChannel);
e.CostRate1 = 1.0M;
regetFlightInitData.HighCostAndWeightEntity = e;
//如果是海航,則不需要政策倒查驗(yàn)證
regetFlightInitData.ReSearchNoFlight = false;
}
如果真的這么寫你就是始作俑者,后面的人如果都和你一樣就都會朝著葫蘆畫瓢,最后代碼可能會是這樣的
if (OrderInfo.O_OrdersEntity.DirectFlightChannel.Trim().ToUpper() == "CZ-SP" || OrderInfo.O_OrdersEntity.DirectFlightChannel.Trim().ToUpper() == "MU-WS" || OrderInfo.O_OrdersEntity.DirectFlightChannel.Trim().ToUpper() == "MU-WS" || OrderInfo.O_OrdersEntity.DirectFlightChannel.Trim().ToUpper() == "MU-SP" || OrderInfo.O_OrdersEntity.DirectFlightChannel.Trim().ToUpper() == "CZ-WS" || OrderInfo.O_OrdersEntity.DirectFlightChannel.Trim().ToUpper() == "XT-WS")
{
OrderCostAndWeightEntity e = new OrderCostAndWeightEntity();
e.FlightAgency = InsuranceCommon.GetStrategyFlightAgencyNew(OrderInfo.O_OrdersEntity.DirectFlightChannel);
e = ReGetFlight.GetDirectFlightHighWeightEntity(OrderInfo.O_FlightEntity, "", e.FlightAgency);
e.Sendticketcity = int.Parse(ConfigurationManager.AppSettings["SendticketcityOfDirectFlights_HU"].ToString());
regetFlightInitData.HighCostAndWeightEntity = e;
regetFlightInitData.TicketType = "0001";
//如果是海航,則不需要政策倒查驗(yàn)證
regetFlightInitData.ReSearchNoFlight = false;
}
else
{
OrderCostAndWeightEntity e = new OrderCostAndWeightEntity();
e.Sendticketcity = int.Parse(ConfigurationManager.AppSettings["SendticketcityOfDirectFlights_HU"].ToString());
e.FlightAgency = InsuranceCommon.GetStrategyFlightAgencyNew(OrderInfo.O_OrdersEntity.DirectFlightChannel);
e.CostRate1 = 1.0M;
regetFlightInitData.HighCostAndWeightEntity = e;
//如果是海航,則不需要政策倒查驗(yàn)證
regetFlightInitData.ReSearchNoFlight = false;
}
看到效果了么,你需要脫一下下面的那個長條才能看到全部代碼,這就是你的“因”種下后得到的果實(shí)。所以我們需要改進(jìn),常見的改進(jìn)是回車換行,保證所有的代碼都在你一眼能夠看到的范圍之內(nèi)。改進(jìn)后代碼如下:
if (OrderInfo.O_OrdersEntity.DirectFlightChannel.Trim().ToUpper() == "CZ-SP" ||
OrderInfo.O_OrdersEntity.DirectFlightChannel.Trim().ToUpper() == "MU-WS" ||
OrderInfo.O_OrdersEntity.DirectFlightChannel.Trim().ToUpper() == "MU-WS" ||
OrderInfo.O_OrdersEntity.DirectFlightChannel.Trim().ToUpper() == "MU-SP" ||
OrderInfo.O_OrdersEntity.DirectFlightChannel.Trim().ToUpper() == "CZ-WS" ||
OrderInfo.O_OrdersEntity.DirectFlightChannel.Trim().ToUpper() == "XT-WS")
{
OrderCostAndWeightEntity e = new OrderCostAndWeightEntity();
e.FlightAgency = InsuranceCommon.GetStrategyFlightAgencyNew(OrderInfo.O_OrdersEntity.DirectFlightChannel);
e = ReGetFlight.GetDirectFlightHighWeightEntity(OrderInfo.O_FlightEntity, "", e.FlightAgency);
e.Sendticketcity = int.Parse(ConfigurationManager.AppSettings["SendticketcityOfDirectFlights_HU"].ToString());
regetFlightInitData.HighCostAndWeightEntity = e;
regetFlightInitData.TicketType = "0001";
//如果是海航,則不需要政策倒查驗(yàn)證
regetFlightInitData.ReSearchNoFlight = false;
}
else
{
OrderCostAndWeightEntity e = new OrderCostAndWeightEntity();
e.Sendticketcity = int.Parse(ConfigurationManager.AppSettings["SendticketcityOfDirectFlights_HU"].ToString());
e.FlightAgency = InsuranceCommon.GetStrategyFlightAgencyNew(OrderInfo.O_OrdersEntity.DirectFlightChannel);
e.CostRate1 = 1.0M;
regetFlightInitData.HighCostAndWeightEntity = e;
//如果是海航,則不需要政策倒查驗(yàn)證
regetFlightInitData.ReSearchNoFlight = false;
是不是清爽一點(diǎn),好看一點(diǎn),如果你在第一次修改代碼的時候這樣寫后面的人就會跟著這樣寫,他們可能會想,前面一個人這樣寫這樣寫應(yīng)該不會有問題,雖然代碼看起來有點(diǎn)別扭,這時候我們可以帶著鑒賞的眼光看這段代碼,如果再想一想還有更好的方法,為何不用switch呢?
switch (OrderInfo.O_OrdersEntity.DirectFlightChannel.Trim().ToUpper())
{
case "CZ-SP":
case "MU-SP":
case "XT-WS":
{
OrderCostAndWeightEntity e = new OrderCostAndWeightEntity();
e.FlightAgency = InsuranceCommon.GetStrategyFlightAgencyNew(OrderInfo.O_OrdersEntity.DirectFlightChannel);
e = ReGetFlight.GetDirectFlightHighWeightEntity(OrderInfo.O_FlightEntity, "", e.FlightAgency);
e.Sendticketcity = int.Parse(ConfigurationManager.AppSettings["SendticketcityOfDirectFlights_HU"].ToString());
regetFlightInitData.HighCostAndWeightEntity = e;
regetFlightInitData.TicketType = "0001";
//如果是海航,則不需要政策倒查驗(yàn)證
regetFlightInitData.ReSearchNoFlight = false;
break;
}
default:
{
OrderCostAndWeightEntity e = new OrderCostAndWeightEntity();
e.Sendticketcity = int.Parse(ConfigurationManager.AppSettings["SendticketcityOfDirectFlights_HU"].ToString());
e.FlightAgency = InsuranceCommon.GetStrategyFlightAgencyNew(OrderInfo.O_OrdersEntity.DirectFlightChannel);
e.CostRate1 = 1.0M;
regetFlightInitData.HighCostAndWeightEntity = e;
//如果是海航,則不需要政策倒查驗(yàn)證
regetFlightInitData.ReSearchNoFlight = false;
break;
}
}
是不是更加簡單,如果你這樣寫,后面的人會毫不猶豫地在后面加一個case “”:因?yàn)檫@個是大家再熟悉不過的語法了,絲毫不用懷疑這種寫法的正確性,于是我們可以帶著欣賞的眼光來看這段代碼了。
3.要承認(rèn)我們的心智就這么多,腦袋就這么大,我們既不能一目十行也不能出口成章,所以不要寫一言看不出什么意思的代碼。
以上的想法都是建立在維護(hù)別人代碼的痛苦,失落,沮喪,各種不爽,各種吐槽之上,所以代碼規(guī)范是需要我們時刻關(guān)注的,在這里自己總結(jié)一些規(guī)范,告誡自己不要做始作俑者。
1.一個文件中只放一個類,類名同文件名,不要在一個文件中寫好幾個類,這樣看的清楚。
2.不要在一個文件中寫多于1000行的代碼,除了那些比較大的實(shí)體類。其實(shí)我還想說超過500行看起來就有點(diǎn)累,但是在我們的系統(tǒng)中超過10000行的代碼比比皆是。
3.一個方法的代碼不要超過100行,其實(shí)我想說超過50行的方法看起來就有點(diǎn)累。但是在我們的系統(tǒng)中超過200行代碼的方法比比皆是。
5.避免寫超過5個參數(shù)的方法,如果有請使用一個類或者結(jié)構(gòu)來傳。
6.一個方法只有一個return result; ,不要多次return結(jié)果,最好給返回結(jié)果賦值,最后return result;
7.不要給很簡單的代碼加注釋,會有噪音的,會讓人誤解的,因?yàn)槟銓懙拇蠖鄶?shù)情況下很片面。
8.記錄日志的時候不要到處都記,有條件的情況下針對客戶一次操作(比如下單)只記錄一條日志。
另外再這里列舉自己對代碼做的一些改進(jìn),不足之處歡迎大家指出。
1.參數(shù)過長使用縮進(jìn)
a.
//獲得保險策略信息
insuranceStrategy = InsuranceCommon.GetStrategyInsurance(appFltEntity.ProductSource.ToString(), strategyFlightAgency.ToString(), "", appFltEntity.Price.ToString(), appFltEntity.DirectFlightChannel, appFltEntity.Airline.DibitCode, appFltEntity.Flight, appFltEntity.DepartAirport.Code, appFltEntity.ArriveAirport.Code, appFltEntity.SubClass, appFltEntity.DepartTime, appFltEntity.DepartTime.Date, null);
b.
//獲得保險策略信息
insuranceStrategy = InsuranceCommon.GetStrategyInsurance(appFltEntity.ProductSource.ToString(),
strategyFlightAgency.ToString(),
"",
appFltEntity.Price.ToString(),
appFltEntity.DirectFlightChannel,
appFltEntity.Airline.DibitCode,
appFltEntity.Flight,
appFltEntity.DepartAirport.Code,
appFltEntity.ArriveAirport.Code,
appFltEntity.SubClass,
appFltEntity.DepartTime,
appFltEntity.DepartTime.Date,
null);
2.if條件過長中使用縮進(jìn)
a.
if (IsDirectFlight && (this.CorpPayType == ExpenseType.OWN || this.AccountInfo.DirectOrdersQuoteMode == "I"))
{
strategyFlightAgency = InsuranceCommon.GetStrategyFlightAgencyNew(appFltEntity.DirectFlightChannel);
//根據(jù)票臺獲得票臺對應(yīng)的城市
strategyCityID = InsuranceCommon.GetFlightAgencyCity(strategyFlightAgency);
}
b.
if (IsDirectFlight &&
(this.CorpPayType == ExpenseType.OWN ||
this.AccountInfo.DirectOrdersQuoteMode == "I"))
{
strategyFlightAgency = InsuranceCommon.GetStrategyFlightAgencyNew(appFltEntity.DirectFlightChannel);
//根據(jù)票臺獲得票臺對應(yīng)的城市
strategyCityID = InsuranceCommon.GetFlightAgencyCity(strategyFlightAgency);
}
3.使用三元表達(dá)式
a.
if (InsuranceInfoList != null && InsuranceInfoList.Count > 0 && InsuranceInfoList[0].GeneralDescription.Contains("e路泰康"))
collections.Set("IsElderCanBuyInsurance", "T");
else
collections.Set("IsElderCanBuyInsurance", "F");
b.
collections.Set("IsElderCanBuyInsurance", InsuranceInfoList != null && InsuranceInfoList.Count > 0 && InsuranceInfoList[0].GeneralDescription.Contains("e路泰康") ? "T" : "F");
4.使用藍(lán)不大表達(dá)式
a.
InsuranceInfoList = InsuranceInfoList.FindAll(delegate(BookingInsuranceInfo iInfo)
{
return iInfo.TypeID == "C2C30";
});
b.
InsuranceInfoList = InsuranceInfoList.FindAll(a => a.TypeID == "C2C30");
5.使用switch表達(dá)式,見上面。
6.使用數(shù)組包含
a.
if (wsFlt.ProductSource == 4 && !string.IsNullOrEmpty(wsFlt.DirectFlightChannel) && (wsFlt.DirectFlightChannel.ToUpper() == "HO-WS" or wsFlt.DirectFlightChannel.ToUpper() == "ZH-WS" or wsFlt.DirectFlightChannel.ToUpper() == "XT-WS")
&& directFlightCorporationList != null && directFlightCorporationList.Count > 0 && !directFlightCorporationList.Contains(corporationid))
{
return false;
}
b.
if (wsFlt.ProductSource == 4 &&
new List<string>() { "HO-WS", "CZ-WS", "XT-WS" }.Contains(wsFlt.DirectFlightChannel.Trim().ToUpper()) &&
directFlightCorporationList != null &&
directFlightCorporationList.Count > 0 &&
!directFlightCorporationList.Contains(corporationid))
{
return false;
}
可以看到代碼中也使用了縮進(jìn)。
歡迎大家也列舉自己遇到的代碼簡潔之道。
相關(guān)文章
C#實(shí)現(xiàn)自定義windows系統(tǒng)日志的方法
這篇文章主要介紹了C#實(shí)現(xiàn)自定義windows系統(tǒng)日志的方法,涉及C#針對windows系統(tǒng)日志的創(chuàng)建、讀寫及刪除技巧,非常具有實(shí)用價值,需要的朋友可以參考下2015-08-08.NET WinForm實(shí)現(xiàn)在listview中添加progressbar的方法
這篇文章主要介紹了.NET WinForm實(shí)現(xiàn)在listview中添加progressbar的方法,結(jié)合實(shí)例形式簡單分析了進(jìn)度條控件的添加與使用方法,需要的朋友可以參考下2017-05-05C#實(shí)現(xiàn)數(shù)據(jù)包加密與解密實(shí)例詳解
這篇文章主要介紹了C#實(shí)現(xiàn)數(shù)據(jù)包加密與解密的方法,是一項(xiàng)很實(shí)用的技能,需要的朋友可以參考下2014-07-07C# 7.0之ref locals and returns(局部變量和引用返回)
這篇文章主要介紹了C# 7.0之ref locals and returns,即局部變量和引用返回,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03