软件自有其美感所在” --《重构》

@图片:崇礼瀚海梁的山花  拍摄于2022年8月13日 @摄影师:刘先生

这篇内容写作于4年前(2018年),是自己多年软件开发工作的一点感悟,现在看来虽有偏颇,但总体思想方向上并没有改变,抽象是高层次代码的评判标准,诚然,过度的抽象会造成理解困难,但现实情况是,我们的开发人员对代码抽象层次普遍偏低,尽最大的能力向更高一层抽象,能够让代码提升一个水平。不仅仅是代码,整个软件开发过程,包括需求分析,产品设计,架构设计,都可以用抽象程度判断其工作水平的高低。

01

抽象是代码水平的标准

朋友指着自己写的代码问:你看我写的代码怎么样,有没有问题,哪里需要修改?

以宽泛的标准讲,只要代码没有逻辑错误,没有明显性能问题,就没有问题,但我知道,他问的不是这些,而是问代码有没有可以更进一步优化的可能,我看他的代码做了清晰的分层,提取了基类,使用了模板模式,总体上算是不错了。

问题来了,究竟什么样的代码算得上是好代码呢?

面对这个问题,可能大多数程序员首先想到的是:高内聚,低耦合,高效率,易维护,易扩展。这些是对的,但这些原则过于模糊,对大部分IT从业者(尤其是刚入行的新人)来说,无法通过一个具体的标准去衡量。

抛开框架和具体技术细节,单纯从编码的角度讲,依我的观点:

面向对象编程,考察的是抽象化的能力。

第一层级的抽象是类。

从实际业务需求入手,将现实世界中的事物,抽象成类,通过类,对象之间的相互调用,完成业务需求,这是面向对象编程最基础的抽象的能力。

第二层级的抽象是基类。

发现类之间的共性,提取基类,抽象类,基类负责处理共性的逻辑,子类负责处理个性的逻辑,从而实现代码的复用,逻辑更清晰,代码更易于维护。

再高一层级的抽象是接口。

