重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
很多问题归根结底都是技术债务,这在一些大公司尤为常见。技术债务话题太大,但就代码质量而言,我只想提一下不要因为这些债是前人留下的你就不去管。怎么写出高质量的代码呢?
创新互联服务项目包括十堰网站建设、十堰网站制作、十堰网页制作以及十堰网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,十堰网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到十堰省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
1、打好技术基础
写出高质量代码,并不是搭建空中楼阁,需要有一定的基础。这里我重点强调与代码质量密切相关的几点:
1)掌握好开发语言
比如做 Android 就必须对 Java 足够熟悉,才能够写出高质量 Java 代码。
2)熟悉开发平台
不同的开发平台,有不同的 API,有不同的工作原理,同样是 Java 代码,在 PC 上写与 Android 上写很多地方不一样。
3)要去熟悉 Android 编程的一些特性
iOS 编程的一些特性,了解清楚这些,才能写出更加地道的代码,充分发挥各自平台的优势。
4)基础的数据结构与算法
掌握好这些在解决一些特定问题时,可以以更加优雅有效的方式处理。
5)基础的设计原则
无需完全掌握 23 种经典设计模式,只需要了解一些常用的设计原则即可,甚至你也可以只了解什么是低耦合,并在你的代码中坚持实践,也能写出很不错的代码。
2、代码标准
代码标准在团队合作中尤为重要,谁也不希望一个项目中代码风格各异,看得让人糟心,即便是个人开发者,现在也需要跟各种开源项目打交道。
标准怎么定是一个老生常谈的话题,我经历过很多次的代码标准讨论会议,C++,C#,Java 等等,大家有时会坚持自己的习惯不肯退让。可现如今时代不一样了,Google 等大厂已经为我们制定好了各种标准,就用这些业界标准吧。
3、想好再写
除非你很清楚你要怎么做,否则我不建议边做边想。你真的搞清楚你要解决的问题是什么了吗?你的方案是否能有效?有没有更优雅简单的方案?
准备怎么设计它,必要的情况下,需要有设计文档,复杂一些的设计需要有同行评审,写代码其实是很简单的事情,前提是你得先想清楚。
4、代码重构
重构对于代码质量的重要性不言而喻,很难一次把代码写得让自己满意、无可挑剔。
5、技术债务
很多问题归根结底都是技术债务,这在一些大公司尤为常见。技术债务话题太大,但就代码质量而言,我只想提一下不要因为这些债是前人留下的你就不去管。
现实是没有多少机会让你从一个清爽清新的项目开始做起,你不得不去面对这些,你也没法完全不跟这些所谓的烂代码打交道。
当你负责一个小模块时,除了把它做好之外,也要顺便将与之纠缠在一起的技术债务还掉,因为这些债务最终将是整个团队来共同承担,任何一个人都别想独善其身,如果你还对高质量代码有追求的话。
作为团队的技术负责人,也要顶住压力,鼓励大家勇于做出尝试,引导大家不断改进代码质量,不要总是畏手畏脚,停滞不前,真要背锅也得上,要有担当。
6、代码审查
我曾经听过一些较高级别的技术分享,竟然还不时听到一些呼吁大家要做代码审查的主题。
我以为在这个级别的技术会议上,不应再讨论代码审查有什么好,为什么要做代码审查之类的问题。同时我接触过相当多所谓国内一线互联网公司,竟有许多是不做代码审查的,这一度让我颇为意外。
这里也不想多谈如何做好代码审查,只是就代码质量这点,不客气地说:没有过代码审查的经历往往很难写出高质量的代码,尤其是在各种追求速度的糙快猛创业公司。
7、静态检查
很多代码上的问题,都可以通过一些工具来找到,某些场景下,它比人要靠谱得多,至少不会出现某些细节上的遗漏,同时也能有效帮助大家减少代码审查的工作量。
Android 开发中有 Lint,Find bugs,PMD 等优秀静态检查工具可用,通过改进这些工具找出的问题,就能对语法的细节,规范,编程的技巧有更多直观了解。
建议最好与持续集成(CI),代码审查环境配套使用, 每次提交的代码都能自动验证是否通过了工具的代码检查,通过才允许提交。
8、单元测试
Android 单元测试,一直备受争议,主要还是原生的测试框架不够方便,每跑一次用例需要在模拟器或者真机上运行,效率太低,也不方便在 CI 环境下自动构建单元测试,好在有 Robolectric,能帮我们解决部分问题。
单元测试的一个非常显著的优点是,当你需要修改大量代码时,尽管放心修改,只需要保证单元测试用例通过即可,无需瞻前顾后。
9、充分自测
有一种说法:程序员最害怕的是他自己写的代码,尤其是准备在众人面前 show 自己的工作成果时,因此在写完代码后,需要至少跑一遍基本的场景,一些简单的异常流。
在把你的工作成果提交给测试或用户前,充分自测是基本的职业素养,不要总想着让测试帮你找问题,随便用几下就 Crash 的东西,你好意思拿给别人吗?
10、善用开源
并非开源的东西,质量就高,但至少关注度较高,使用人数较多,口碑较好的开源项目,质量是有一定保证的,这其中的道理很简单。
即便存在一些问题,也可以通过提交反馈,不断改进。最重要的是,你自己花时间造的轮子,需要很多精力维护,而充分利用开源项目,能帮助你节省很多时间,把精力专注在最需要你关心的问题上。
从另一个方面来说,开源项目中的一些知名项目,往往是领域内的翘楚所写,学习这些高手的代码,能让你了解到好的代码应该是怎样的,培养出更灵敏的嗅觉,识别代码中的各种味道
好的代码就像一篇好的文章,无须做太多的解释就能一目了然。
如果能够让自己编写的代码非常明了,那么在编写的时候就不需要使用太多的文字进行解析。
编写有质量的代码是非常关键的,不仅能够让别人一目了然,在代码出现错误的时候能够很好的就是修改,及时找到存在问题的地方。
下面宁夏电脑培训为大家介绍什么是有质量的代码,如何编写有质量的代码。
一、好的代码有哪些特征理解是非常关键的,好的代码就是易于理解,并且分段明确,每一段都是清晰的主题。
不好的代码会存在很多问题,就像刚刚学习写书的人一样,逻辑不严谨,每个章节存在混乱的情况。
宁夏IT培训认为最重要的是没有明确的主题,写代码有一定的规则,任何内容都不能违反其规则这样才能让代码更加严谨。
二、怎样才是好的代码1、可读性:可读性不单单是针对个人的,最重要的是需要让别人感受完美的可读性,让别人了解自己书写的代码,进行更好的合作。
2、可维护性:没有任何代码是一次性完成的,代码需要不断的更新的维护。
好的代码具有非常好的维护性,代码清晰明了,修改方便。
3、效率性:代码是需要进行运行的,并且代码决定了运行的速度。
宁夏IT培训认为好的代码才能达到最快的运行速度。
4、明确性:如果您的代码不言自明,大多数情况下,您根本不需要提供相关文档。
在命名和设置属性时,尽可能合理,拆分长代码,不要复制/粘贴代码块。
三、代码质量测试的方法找一个从未阅读过你的代码的开发人员,让他看看你的代码,让他试着弄清楚每个模块的作用。
如果你经常需要向他解释,那么你的代码就不够好了,并且解释的次数越多,说明代码的质量就越低。
相反,宁夏IT培训认为如果你只是静静地坐着,他不需要问你任何问题,这意味着你的代码质量很高。
java 只是一门编程语言,如同c、c++、c#等
pmd 则是一个代码质量度量工具,与此同时还有CheckStyle、PMD、FindBugs和 Junit等
如何编写高质量代码,从而提升系统性能。想必是很多程序员都非常注意的地方,最近总结了一些要点,特此记录在案。 所谓代码高可读性和高可维护性,其实就是应该有着规范的Java程序设计风格,在开发程序过程中,从近期目标看是应该着眼于功能实现,但是只能解一时之渴,而不思长远之计,确不可取,一个杂乱无序的代码让人看后有一种不解其意,心绪烦乱的感觉。所以,作为一名合格的程序员,一定要确定一个观点就是你编写出来的代码不只是给你一个人看的,还是给别人看的,所以在开发过程中文件注释头,java源文件编排格式,方法体的具体业务含义的注释都是必须的。 如程序注释就分为块注释与行注释 。例如块注释为
/**
* @param
@return
*/
行注释
/** **/或者 //
再者就是方法的命名也需要多加斟酌,一个业务方法,如果取最能体现体现该业务的名字,这样读者几乎不需要看代码便可以知道该方法具体用途。 高质量的代码其实很多时候都在一些小细节中体现,对于每个程序员来说一个for循环都会写,可是却有很多人没有能在代码中体现出高效性来,在这里我用简单的一个例子来说明:一个ArrayList需要遍历。 一般人会写成for(int i=0;ilist.size();i++) 这有问题吗?没有问题,能够完成程序员的意图的功能。
可是它高效吗?你有注意到这点吗?其实问题就出现在list.size()方法,这个方法是计算一个list的大小,本身它不会存在任何问题,可是将它放在了一个for()循环中的话,就很有问题了,因为如果一个N次的for循环,这个方法就需要被执行N次,这样的代码就造成计算机花很多的时间去做没有意义的事情,而本来这个list.size()方法只需要计算一次的就可以了,所以我们把计算list大小的方法放在for循环外面去定义的话,效率就可以得到提高
如: int size = list.size();
for(int i=0;isize;i++)
关于For循环还有一个要注意的地方,就是在for循环里面去New一个新对象。如:
for(int i=0;i10;i++){
A a = new A();
}
是不是怎么看都不会有问题,是的在语法上。或者是执行业务处理逻辑的时候,它都是没有任何问题的,可是这是从语言级别去看待问题,没有深入到它的实现机制上去看待问题。
在介绍这个问题的之前我想先简单说下关于java内存的机制:java是如何在内存中保存对象,我们回到A a=new A()在内存中是怎么分配这个问题来,
首先在栈中开辟一段空间存放引用a,然后在堆中开辟一段空间存放新建的A对象,同时引用a指向堆中新建得A对象,a所指代的对象地址为A在堆中地址。根据javaGC机制,只有对象已经没有引用指向它的时候,才有可能被GC给回收,所以基于这种机制的话,上述的一个For循环就会存在很大的效率问题了,如果循环有1000次,在内存中栈会有1000个引用,而堆中也会有1000个新生成的对象,同时1000个引用会相应指向1000个新生成的对象,即使这个for循环结束,也不会有任何改变。但是实际上1000个引用的生成完全是没有必要的,如果有着编写高性能代码的想法的话:像这样的for循环完全可以这样写:
A a = null;
for(int i=0;i1000;i++){
a = new A();
...
}
这样的代码在内存中便只会在栈中生成一个指向,每当一个for循环结束后,这个指向会指向下一个新生成的对象,前面生成的对象就会失去指向,这样GC就有可能更加快速的回收这些已经失去功能的对象。 在java中其实new 一个对象是非常耗费时间的,特别是重量级对象,所以每次在new 对象的时候一定需要考虑清楚是不是非的生成一个对象才能完成我的业务需求呢?总之能够根据实际情况,然后举一反三的话,我相信大家编写出来的代码就会更加高效了。
其次是针对同步的慎重考虑,因为我们一旦用了synchronized这个关键字后,就很可能丧失了并行的功效,所以在开发的过程中需要注意到线程是不是会对共有的资源进行处理,然后在慎重选择Synchronized 关键字,其实大家可以考虑用ThreadLocal这个类,它的优点是既保证同步的情况下仍然能保证并行,缺点是会占用更多的空间去换取换取时间。
最后,便是在j2ee开发过程中对数据库操作的优化,在这里我只针对代码级别的优化,关于数据库级别的我不涉及。大家编写SQL的时候会不会注意到一些原则,在这里我将罗列一些需要注意的要点。(总结肯定不会很全,我希望如果有大虾能给予更多的经验指导,在下将会感激万分。)
(1)在搜索子句的列名边要避免函数、算术操作符和其它的表达式,除非建立基于函数的索引
(2)使用复合索引的第一个列名
(3)SELECT子句中避免使用 ‘*’
(4)如果可能尽量多用"Commit"
(5)避免在索引列上使用IS null和Is not null
(6)用Union -all替换Union(如果可能的话)
(7)Oracel 采用自下而上的顺序解析WHERE子句,可以过滤掉最大数量记录的条件写在WHERE子句的末尾
(8)between谓词可以转化为=and=子句,比如:price between 10 and 20
可以转化为 price= 10 and =20
(9)like子句中匹配值的第一个字符是常量,也可以进行转换, 例如:
like “sm%”可以转换成 =“sm” and “sn”
(10)在子查询,exists和in要比not exists和not in执行得快,因为对于exists和in,优化器只要找到一条记录就可以返回TRUE,而对于not exists和not in则必须检查所有的值。
以上10条总结如果在编写sql的时候能注意到的话,将会在一定程度上提高java跟数据交互的性能。
那么除了在SQL上下功夫来提高性能之外,编写合适的事务处理也将带来一些性能提高。我们都知道事务具有:原子性,隔离性,一致性,持久性,所以在使用事务的时候肯定是牺牲并发性能为代价的。特别是一个涉及update的事务处理的时候,数据库会在表上加上排他锁,而一个数据资源只要被一个事务放置了排他锁,其他事务将不能放上排他锁,一定要一直等到事务结束后才释放。所以在这种情况下的,并发性就会被抹杀掉了。我们不能改变这种加锁的机制,但是我们可以用另外一种方式来达到一定程度的性能提升,那就是根据实际情况将一个大事务分解成小事务来处理。简而言之就是减低事务放置排他锁和释放排他锁的时间间隔,这样可以让其他的事务能更快的访问到数据资源。而关于大事务分解一定要小心使用,如果使用不恰当的话很可能会产生意想不到的数据不一致错误。