什么样的代码称得上是好代码?

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

3e68d7727959d060639830553bc5d352.jpeg

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

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

01

抽象是代码水平的标准

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

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

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

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

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

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

第一层级的抽象是类。

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

第二层级的抽象是基类。

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

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

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

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

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

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

02

后记

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282299.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Coding and Paper Letter(十四)

2019独角兽企业重金招聘Python工程师标准>>> 资源整理。 1 Coding: 1.R语言包ungeviz,ggplot2的拓展包,专门用来作不确定性的可视化。 ungeviz 2.计算机图形学相关开源项目。 计算机图形学光线追踪开源项目C源码。 computer graphics ray tra…

QBC运算符含义

HQL运算符 QBC运算符 含义 Restrictions.eq() 等于 <> Restrictions.not(Exprission.eq()) 不等于 > Restrictions.gt() …

eclipse安装反编译插件

一、下载插件 1、官方地址&#xff1a;http://jd.benow.ca/ 2、百度网盘&#xff1a;http://pan.baidu.com/s/1eSJ7Tiq 密码&#xff1a;sr6p 二、打开eclipse&#xff0c;点击“Help > Install New Software” 三、Name填&#xff1a;JD-Eclipse Update Site&#xff08;可…

PHP 项目中缓存的多种应用实现

一、CDN缓存原理和介绍 1、各地部署多套静态存储服务&#xff0c;本质上是空间成本换时间 2、CDN是域名和真实服务器中间的一个环节&#xff0c;添加cdn节点后&#xff0c;用户访问时&#xff0c;自动选择最近的节点内容&#xff0c;不存在再请求原始服务器 3、CDN本质上是一种…

【tomcat】servlet原理及其生命周期

1.什么是servlet&#xff1f; Servlet&#xff08;Servlet Applet&#xff09;&#xff0c;全称Java Servlet,是用Java编写的服务器端程序。而这些Servlet都要实现Servlet这个接口。其主要功能在于交互式的浏览和修改数据&#xff0c;生成动态Web内容。Servlet运行于支持Java的…

实现一个监控 IP 的 windows 服务

实现一个监控 IP 的 windows 服务Intro我们公司的 VPN 用自己的电脑连公司的台式机的时候需要用 IP 地址&#xff0c;有一次尝试去连的时候发现连不上&#xff0c;第二天到公司发现 IP 变掉了&#xff0c;不是之前连的 IP 了&#xff0c;于是就想写一个简单 Windows 服务来监控…

微信企业号开发:启用回调模式

微信企业号开发怎样启用回调模式&#xff1f;就是简单的登陆PC版微信&#xff0c;点击应用中心&#xff0c;选择须要应用&#xff0c;再点击回调模式启用&#xff1f;似乎不是这么简单。&#xff01;能够看到核心的仅仅有三个URL。Token&#xff0c;EncodingAESKey这三个參数能…

MVC中提交表单的4种方式

一&#xff0c;MVC HtmlHelper方法 Html.BeginForm(actionName,controllerName,method,htmlAttributes){} BeginRouteForm 方法 (HtmlHelper, String, Object, FormMethod) 二&#xff0c;传统Form表单Aciton属性提交 三&#xff0c;JqueryAjax 提交表单 四&#xff0c;MVC C…

photoshop制作网站圆形图标ico

1、选择左侧工具栏中的椭圆工具2、鼠标直接在图片上选择区域3、在图片上鼠标右键建立选区&#xff0c;在弹出的对话框直接点确定变成这样&#xff1a;4、点击选择&#xff0c;然后点击反选变成这样5、图层栏&#xff0c;在图片上右键复制图层&#xff0c;弹出对话框直接确定即可…

《简明 PHP 教程》00 开篇

《简明 PHP 教程》是一本旨在介绍如何使用 PHP 语言进行编程的自由图书。它以教材与指南的形式为入门者介绍 PHP 编程语言。如果你对电脑知识的了解仅限于如何保存文本文件的话&#xff0c;那这本书就是为你准备的。 本博客后续将以连载的方式为读者呈现这本书。 关于作者 一名…