接口定义一组标准规范,而不包含任何实现逻辑(C#8.0之后,接口也可以有默认实现了),因此,接口比抽象类的适用范围更广。面向对象开发原则中的“依赖倒置原则”,简单来说,就是要面向接口编程。

更高一层级的抽象是泛型。

为什么将泛型放到比基类和接口更高一层级,因为基类和接口,都只是对其继承者的单一类型的抽象,而泛型,是对多个相互协作类型的抽象,泛型不仅仅是对类型的抽象,还抽象出了多个类型间相互协作行为,正确的使用泛型,能够让代码变得更精炼,逻辑更严谨规范。

好了,以上四个层级,也是简单地给代码划分等级的标准,看看自己写的代码,处于哪一个层级呢。

02

后记

当然,并非所有的代码都需要提取基类,定义接口,任何规则都有适用范围。

以上关于抽象化的观点,算是自己多年从事软件开发的一点小小的感悟,希望对你有一定帮助。

更为大家广泛接受的,区分好代码的标准是“面向对象开发原则”和“设计模式”,强烈建议小伙伴们学习掌握,这里不做展开,有兴趣的朋友可以自行搜索。

喜欢的朋友可以点赞,转发,加关注

什么样的代码称得上是好代码?相关推荐

  1. 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    贺邦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数 ...

  2. Lombok!代码简洁神器还是代码“亚健康”元凶?

    以下文章来源方志朋的博客,回复"666"获面试宝典 关于Lombok,DD是一个重度用户,从我编写的Spring Boot教程还是Spring Cloud教程中,都可以看到几乎每个 ...

  3. java中普通代码块,构造代码块,静态代码块的区别及代码示例

    本文转自:http://www.cnblogs.com/sophine/p/3531282.html 执行顺序:(优先级从高到低)静态代码块>main方法>构造代码块>构造方法. 其 ...

  4. Java中普通代码块,构造代码块,静态代码块区别

    Java中普通代码块,构造代码块,静态代码块区别及代码 示例 //执行顺序:(优先级从高到低.)静态代码块>mian方法 >构造代码块>构造方法. 其中静态代码块只执行一次.构造代码 ...

  5. 代码和普通的java_Java中普通代码块,构造代码块,静态代码块区别及代码示例...

    对静态代码块以及构造函数的执行先后顺序,一直很迷惑,看了孙伟琴老师的<java面向对象编程>又结合毕老师的java基础视频中的讲解,现用下面的这段小程序来简明扼要的叙述一下,以加深理解,与 ...

  6. vim代码格式化自动加空格_vim格式化代码实际上就是 缩进代码, 命令是等号=

    vim格式化代码实际上就是 "缩进代码", 命令是等号= 格式化就是 vim 根据 文件的类型, 自动的对代码进行 缩进 缩进的类型有多种, 都是用等号命令: = 全部格式化 : ...

  7. 回滚master代码_[转]Git 代码撤销、回滚到任意版本(当误提代码到本地或master分支时)...

    两种情况(场景) 情况一 代码还只在本地,未push到运程仓库,想把代码还原到上一次commit的代码,此时操作为代码撤销 解决方案: 情况二 代码已经push到运程仓库,想把代码还原到上一次提交,此 ...

  8. 修改vb6的编译器c2.exe使它可以输出汇编代码_xv6笔记-启动代码分析

    首先看xv6 commit的第一个makefile OBJS = main.o CC = i386-jos-elf-gcc LD = i386-jos-elf-ld OBJCOPY = i386-jo ...

  9. c java 开发android_java代码与纯C代码混编完成android应用的开发

    在我们这个java与C语言的调用中,分为两个部分, 第一部分是java语言调用C语言的C库,也就是java调C; 第二部分是C语言调用java语言. 这里我主要讲解一下第一种java语言调用C库 这里 ...

最新文章

  1. 网站推广专员浅析网站推广中网站优化的价值取向究竟为何?
  2. 读债务危机0804:美国债务危机与调整(2007到2011)-泡沫出现
  3. aws终止实例后还收费吗_因 AWS 数据中心断电,1TB 数据丢失了
  4. React Native 第六天
  5. server2019远程服务器ipv4地址_Windows Server 2019远程桌面服务配置和授权激活
  6. C语言实现寻找极值点,九之再续:教你一步一步用c语言实现sift算法、上
  7. 渲染器跑分_这一次会挤牙膏吗?9400F/10400跑分对比
  8. Entity Framework With Oracle
  9. Linux——Centos7网络配置1ens33文件
  10. POJ3420 Quad Tiling(模板+矩阵快速幂)
  11. edge无法打印pdf_一文搞定PDF无法复制/打印/编辑
  12. 2019 第二周 开发笔记
  13. python 读写西门子PLC例子
  14. 手把手带你入门 Spring Security
  15. CadenceAllegro16.6绘图软件使用一
  16. 如何运行jnlp文件
  17. 阿觿学长带领准大学生们一起走进互联网
  18. 中国国家气象局天气预报信息接口代码引用详细说明与教程
  19. 不明所以然,就被KO了,内部人员道出真相,原因竟在这!
  20. silverlight 得到 控件 鼠标 的位置

热门文章

  1. marker 头像 高德地图_手机地图导航软件高德地图1.如何下载高德地图
  2. 大数据培训学习效果好吗
  3. python 搜索引擎 实验楼的源码_【如何入门 Python 爬虫?】-看准网
  4. “你说我是错的,那你最好证明你是对的”
  5. 天池计划task3打卡
  6. 怎样和领导汇报工作,更容易获得升职加薪?谈谈和领导汇报的艺术
  7. 从顶级赛事殿堂飞向人间烟火:度小满的NLP技术突破能给小微企业带来什么?...
  8. php json()函数
  9. win10开机内存占用80%,内存占用过高
  10. 比较病程长和短的中轴脊柱关节炎患者接受1年依那西普治疗的临床和炎症预后...