当前位置: 首页 > news >正文

什么样的代码才是好代码

转自:http://ms.csdn.net/geek/186524?winzoom=1

衡量代码的好坏的指标或者维度有很多,比如性能好、架构好、高内聚等,这些指标的侧重点各不相同,不同的开发人员的关注的重点也各不相同。我个人更喜欢简单的可读性高的代码,我主要从以下几个维度衡量代码是否良好:

代码是可工作的 
代码是可读性高的 
代码是简单的 
代码是高内聚的 
代码是低耦合的 
代码是可工作的

写代码的目的是要为了解决特定问题的,因此无论如何,代码首先是可工作的,能解决特定的问题。可工作的包含有两层含义:一是从功能角度来说能满足用户的需求,二是从性能角度来说要满足当前基本的性能需求。所以可工作是衡量代码好坏的前置条件,只考虑代码本身不考虑可工作性是舍本取末。

代码是可读性高的

(想学习前端 js html5 div css3 nodejs bootstrap vue.js的朋友们加一下qq群4780527166一群已满这是二群点击链接加入群【前端技术交流群群】:https://jq.qq.com/?_wv=1027&k=45vs1z3 
我们有免费的直播课程 视频等资料 )

代码是开发人员来开发和维护的,而且在软件漫长的生命周期中,通常会由不同的开发人员来维护的,如果代码的可读性很差,那将来的维护就将是一个噩梦。我们写的代码是给开发人员看的,绝对不是给机器看的(编译后的代码是给机器看的,编译器会帮我们去掉无意义的空行等),因此代码必须首先是可读性高的。

那什么是可读性高的代码呢?从coding style角度来说,有意义的命名、添加必要的文档和注释、类和方法不要太长、每一行也不要太长、添加必要的空行以及必要的缩进等,具体可以参考《C++编程规范》和《重构 改善既有代码的设计》。另外一方面就是从代码的结构来定义,例如代码是高内聚、低耦合的,代码是简单的,这三个方面下面会有详细描述。

代码是简单的

我们先来看一下什么是复杂的代码,比如说美其名曰为了代码的扩展性,使用了好多设计模式和软件开发原则,结果就是明明可以用很简单几行代码搞定的事情,结果用了几十行代码甚至更多,而且代码用了各种酷炫的技术,但是事实上大部分的扩展性可能一辈子也没有发生过,从敏捷开发角度来说,这是非常典型的过度设计。敏捷开发不是不考虑设计,只是不推崇过度设计,比如考虑10年后系统的扩展性是没有任何意义的,另外一种场景是只是做一个简单的后台管理系统,但是却花大量的精力考虑高并发也是没有意义的,过度设计的代码通常是复杂的。

所以在适度考虑代码的可扩展性的基础上,能不用设计模式就不要用设计模式,能不用新的、复杂的技术就不用新的、复杂的技术,技术够用就好,代码越简单越好,有人说代码太简单是不是有点low,其实写出高质量的简单代码远比写出复杂的代码难度高,尤其是系统比较复杂时,保持代码的简单性难度是非常大的。

所以说简单的代码就是:代码所有人都看得懂,尤其是新人,但是又具备一定的扩展性和维护性,简单的讲就是简约而不简单。复杂的代码首先对读代码的人要求就很高,最终导致代码很难维护。代码是简单的是代码可读性高的一个方面。

代码是高内聚的

内聚是从功能角度来度量模块内的联系,代码关联性比较强的代码应该放在内聚在一起,形成一个独立的功能模块,可以是一个独立的类,也可以是一个微服务。其实判断代码是否内聚一个比较简单的方法就是看你能否给代码或者服务给一个贴切的名字,如果代码功能不内聚,我们是很难用一个简短的名字来表示它的含义的。

代码是低耦合的

耦合性(Coupling),也叫耦合度,是对模块间关联程度的度量。耦合的强弱取决与模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差。

耦合比较高的代码危害比较大,最常见的表现就是改一个模块的代码会影响许多其它模块,最终必然导致大家不敢修改旧的代码,只能不停的添加新的接口,系统的可维护性非常差。

转载于:https://www.cnblogs.com/kaibin/p/6554142.html

相关文章:

  • prototype 常用方法
  • 构建高质量的C#代码
  • C#的Enum—枚举
  • python 常用模块
  • 比较有用的枚举方法
  • 长训总结
  • 地形编辑工具
  • 怎么在企业管理器中得到执行一个select语句的毫秒级时间
  • Wireshark抓包过滤
  • 关于Remoting的个人使用心得
  • 工作不顺心怎么办?——Leo网上答疑(57)
  • 操作系统版本
  • SQL中 NVARCHAR 和 VARCHAR 两者之间的优势与劣势
  • 学习进度条-第四周
  • OEM界面乱码
  • .pyc 想到的一些问题
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Centos6.8 使用rpm安装mysql5.7
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • C语言笔记(第一章:C语言编程)
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Js基础——数据类型之Null和Undefined
  • vue.js框架原理浅析
  • vue-router的history模式发布配置
  • 程序员最讨厌的9句话,你可有补充?
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 深度学习入门:10门免费线上课程推荐
  • 译自由幺半群
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #162 (Div. 2)
  • (汇总)os模块以及shutil模块对文件的操作
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (转)iOS字体
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .Net Core和.Net Standard直观理解
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • ::前边啥也没有
  • [100天算法】-目标和(day 79)
  • [AAuto]给百宝箱增加娱乐功能
  • [AIGC] Redis基础命令集详细介绍
  • [BZOJ1178][Apio2009]CONVENTION会议中心
  • [C/C++随笔] char与unsigned char区别
  • [C++]Leetcode17电话号码的字母组合
  • [CSS] - 修正IE6不支持position:fixed的bug
  • [CSS]浮动
  • [Flutter] extends、implements、mixin和 abstract、extension的使用介绍说明