WPF 窗体设置亚克力效果

WPF 窗体设置亚克力效果控件名&#xff1a;WindowAcrylicBlur作者&#xff1a; WPFDevelopersOrg - 吴锋原文链接&#xff1a; https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用大于等于.NET40。Visual Studio 2022。项目使用 MIT 开源许可协议。WindowAcrylicB…

JS向后台传递json数组对象

var Obj [];            //一下代码可以循环插入            var returnObj new Object();//创建一个对象returnObj.id “123”&#xff1b;returnObj.money 456“”;Obj.push(returnObj);           JS中将Obj对象进行序列化操作   …

ArrayBlockingQueue跟LinkedBlockingQueue的区别

1.队列中的锁的实现不同 ArrayBlockingQueue中的锁是没有分离的&#xff0c;即生产和消费用的是同一个锁&#xff1b; LinkedBlockingQueue中的锁是分离的&#xff0c;即生产用的是putLock&#xff0c;消费是takeLock 2.在生产或消费时操作不同 ArrayBlockingQueue基于数组&…

jqGrid('setSelection',rowid)报Cannot read property 'multiple' of undefined

项目组非要上jeeweb框架&#xff0c;用jqgrid大量iframe做为前端框架&#xff0c;臃肿不堪。 今天上午&#xff0c;在进行选定操作jqGrid(setSelection,rowid)报Cannot read property multiple of undefined&#xff0c;怎么分析也找不出原因&#xff0c;最后百度搜了一下竟然有…

数据分块加载——BigPipe 技术【类似facebook】

一、原理 分块加载&#xff0c;加载完一块&#xff0c;就先把页面数据刷给用户&#xff0c;再加载下面的&#xff0c;直到加载完毕二、基础需知&#xff1a;三、服务端和php的相应配置 如果想实现分块加载【bigpipe技术】&#xff0c;还需要对nginx.conf 和 php.ini 进行相应配…

Maven -- 在进行war打包时用正式环境的配置覆盖开发环境的配置

我们的配置文件一般都放在 src/main/resource 目录下。 假定我们的正式环境配置放在 src/main/online-resource 目录下。 那么打成war包时&#xff0c;我们希望用online-resource下的配置文件取代resource 下的配置文件。 pom.xml 插件配置&#xff1a; <plugin><gr…

右键一下,哇塞!

面向 Dev 频道的 Windows 预览体验成员微软推送了 Windows 11 预览版Insider Preview Build 25211主要变化1.微软改进了 Windows 11 小组件面板&#xff0c;小组件面板中的添加按钮更加醒目&#xff0c;点击用户头像将打开小组件设置。Windows 11 小组件由 Microsoft Edge 浏览…

前端学习 -- Css -- 内联元素的盒模型

内联元素不能设置width和height&#xff1b;设置水平内边距,内联元素可以设置水平方向的内边距&#xff1a;padding-left&#xff0c;padding-right&#xff1b;垂直方向内边距&#xff0c;内联元素可以设置垂直方向内边距&#xff0c;但是不会影响页面的布局&#xff1b;为元素…

Redis 数据持久化的方案的实现

一、需要了解的基础 1、Redis实现数据持久化的两种实现方式&#xff1a; RDB&#xff1a;指定的时间间隔内保存数据快照 AOF&#xff1a;先把命令追加到操作日志的尾部&#xff0c;保存所有的历史操作二、RDB 实现 Redis数据持久化&#xff08;默认方式&#xff09;1、编辑 red…

div剩余空间填满

div里有一个固定高度的div使其另一个div填满空间&#xff0c;外层div设置的高度为百分比&#xff0c;给外层一个相对定位&#xff0c;设置想要充满的div高度为100%&#xff0c;其中这次有个要求&#xff0c;使其填充div里面的内容距离固定高度div30px&#xff1b;给填充div一个…