原文:https://blog.csdn.net/qq_35440678/article/details/77939999 本文提纲: 为什么我们写的代码都是if-else? 这样的代码有什么缺点? 是否有优化的方法?如何重构? 异常逻辑处理型重构方法 状态处理型重构方法 为什么我们写的代码都是if-else? 程序员想必都经历过这样的场景:刚开始自己写的代码很简洁,逻辑清晰,函数精简,没有一个if-else, 可随着代码逻辑不断完善和业务的瞬息万变:比如需要对入参进行类型和值进行判断:这里要判…
本文提纲: 为什么我们写的代码都是if-else?这样的代码有什么缺点?是否有优化的方法?如何重构?异常逻辑处理型重构方法状态处理型重构方法为什么我们写的代码都是if-else?程序员想必都经历过这样的场景:刚开始自己写的代码很简洁,逻辑清晰,函数精简,没有一个if-else, 可随着代码逻辑不断完善和业务的瞬息万变:比如需要对入参进行类型和值进行判断:这里要判断下对象是否为null:不同类型执行不同的流程. 落地到具体实现只能不停地加if-else来处理,渐渐地,代码变得越来越庞大,函数越来越…
建议154:不要过度设计,在敏捷中体会重构的乐趣 有时候,我们不得不随时更改软件的设计: 如果项目是针对某个大型机构的,不同级别的软件使用者,会提出不同的需求,或者随着关键岗位人员的更替,需求也会随个人意志有所变更. 如果竞争对手增加了新需求,我们也不得不为正在研发的新产品调整设计方案. 刚开始的架构太糟糕了,这可能源于设计经验的不足或者架构师的不负责任. 以上分别从外部和内部描述了必须修改需求和设计的几种场景.也就是说,在软件开发过程中,变化几乎总会发生. 为了捕捉需求上的不断变化,软件开发必…
建议147:重构多个相关属性为一个类 若存在多个相关属性,就应该考虑是否将其重构为一个类.查看如下类: class Person { public string Address { get; set; } public string ZipCode { get; set; } public string Mobile { get; set; } public string Hotmail { get; set; } //其他省略 } 上面代码中的这四个属性全部跟联系方式有关,所以,我们应该重构一…
建议91:可见字段应该重构为属性 字段和属性的本质区别就是属性是方法. 查看下面这个Person类型: class Person { public string Name { get; set; } } 经过编译器编译后,针对属性Name实际会生成一个private字段和两个public方法: [CompilerGenerated] private string <Name>k__BackingField; [CompilerGenerated] public void set_Name(st…
编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务必一致 建议4: 避免带有变长参数的方法重载 建议5: 别让null值和空值威胁到变长方法 建议6:覆写变长方法也循规蹈矩 建议7:警惕自增的陷阱 建议8:不要让旧语法困扰你 建议9:少用静态导入 建议10:不要在本类中覆盖静态导入的变量和方法 建议11:养成良好习惯,显示声明UID 建议12:避免…
根据<编写高质量代码改善JavaScript程序的188个建议>这本书,来记录我目前所了解的建议方式. 建议1:警惕Unicode乱码 根据ECMA标准规定JavaScript语言可以使用中文来命名变量或函数名,例如: var 人名 = “张三”; function 睡觉(谁){ alert(谁 + ":快睡觉!都半夜三更了."); } 睡觉(人名); 但是在ECMA标准化之前,JavaScript通常是不支持Unicode编码的,为了防止乱码,我们应该尽量使用基本字符进行…
建议155:随生产代码一起提交单元测试代码 首先提出一个问题:我们害怕修改代码吗?是否曾经无数次面对乱糟糟的代码,下决心进行重构,然后在一个月后的某个周一,却收到来自测试版的报告:新的版本,没有之前的版本稳定,性能也更差了,Bug似乎也变多了.也就是说,重构的代码看上去质量更高了,可实际测试结果却不如人意. 几乎每个程序员都因为此类问题纠结过.我们要修改的代码也许来自某些不负责任或经验欠佳的程序员,也许这些代码是自己一年前写的,但是看上去已经惨不忍睹.我们想要修改这些代码,却担心重构出别的问题.…
建议132:考虑用类名作为属性名 一般来说,若果属性对应一个类型,应该直接用类型名命名属性名.如下: class Person { public Company Company { get; set; } } class Company { //省略 } 没有必要为属性名指定另外的名字,如: public Company TheCompany{get;set;} 当然,除非我们的类型当中有多个Company类型的属性,这样就必须为我们的属性重构成不同的命名,如: class Person { p…
建议102:区分接口和抽象类的应用场合 接口和抽象类有一些显而易见的区别: 接口支持多继承,抽象类则不能. 接口可以包含方法.属性.索引器.事件的签名,但不能有实现,抽象类则可以. 接口在增加新方法后,所有的继承者都必须重构,否则编译不通过,而抽象类则不需要. 这些区别导致两者的应用场景不同: 如果对象存在多个功能相近且关系紧密的版本,则使用抽象类. 如果关系不紧密,但若干功能拥有共同的声明,则使用接口. 抽象类适合于提供丰富功能的场合,接口则更倾向于提供单一的一组功能. 从某种角度来看,抽象类…
建议73:避免锁定不恰当的同步对象 在C#中,让线程同步的另一种编码方式就是使用线程锁.线程锁的原理,就是锁住一个资源,使得应用程序在此刻只有一个线程访问该资源.通俗地讲,就是让多线程变成单线程.在C#中,可以将被锁定的资源理解成new出来的普通CLR对象. 既然需要锁定的资源就是C#中的一个对象,我们就该仔细思考,到底什么样的对象能够成为一个锁对象(也叫同步对象)?在选择同步对象的时候,应当始终注意以下几点: 1)同步对象在需要同步的多个线程中是可见的同一个对象.2)在非静态方法中,静态变量不…
原文发表在我的博客主页,转载请注明出处! 建议二十八:区别对待可变对象和不可变对象 python中一切皆对象,每一个对象都有一个唯一的标识符(id()).类型(type())以及值,对象根据其值能否修改分为可变对象和不可变对象,其中数字.字符串.元组属于不可变对象,字典以及列表.字节数组属于可变对象. 来看一段程序: class Student(object): def __init__(self,name,course=[]): self.name = name self.course = c…
原文发表在我的博客主页,转载请注明出处! 建议四十一:一般情况下使用ElementTree解析XML python中解析XML文件最广为人知的两个模块是xml.dom.minidom和xml.sax,作为主要解析XML方法的两种实现,DOM需要将整个XML文件加载到内存中并解析为一棵树,简单但是内存消耗大:SAX是基于事件驱动的,虽不需要全部装入XML文件,但是处理过程复杂.一般情况下选择ElementTree便可以,cElementTree是其Cython实现,速度更快,消耗内存更少,性能上更…
2014-05-16 09:08 by Jeff Li 前言 系列文章:[传送门] 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,慘不忍睹是吧.确实,人和代码一样都在成长,都在变好其中.有时候仅仅是实现功能的编程,长进不了呀. 博客提供的优点就能够交流,讨论的学习方法你们应该知道. 在这里,我会陆陆续续的进行对<编写高质量代码改善java程序的151个建议>看法,希望大家点击交流. 正文 看这本书原因   1.项目做的仅仅是实现功能,然而没有…
前言 这两周参加公司的新项目,采用封闭式开发(项目成员在会议室里开发),晚上加班到很晚,所以没时间和精力写原创博客了,今天就分享下这篇<编写高质量代码--Web前端开发修炼之道>读书笔记吧.     正文 欲精一行,必先通十行. 在前端开发这个领域,一专多能更是非常必要的. table布局缺点: 代码量大,结构混乱: 标签语义不明确,对搜索引擎不友好. css布局:div+css,或者(x)html+css. 代码量少.结构精简.语义清新. 代码量少,浏览器端下载时间就会更短: 语义清晰就会对…
编写高质量代码:改善Java程序的151个建议(第二章:基本类型) 目录 建议21:用偶判断,不用奇判断 建议22:用整数类型处理货币 建议23:不要让类型默默转换 建议24:边界还是边界 建议25:不要让四舍五入亏了一方 建议26:提防包装类型的null值 建议27:谨慎包装类型的大小比较 建议28:优先使用整型池 建议29:优先选择基本类型 建议30:不要随便设置随机种子 建议21:用偶判断,不用奇判断 判断一个数是奇数还是偶数是小学里的基本知识,能够被2整除的整数是偶数,不能被2整除的数是…
原创地址:   http://www.cnblogs.com/Alandre/  (泥沙砖瓦浆木匠),需要转载的,保留下! Thanks The reasonable man adapts himself to the world;the unreasonable one persists in trying to adapt the world to himself. —萧伯纳 相信自己看得懂就看得懂了,相信自己能写下去,我就开始写了.其实也简单—泥沙砖瓦浆木匠 Written In The…
最近读了陆敏技写的一本书<<编写高质量代码  改善C#程序的157个建议>>书写的很好.我还看了他的博客http://www.cnblogs.com/luminji . 前面部分选择什么,该怎么用我没有怎么消化.看了他写的一篇关于自动化测试的工具,能够录下人的操作,然后可以在多台机器上调用,因为是windows开发的,我没有亲手实验,先记录在这里,以后要用可以找,"Code UI Automation" 文中大量都是通过对比IL代码,来区分哪个方案更好.我在看&…
建议152:最少,甚至是不要注释 以往,我们在代码中不写上几行注释,就会被认为是钟不负责任的态度.现在,这种观点正在改变.试想,如果我们所有的命名全部采用有意义的单词或词组,注释还有多少存在的价值. 即便再详细的注释也不能优化糟糕的代码.并且注释往往不会随着代码的重构自动更新,有时候我们可能会在修改代码后忘记更新那段用来表达最初意图的文字了.所以,尽量抛弃注释吧,除非我们觉得只有良好的代码逻辑和命名仍旧不足以表达意图. 当然,有些注释可能不得不加,如一些版权信息.另外,如果我们正在开发公共API…
建议150:使用匿名方法.Lambda表达式代替方法 方法体如果过小(如小于3行),专门为此定义一个方法就会显得过于繁琐.比如: static void SampeMethod() { List<string> list=new List<string>(){"Mike","Rose","Steve"}; var mike = list.Find(new Predicate<string>(HaveLength…
建议149:使用表驱动法避免过长的if和switch分支 随着代码变得复杂,我们很容易被过长的if和switch分支困扰. 一个类枚举类型Week如下: enum Week { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday } 如果要把Week的元素值用中文输出,简单而丑陋的方法也许是封装一个GetChineseWeek方法: static string GetChineseWeek(Week week) { swi…
建议148:不重复代码 如果发现重复的代码,则意味着我们需要整顿一下,在继续前进. 重复的代码让我们的软件行为不一致.举例来说,如果存在两处相同的加密代码.结果在某一天,我们发现加密代码有个小Bug,然后修改了它,却又忘记了角落里的某处存在着一份相同的代码,那么这个Bug就会隐藏起来. 让我们重现这个例子: void PagerEncrypt() { //加密代码 } void AnswerEncrypt() { //相同的加密代码 } 在这段代码中,方法PagerEncrypt和AnswerE…
建议146:只对外公布必要的操作 那些没有必要公开的方法和属性要声明成private.如果需要公开的方法和属性超过9个,在VS默认的设置下,就需要滚屏才能显示在Intellisense中,如图: SampleClass类: class SampleClass { private int field1; private int field2; private int field3; public int MyProperty1 { get; set; } public int MyProperty…
建议145:避免过长的方法和过长的类 如果违反“一个方法只做一件事”及类型的“单一职责原则”,往往会产生过长的方法和过长的类. 如果方法过长,意味着可以站在更高的层次上重构出若干更小的方法.以行数作为指标,有人建议一个方法不要超过10行,有人建议不要超过30行.当然,这没有唯一标准.在我看了,一个方法在VS中需要滚屏才能阅读完,那么就肯定有些过长了,必须想办法重构它. 对于类型,除非有非常特殊的理由,类型的代码不要超过300行.如果行数太多了,则要考虑是否重构. 转自:<编写高质量代码改善C#程…
建议143:方法抽象级别应在同一层次 看下面代码: class SampleClass { public void Init() { //本地初始化代码1 //本地初始化代码2 RemoteInit(); } void RemoteInit() { //远程初始化代码1 //远程初始化代码2 } } Init方法本意要完成初始化动作,而初始化包括本地初始化和远程初始化.这段代码中,Init方法内部代码的组织结构是本地初始化直接运行在方法内部,而远程初始化代码却被封装为一个方法在这里被调用.这显然…
建议138:事件和委托变量使用动词或形容词短语命名 事件和委托使用场景是调用某个方法,只不过这个方法由调用者赋值.这决定了对应的变量应该以动词或形容词短语命名. 关于事件和委托变量妥当的命名示例如下: public event RoutedEventHandler Click; public event SizeChangedEventHandler SizeChanged; 这两个例子是WPF中Button类型,它们实际不是作为类型的字段出现的,而是作为事件访问器出现的: public eve…
建议129:泛型类型参数要以T作为前缀 作为一种约定,泛型类型的参数要以T作为前缀.如委托声明: Action<T1,T2> 其中,泛型类型参数名不应该处理成: Action<Arg1,Arg2> 当然,这仅仅是一种习惯,若果使用第二种命名方式,编译器并不会报错,但是作为调用者,也许不能意识到这里是一个泛型类型参数.这个问题在为类型指定泛型的时候尤为明显,因为为类型指定泛型类型参数的声明不会出现在公开的接口中,如: class SampleClass<T> { publ…
建议123:程序集不必与命名空间同名 程序集一般会和命名空间同名,但这并不是必须的.事实上,不同名的命名空间和程序集是很常见的. 程序集表示的是一种物理上的分组,而命名空间是逻辑上的分组,两者没有必然联系. 当然,如果项目最终会被编译为dll,则我们更建议程序集和命名空间命名保持一致,这看上去更符合习惯.比如System.Data命名空间,对应的应该有一个System.Data.dll的程序集.我们当然也可以让程序集仅仅命名为Data.dll,即使不说,相信你也会觉得这欠妥当,因为这样的命名太普…
建议118:使用SecureString保存密钥等机密字符串 托管代码中的字符串是一类特殊的对象,它们不可用被改变.每次使用System.String类张的方法之一时,或者使用此类型进行运算时(如赋值.拼接等),都要在内存中创建新的字符串对象,也就是为该新对象分配新的空间.这就带来了两个问题: 原来的字符串是不是还在内存当中? 如果在内存当中,那么机密数据(如密码)该如何保存才足够安全? 针对第一个问题,我们来看一段代码: static void Method1() { string str =…
建议117:使用SSL确保通信中的数据安全 SSL(Secure Socket Layer)最初是由NetScape公司设计的,用于Web安全的网络协议.目前它已经广泛应用到各类网络传输通信中了.SSL利用数字证书技术(非对称加密),保证了通信过程中的唯一性.不可篡改性.不可抵赖性.SSL通道原理图: 非对称加密中: 秘钥分为两部分:公钥PK和私钥SK. 公钥用于加密数据用,私钥用于解密. 公钥可公开而且应该公开,私钥只属于创建者. 经过公钥加密的数据只有证书创建者才能解密.这是构成SSL通道所…