代码质量好坏,最重要的标准就是别人读起来费不费劲。代码首先是写给人看的,然后才是给机器运行的。一段好代码,应该让阅读的人很快就能明白它在做什么,而且改起来也不容易出错。
乱七八糟:结构混乱,命名随意,找不到头绪
逻辑绕弯:一层套一层的if-else,看得头晕
简单问题复杂化:明明很简单的事情,非要写得很复杂
像密码一样难懂:只有写代码的人自己能看懂,过段时间可能连他自己也忘了
不敢修改:改一个地方,不知道会影响到哪里
清晰明了:看一眼就知道要做什么
简单直接:没有多余的代码
名副其实:名字就能说明白用途
容易扩展:各个部分相对独立,改这里不会影响那里
名字是代码的第一印象,起得好能省很多解释的功夫。
不要这样起名字:
随意缩写:比如usrMgr(是UserManager吗?)、procData(到底是处理过的数据还是在处理数据?)
意义模糊:data、info、temp、doWork()这种名字等于没说
长得太像:XYZController和XYZManager有什么区别?小写字母l和数字1根本分不清
用生僻词:除非必要,不要用只有特定领域才懂的术语
需要注释才能懂:如果名字本身说不清楚,那这个名字就起失败了
应该这样起名字:
名字要反映实际含义:Customer比data好,SaveToDatabase比Update清楚
要有明显区别:获取用户列表用getUsers(),获取单个用户用getUserById()
要方便读出来:generationTimestamp比genTs好,因为你可以直接念出来跟同事讨论
要方便搜索:作用域越大,名字应该越完整。全局常量MAX_CONNECTIONS_PER_SERVER比简单的MAX好找多了
函数是组织代码的基本单位,写好了能让整个代码都好读。
函数要短小精悍:最好不超过20行,缩进不要超过两层。一个屏幕能看完的函数最舒服。
一个函数只做一件事:如果能从函数里抽出一个有意义的独立功能,那就应该抽出来。
告别巨大的switch语句:用多态来代替重复的switch/if-else。把switch逻辑封装在工厂类或策略模式里。
参数越少越好:
没有参数最好,一个参数不错,两个参数还行,三个参数就要考虑一下了。参数太多时,可以把它们封装成一个对象。
不要有副作用:函数名说做什么就只做什么。叫checkPassword的函数就不应该去初始化会话。副作用是bug的温床。
善用IDE的重构功能:比如Android Studio的Extract功能(Ctrl+Alt+M),可以帮你快速拆分长函数。
最好的注释是不需要注释——代码本身已经说清楚了一切。
这些注释可以写:
解释为什么这么写:当代码因为某些限制不能写得更清楚时
提供额外信息:比如法律声明、版权信息、跟产品经理约定的特殊规则
警告后果:// 不要动!这个休眠是为了解决XX设备的竞态条件问题
TODO注释:标记临时方案或计划要做的事,但要记得定期清理
这些注释不要写:
自言自语:注释比代码还难懂
过时的注释:代码改了注释没改,比没有注释更糟糕
修改日志:这是git该做的事,不是注释该做的事
废话注释:// 把名字设为"John",然后下一行是user.setName("John")
被注释掉的代码:直接删掉!如果需要,可以从git历史里找回来
记住:不要为烂代码写注释,要去重构它!
统一的格式能让阅读成本大大降低。
团队要用同一套标准:使用.editorconfig、IDE格式化模板等工具来保持统一。避免因为格式修改污染git blame信息。
限制每行长度:100-120个字符是常见标准,保持一行代码在屏幕上不用横向滚动。
代码要自上而下阅读:最上面是主逻辑,读起来像文章一样流畅,下面是具体实现细节。
合理使用空行:空行就像文章的分段,用来分隔不同的逻辑块。
相关代码放一起:关系紧密的代码应该靠近。变量定义要离使用的地方近,相关的函数要放在一起。
健壮的程序能够优雅地处理各种意外。
使用异常而不是错误码:错误码容易被忽略,而异常不可忽视。
把try/catch抽离出来:将错误处理逻辑封装成独立方法,让主逻辑更清晰。
不要返回null:返回空集合、空对象或者Optional,避免可怕的空指针异常。
谨慎使用受检异常:它破坏了封装性,导致所有调用者都要处理。优先考虑使用运行时异常。
处理第三方代码时:
隔离第三方代码:不要让你的代码里到处是第三方类的引用。为它们写适配层或包装类,把第三方代码控制在边界内。这样以后换库的时候影响范围就小多了。
通过阅读源码来学习:了解一个框架的边界和约定,可以看看它的源码,测试一下在什么情况下会抛出异常。
类是更高层次的组织单位。
类要短小,职责要单一:一个类不应该变成什么都管的“上帝类”。一个警示信号是:类的公开方法超过5-7个。
遵守单一职责原则:一个类应该只有一个引起它变化的原因。如果一个类承担了太多职责,它就很容易变得臃肿和脆弱。
隔离变化:
依赖抽象:依赖接口而不是具体实现,这样更灵活
封装成员变量:不要暴露公有字段,使用getter/setter方法,方便以后添加控制逻辑
大胆拆分:不要怕类太多。多个职责单一的小类,远比一个巨无霸类要好
这就像是一个分类清晰的工具箱,每个工具各司其职,比把所有工具都扔进一个大麻袋好用多了。
好的代码库应该像一个整理得井井有条的抽屉柜,每个抽屉里放什么东西都清清楚楚。而不是几个塞满杂物的大抽屉,想找什么都得翻个底朝天。
虽然看起来类的数量多了,但每个类都职责明确,找东西、用东西、改东西的成本都大大降低了。
写代码的时候,要时刻想着:如果别人来看这段代码,能不能很快看懂?如果明天要改需求,这里好不好改?抱着这样的心态写代码,你的代码质量自然就会提高。
记住,写出好代码不是一朝一夕的事,需要不断练习和反思。每次写代码时多想想,多改改,慢慢你就会发现,你的代码越来越清晰,越来越容易维护了。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!
一个系统可以维持5年,10年,甚至20年以上,但是代码和设计模式的生命周期非常短,当对一个解决方案使用不同的方法进行迭代的时候,通常只能维持数月,数日,甚至几分钟的时间
良好的编程习惯涉及到很多方面,但在软件行业内,大多数的公司或组织都不会把良好的编程习惯列为主要关注点。 例如,具有可读性和可维护性的代码比编写好的测试代码或使用正确的工具更有意义,前者的意义在于可以让代码更易于理解和修改。
减少嵌套会让代码可读性更好,同时也能更容易的找出bug,开发人员可以更快的迭代,程序也会越来越稳定。简化代码,让编程更轻松!
Google为了那些还不熟悉代码规范的人发布了一个JS代码规范。其中列出了编写简洁易懂的代码所应该做的最佳实践。代码规范并不是一种编写正确JavaScript代码的规则,而是为了保持源代码编写模式一致的一种选择。
程序员似乎忘记了软件的真正目的,那就是解决现实问题。您编写的代码的目的是为了创造价值并使现有世界变得更美好,而不是满足您对自我世界应该是什么的以自我为中心的观点。有人说:如果你拥有的只是一把锤子,那么一切看起来都像钉子一样
TinyMCE是一个轻量级的基于浏览器的所见即所得编辑器,由JavaScript写成。它对IE6+和Firefox1.5+都有着非常良好的支持。功能方强大,并且功能配置灵活简单。另一特点是加载速度非常快的。
函数式编程对应的是命令式编程, 函数式编程的核心当然是对函数的运用. 而高阶函数(Higher-order)是实现函数式编程的基本要素。高阶函数可以将其他函数作为参数或者返回结果。所以JS天生就支持函数式编程
朋友发表了一条说说:入职新公司,从重构代码到放弃”,我就问他怎么了?他说,刚进一家新公司,接手代码太烂,领导让我先熟悉业务逻辑,然后去修复之前项目中遗留的bug,实在不行就重构
页面实现关键词高亮显示:在项目期间遇到一个需求,就是搜索关键词时需要高亮显示,主要通过正则匹配来实现页面关键词高亮显示。在搜索结果中高亮显示关键词:有一组关键词数组,在数组中筛选出符合关键字的内容并将关键字高亮
软件工程学什么? 学计算机,写程序,做软件,当程序员。听说学计算机很辛苦? 是的,IT行业加班现象严重。在计算机世界里,技术日新月异,自学能力是程序员最重要的能力之一。选了这个专业,就要时刻保持好奇心和技术嗅觉,不能只满足于完成课内作业。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!