没有对比就没有伤害,优秀的代码VS糟糕的代码

简介:

可持续开发不仅在于项目架构设计,还与代码质量密切相关,代码的整洁度和质量成正比。—— Robert C. Martin, “Clean Code”

如果你还没有发现代码质量的区别,如果你从未见过优秀的代码,或者从未见过糟糕的代码,那么本文将以直观地对比,告诉你代码质量究竟会有多大的区别。

没有对比就没有伤害,优秀的代码VS糟糕的代码

[ 代码量 ]

我们知道代码量显示着功能的复杂程度,例如Windows XP的代码量超过2000万行,Linux内核有1500万行(2012年)。然而代码量和功能数量之间并非线性关系。

优秀的设计中,代码量和功能数的关系是这样的:

没有对比就没有伤害,优秀的代码VS糟糕的代码

糟糕的设计中,代码量和功能数的关系是这样的:

没有对比就没有伤害,优秀的代码VS糟糕的代码

优秀的系统往往会有优秀的结构设计:层次清晰、职责单一、模块化,方便扩展或者复用。功能的添加往往只是在现有框架中添加少量代码。

然而糟糕的设计中,层次混乱、互相耦合、难以阅读,既难以复用又不易扩展。每当被要求添加功能时,不得不几乎完整地实现整个功能的流程,并修复与原系统的所有兼容问题。

[ 注释 ]

优秀的代码中,注释是这样的:

没有对比就没有伤害,优秀的代码VS糟糕的代码

糟糕的代码中,注释是这样的:

没有对比就没有伤害,优秀的代码VS糟糕的代码

最愚蠢的程序员都能写出机器能读懂的代码,而优秀的程序员能写出人可以读懂的代码。

程序的注释是为了让人读得懂。多数优秀的代码中,注释几乎接近代码行数的一半,描述函数功能、解释参数配置、指出陷阱所在。而糟糕的代码中不仅不含这些注释,甚至会保留大量残余代码,可读性差又难以重构。

[ 命名 ]

优秀的代码中,命名是这样的:

没有对比就没有伤害,优秀的代码VS糟糕的代码

糟糕的代码中,命名是这样的:

没有对比就没有伤害,优秀的代码VS糟糕的代码

命名是为了让代码更加容易阅读,使用规范的术语不仅更加易懂,同时也是开发者知识水平和开发经验的表现。如果说以中文拼音命名显得奇怪,那么直接以a, b, c, d命名的便会显得可恨,谁记得你的a是神马东西!

看一个经典的例子,字符串替换:

没有对比就没有伤害,优秀的代码VS糟糕的代码

没有对比就没有伤害,优秀的代码VS糟糕的代码

稍微有点Java常识的便会想到正则表达式:

何必拷贝这一堆的代码给老板看呢?开发中确实有很多时候,直接拷贝代码既能立竿见影地完成功能,又不会影响原有功能。但这样的代码多起来之后,万一功能调整你便需要重新debug所有的副本。花一些时间学习更优雅的用法是值得的。

[ 函数 ]

保持函数的短小,使你的代码更加易读,例如:

没有对比就没有伤害,优秀的代码VS糟糕的代码

将复杂的逻辑分步骤完成。如果写在一起将会是这样的:

没有对比就没有伤害,优秀的代码VS糟糕的代码

相信我,一旦你写了这样的函数,它会随着时间的推移变得越来越长,直到有一天,你也忘了其中的一段代码到底是做什么的。

事实上,复杂的函数不仅可以按照步骤划分,更应按照层次来细化。不要在一个函数中进行不同层次的操作,否则它会变得非常难懂。 


原文发布时间为:2017-10-09 

本文作者:佚名

本文来自云栖社区合作伙伴“51CTO”,了解相关信息可以关注。

相关文章
|
jenkins 持续交付 网络安全
Docker Jenkins 安装配置
Docker Jenkins 安装配置
130 1
|
设计模式 缓存 算法
Python设计模式:23种设计模式介绍
设计模式是软件开发中经典的解决问题的方法,包含23种设计模式,它们可以分为三类:创建型模式、结构型模式和行为型模式。
241 1
|
存储 物联网 Linux
AliOS Things操作系统之中断管理
前言本文主要介绍AliOS Things中断相关的概念。由于中断处理与CPU架构密切相关,所以本文会基于HaaS100开发板/HaaS EDU K1所使用的ARM Cortex-M3的CPU架构,来介绍AliOS Things的中断管理机制。读完本文,大家将深入了解AliOS Things的中断处理过程、如何添加中断服务程序(ISR)以及相关的注意事项。AliOS Things 中断管理硬件中断行
700 0
AliOS Things操作系统之中断管理
《数据库系统概论》第一章 绪论
《数据库系统概论》第一章 绪论
94 0
|
Java 测试技术 Maven
学习Spring源码篇之环境搭建
本文是学习 Spring 源码的第一篇,下载 Spring 源码及编译运行并测试。
586 0
学习Spring源码篇之环境搭建
|
XML Java 数据格式
再学习之Spring(依赖注入).
一、概述     Spring框架是以 简化Java EE应用程序的开发 为目标而创建的。Spring可以实现很多功能,但是这些功能的底层都依赖于它的两个核心特性,也就是依赖注入和面向切面编程。几乎Spring所做的任何事情都可以追溯到下述的一条或多条策略: 基于POJO的轻量级和最小侵入性编程;通过依赖注入和面向接口实现松耦合;基于切面和惯例进行声明式编程;通过切面和模板减少样板式代码。
1151 0
|
Linux
Linux Context , Interrupts 和 Context Switching 说明【转】
转自:http://blog.csdn.net/tianlesoftware/article/details/6461207 一. 进程Context 定义        当一个进程在执行时, CPU的所有寄存器中的值、进程的状态以及堆栈中的内容,比如各个变量和数据,包括所有的寄存器变量、进程打开的文件、内存信息等。
1158 0
|
程序员 机器学习/深度学习 C++
程序员面试题一
用c\c++语言 题目:输入是一个数N(范围是1到100) 要求按下面格式输出: 比如输入是N为5, 输出为: 1 2*2 3*3*3 4*4*4*4 5*5*5*5*5 5*5*5*5*5 4*4*4*4 3*3*3 2*2 1  解答: #include...
650 0
|
3天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1101 0