再谈C#编码规范
编码规范是老生常谈的问题,现在再看代码规范可能不会再去在意变量,控件的命名方法等,而是更加关注代码的实用性。
首先我们要明白一下几点,
1.代码写出来除了让他跑起来还有个非常非常重要的作用是维护,因为没有一成不变的代码,需求变化代码就不可避免的要变化。
2.你不是一个人在写代码,你身后有一个团队,这个团队中任何一个人都有可能会改你的代码,你如果写的不规范,后面的人会跟着写。举一个例子,最初的代码可能是这样的,
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 = "";
//如果是海航,则不需要政策倒查验证
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;
//如果是海航,则不需要政策倒查验证
regetFlightInitData.ReSearchNoFlight = false; }
但是过一时间又来个需求,对于“MU-WS”也需要走上面的逻辑,你会怎么写,如果你只是完成任务可能会像下面这样写
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 = "";
//如果是海航,则不需要政策倒查验证
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;
//如果是海航,则不需要政策倒查验证
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 = "";
//如果是海航,则不需要政策倒查验证
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;
//如果是海航,则不需要政策倒查验证
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 = "";
//如果是海航,则不需要政策倒查验证
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;
//如果是海航,则不需要政策倒查验证
regetFlightInitData.ReSearchNoFlight = false;
是不是清爽一点,好看一点,如果你在第一次修改代码的时候这样写后面的人就会跟着这样写,他们可能会想,前面一个人这样写这样写应该不会有问题,虽然代码看起来有点别扭,这时候我们可以带着鉴赏的眼光看这段代码,如果再想一想还有更好的方法,为何不用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 = "";
//如果是海航,则不需要政策倒查验证
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;
//如果是海航,则不需要政策倒查验证
regetFlightInitData.ReSearchNoFlight = false;
break;
}
}
是不是更加简单,如果你这样写,后面的人会毫不犹豫地在后面加一个case “”:因为这个是大家再熟悉不过的语法了,丝毫不用怀疑这种写法的正确性,于是我们可以带着欣赏的眼光来看这段代码了。
3.要承认我们的心智就这么多,脑袋就这么大,我们既不能一目十行也不能出口成章,所以不要写一言看不出什么意思的代码。
以上的想法都是建立在维护别人代码的痛苦,失落,沮丧,各种不爽,各种吐槽之上,所以代码规范是需要我们时刻关注的,在这里自己总结一些规范,告诫自己不要做始作俑者。
1.一个文件中只放一个类,类名同文件名,不要在一个文件中写好几个类,这样看的清楚。
2.不要在一个文件中写多于500行的代码,除了那些比较大的实体类。其实我还想说超过500行看起来就有点累,但是在我们的系统中超过10000行的代码比比皆是。
3.一个方法的代码不要超过100行,其实我想说超过50行的方法看起来就有点累。但是在我们的系统中超过200行代码的方法比比皆是。
4.存储过程的代码也不要超过100行,不要在存储过程中写过多的业务逻辑,那是找死,但是在我们的系统中我还真他妈的见过10000多行的存储过程,好宏伟啊!
5.避免写超过5个参数的方法,如果有请使用一个类或者结构来传。
6.一个方法只有一个return result; ,不要多次return结果,最好给返回结果赋值,最后return result;
7.不要给很简单的代码加注释,会有噪音的,会让人误解的,因为你写的大多数情况下很片面。
8.记录日志的时候不要到处都记,有条件的情况下针对客户一次操作(比如下单)只记录一条日志。
另外再这里列举自己对代码做的一些改进,不足之处欢迎大家指出。
1.参数过长使用缩进
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条件过长中使用缩进
a.
if (IsDirectFlight && (this.CorpPayType == ExpenseType.OWN || this.AccountInfo.DirectOrdersQuoteMode == "I"))
{
strategyFlightAgency = InsuranceCommon.GetStrategyFlightAgencyNew(appFltEntity.DirectFlightChannel);
//根据票台获得票台对应的城市
strategyCityID = InsuranceCommon.GetFlightAgencyCity(strategyFlightAgency);
} b.
if (IsDirectFlight &&
(this.CorpPayType == ExpenseType.OWN ||
this.AccountInfo.DirectOrdersQuoteMode == "I"))
{
strategyFlightAgency = InsuranceCommon.GetStrategyFlightAgencyNew(appFltEntity.DirectFlightChannel);
//根据票台获得票台对应的城市
strategyCityID = InsuranceCommon.GetFlightAgencyCity(strategyFlightAgency);
}
3.使用三元表达式
a.
if (InsuranceInfoList != null && InsuranceInfoList.Count > && InsuranceInfoList[].GeneralDescription.Contains("e路泰康"))
collections.Set("IsElderCanBuyInsurance", "T");
else
collections.Set("IsElderCanBuyInsurance", "F"); b.
collections.Set("IsElderCanBuyInsurance", InsuranceInfoList != null && InsuranceInfoList.Count > && InsuranceInfoList[].GeneralDescription.Contains("e路泰康") ? "T" : "F");
4.使用蓝不大表达式
a.
InsuranceInfoList = InsuranceInfoList.FindAll(delegate(BookingInsuranceInfo iInfo)
{
return iInfo.TypeID == "C2C30";
}); b.
InsuranceInfoList = InsuranceInfoList.FindAll(a => a.TypeID == "C2C30");
5.使用switch表达式,见上面。
6.使用数组包含
a.
if (wsFlt.ProductSource == && !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 > && !directFlightCorporationList.Contains(corporationid))
{
return false;
} b.
if (wsFlt.ProductSource == &&
new List<string>() { "HO-WS", "CZ-WS", "XT-WS" }.Contains(wsFlt.DirectFlightChannel.Trim().ToUpper()) &&
directFlightCorporationList != null &&
directFlightCorporationList.Count > &&
!directFlightCorporationList.Contains(corporationid))
{
return false;
}
可以看到代码中也使用了缩进。
欢迎大家也列举自己遇到的代码简洁之道。
再谈C#编码规范的更多相关文章
- 浅谈Android编码规范及命名规范
前言: 目前工作负责两个医疗APP项目的开发,同时使用LeanCloud进行云端配合开发,完全单挑. 现大框架已经完成,正在进行细节模块上的开发 抽空总结一下Android项目的开发规范:1.编码规范 ...
- 再谈java编码
一篇好文:从原理上搞懂编码——究竟什么是编码?什么是解码?什么是字节流? encode,即把字符按照指定的<编码gbk utf-8等>编码成该<编码>所表示的字节 decode ...
- 浅谈 JavaScript 编程语言的编码规范
对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散.很容易学习,并运用到自己的代码中.也正因为这样,JavaScript 的编 ...
- python之路--小数据池,再谈编码,is和 == 的区别
一 . 小数据池 # 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. # id() 查看变量的内存地址 s = 'attila' print(id(s)) 二 ...
- python的小数据池 is和== 以及再谈编码
---恢复内容开始--- 1. 小数据池, id() 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. id() 查看变量的内存地址 # a = 10 # b ...
- day06 再谈编码 and 作业讲解
1. 小数据池,(其他语言又叫常量池) id() 查看变量的内存地址 is和== is 判断内存地址是否一致 == 判断内容是否一致 小数据池的作用: 为了快速的创建字符串对象, 可以减少内存的浪费 ...
- Python基础篇 -- 小数据池和再谈编码
小数据池 1. id() 通过id()可以查看到一个变量表示的值在内存中的地址 s = "Agoni" print(id(s)) # 2410961093272 2. is 和 = ...
- python-小数据池,再谈编码,is和 == 的区别
一 . 小数据池 # 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. # id() 查看变量的内存地址 s = 'attila' print(id(s)) 二 ...
- 小数据池 is和== 再谈编码
昨日回顾 上节课内容回顾 1. 字典 {key:value, key:value.....} 成对的保存数据 字典没有索引. 不能切片, 字典的key必须是可哈希的.不可变的 1. 增加: dic[新 ...
随机推荐
- PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/phalcon.so' - /usr/lib64/php/mod
这个警告可能是,扩展在php.d里面加载了一遍,然后又在php.ini里写了一遍导致的
- 基于tiny4412的u-boot移植(一)
作者信息 作者:彭东林 邮箱:pengdonglin137@163.com QQ: 405728433 平台介绍 开发环境:win7 64位 + VMware11 + Ubuntu14.04 64位 ...
- 项目中一个Jenkins权限配置的过程
需求:需要不同账号登录,只看到自己需要看到的job,比如: test01账号登录看到tes01t_job test02账号登录,只看到test02_job 分析:目的是不同项目,不希望看到其他项目或者 ...
- CNN中卷积层的计算细节
原文链接: https://zhuanlan.zhihu.com/p/29119239 卷积层尺寸的计算原理 输入矩阵格式:四个维度,依次为:样本数.图像高度.图像宽度.图像通道数 输出矩阵格式:与输 ...
- bzoj 4177 Mike的农场
bzoj 4177 Mike的农场 思维有些江化了,一上来就想费用流做法,但其实就是个最小割啊. 考虑先将所有的收益拿到,再减去不能拿的以及三元组 \((i,j,k)\) 产生的代价.即,先让 \(a ...
- [Luogu3733][HAOI2017]八纵八横
luogu sol 线性基+线段树分治傻题. 复杂度应该是\(O((n+m\log n)\frac{L^2}{\omega})\)? code #include<cstdio> #incl ...
- 在css中使用hover来控制其他元素的样式,该两个元素必须是父子元素
.col-3:hover .check-box { display: block; } 在css中使用hover来控制其他元素的样式,该两个元素必须是父子元素!!!!
- FastAdmin 前台会员分组的权限分析
FastAdmin 前台会员分组的权限分析 之前有用户反馈前台用户组权限无法选中无子节点的节点 1. 其实这个理解是不对的,是无法选中菜单可视的节点. 从这里 UserRule.php 可能可以看出. ...
- 关于 ThinkPHP5 使用 getBy 字段名方式获取数据
关于 ThinkPHP5 使用 getBy 字段名方式获取数据 有小伙半说怎么全文搜索都没有搜索到 getByName 之类的函数. 其实是在这里.
- [转]基于Oracle的EntityFramework的WEBAPI2的实现(一)——准备工作
基于Oracle的EntityFramework的WEBAPI2的实现(一)——准备工作 转载请注明作者及来源:张峻崎,博客园 目前在.net的范围内,好的而且方便的ORM的真的不是很多,与VS集成 ...