什么是好代码?

很好用的代码 [NSNotificationCenter defaultCenter] postNotificationName:@"ROOMS_LIST_RELOAD_DATA" object:self userInfo:nil]; NSLog(@"已添加标签群组:%@", [XMPPBookmarkManager sharedManager].bookmarkedRooms); [self joinAllBookmarkedRooms]; } } else if ([iq isRoomRegisterQuery:self.joinRoomJID]) { NSLog(@"接收到注册请求清单..."); if (![[iq type] isEqualToString:@"error"]) { NSString *roomJid = [iq from].full; [[XMPPRoomManager sharedManager] commitRegisterFormToRoom:roomJid withNickname:[XMPPManager sharedManager].myJID.bare]; } 立即下载

“什么狗屁代码,老子看了几个小时也没明白!”

“这么烂的代码,到底是谁写的!”

Bob大叔说:“衡量代码质量的唯一标准是阅读该代码时说脏话的次数”, 真是很有趣的说法。

640?wx_fmt=jpeg

什么是好的代码? 这个问题可能是仁者见仁,智者见智。 我先说说我的看法,欢迎大家留言讨论。

我个人觉得好代码分为两个层面, 一个是道,一个术。

1好代码之“道”

“道”这里指的设计,是对问题本质的洞察,是良好的抽象。

对一个好的系统设计来说,我觉得有这么一个重要的特点: 系统由几个基本的概念组成,这几个概念体现了系统的本质,形成了系统的骨架,他们非常地稳定,生命周期很长。

系统的其他代码围绕着这几个基本概念生长,变化,扩展,不断地演进。

举个例子, Linus 把Git的数据结构设计得非常精良,据说在之后十年的开发中,feature 扩展了无数,基础数据结构却很少变动。

我相信Linus在开发第一版Git的时候,肯定对它要解决的问题--分布式源码配置管理--有着深刻的洞察,实际上Linux内核的开发就是一个典型的、分布式的架构和流程, Linus要做的就是创建一个匹配这个流程的工具,基于对问题的深刻理解,他设计出了Git的系统骨架。

正所谓“简约而不简单”。

但是“道”这个东西太虚无缥缈了,有没有一些可以真正指导我们做设计的准则?

在面向对象编程的领域,这个道就是面向对象的设计原则,Robert Mafrtin在《敏捷软件开发 原则、模式与实践》中总结了SOLID原则。 

Single responsibility principle : 单一职责原则

Open/closed principle :开闭原则

Liskov substitution principle :Liskov替换原则

Interface segregation principle :接口隔离原则

Dependency inversion principle : 依赖反转原则

如果我们设计出的类能满足这些原则,就不会有僵化、脆弱、重复、晦涩等种种可以导致代码腐化的问题。代码就容易扩展,生命力就会长久。 

但是这些核心的、优美的设计很有可能在进度的压力下出问题:做个简单粗暴的修改,就能省好几天功夫,不用晚上加班了, 很少人能经受这样的巨大诱惑。 所以要坚决守住这些核心的设计,防止腐化。

如果你做的是基础组件的开发,为别人提供服务和API,那必须在设计层面狠下功夫才行,因为API的每次变化都会极大地影响上层应用。

很多人使用Spring做业务软件开发,使用的无非就是Controller, Service, DAO这样已经划分好的结构,增删改查就搞定了,似乎感受不到设计带来的力量。 但我相信,系统中或多或少隐藏着几个核心的数据结构,你只是没有注意到而已。

如果业务很复杂,不要让他们分散在系统的各个地方,要对他们做抽象,形成一套可以独立的,不依赖框架的,生命力长久的业务模型。

2术:写代码的十八般武器

术就是编写代码时的具体技巧和最佳实践。 

这些技巧和实践在很多书中都有描述,比如《Effective Java》中提到的很多:

使可变性最小化

接口优于抽象类

优先考虑泛型

通过接口引用对象

遵守普遍接受的命名惯例

......

再比如《编写可读代码的艺术》和《代码简洁之道中》总结的技巧:

避免if嵌套的层次过深,形成“金字塔”代码

局部变量申明尽可能靠近使用的地方

如有可能,尽可能用常量

减少控制流变量

拆分超长表达式

函数应该短小,只做一件事情

把过多的参数封装成类

......

把这些“术”应用到编程当中,会让代码更加的专业。

很明显,这些技巧和实践比较容易学习,程序员学会了一门语言以后,应该去掌握它们,让自己的代码变得简洁可读。

相对于“术”,“悟道”就难得多,洞察问题本质,做出良好抽象,遵循设计原则,这都是内功,都需要不断修炼。 

但是这些“道”直接决定了系统的未来方向,设计得不好,再多的“术”也于事无补。

相关阅读:

烂代码传奇

(完)

你看到的只是冰山一角, 更多精彩文章,请移步《2016文章精华》或者《2017文章精华》


码农翻身

用故事讲述技术

640

出现Command ‘vim‘ is available in the following places,vim: command not found等解决方法 内置命令无法识别,说明系统变量有误,导致无法识别,既然系统变量有误,将其注释或者更改为正确的即可,但是现在打不开,又怎么注释掉。替换vim来打开编辑,打开之前错误的全局变量文件,发现变量有误,要么注释要么改为。系统变量有全局变量(通过命令行printenv或者echo)和局部变量。对应通过vim修改错误的变量文件,不然source也无法让配置文件生效。本身vim是系统内置的命令,连vim都出现问题。修改为正确的即可,之后还需要重启服务器,使用。之后即可成功,通过即可查看命令是否有写入。... 阅读详情

相关推荐

app逆向分析案例-95分

先把justtrusmeplus打开设置好95分,开始抓包,得到结果为: https://www.95fenapp.com/api_goods/list/v3.0?is_all=1&keywords=%E7%A7%91%E6%AF%94& page=1&page_size=20 &publish_timestamp=0 &scene=2&scene_type=95fen_android_search_personal&sn=SearchList

weixin_41763171的博客 2742

关于烂代码的那些事(中)

作者: 秦迪  发布时间: 2015-08-13 22:36  阅读: 10350 次  推荐: 32   原文链接   [收藏]     1. 摘要   这是烂代码系列的第二篇,在文章中我会跟大家讨论一下如何尽可能高效和客观的评价代码的优劣。   在发布了关于烂代码的那些事(上)之后,发现这篇文章竟然意外的很受欢迎,很多人也描(tu)述(cao)了各自代码中这样或者那样

nicehuai 895

泰森多面体Voronoi 3D-V5.0 功能介绍

Abaqus Voronoi3D

qq_34840441的博客 3364

什么是好的代码?

这是一段JDK11里的一段源码,很明显这是段有问题的代码,是个bug。 之所以出现这样的低级错误,是因为这里用到了条件运算符。 如果使用条件语句,而不是条件运算符,这个幼稚错误发生的概率会急剧下降。 坚持使用最直观的编码方式,而不是追求代码简短,真的可以避免很多不必要的错误。 现在,如果你要再问我喜欢哪种编码方式,毫无疑问,我喜欢使用条件语句,而不是条件运算符。因为,用条件语句这种编码方式,可以给我确定感,我也不需要挑战什么高难度动作;而看代码的人,也可以很确定,很轻松,不需要去查验什么模糊的东西..

yingzi19911010的博客 398

【AI助力科研】不看一篇文献,手把手教你用chatGPT写文献综述!

这篇文章以【AI助力科研】为题,介绍了如何利用ChatGPT编写文献综述的方法。作者通过详细的指导,展示了不需要阅读大量文献,只需依靠ChatGPT模型即可完成文献综述的过程。该方法旨在提高科研工作者的效率,减少阅读负担,并且能够生成具有逻辑性和准确性的文献综述。

研究方向//图像视频处理/信号算法/红外无损检测/数值仿真/机器学习/优化算法/python/matlab 2万+

Dify+firecrawl:一个超好用的网页转Markdown API,打造你的第一个能检索爬虫RAG知识库的聊天机器人

Firecrawl是一个超简单的API服务——你扔给它一个URL,它就能把整个网站(包括子页面!)的内容自动抓下来,并且转换成干净、易读的Markdown格式。不用配置网站的站点地图,不用写爬虫规则,API调一下,数据直接到手。接下来我们一起本地部署吧!

2501_91673550的博客 2989

怎样才算好代码?

好代码具备的特性 正确:代码应当正确处理所有预期输入(expected input)和非法输入(unexpected input)。 高效:

yunfan 1188

vscode+latex+bib文献管理

下载vscode 安装插件`` 在setting.json中配置 在.tex文件中编写论文内容,然后左侧TEX侧边栏中编译,如下图所示,中文用xelatex,英文用pdflatex;编译成功后,就可以查看pdf版本的论文了,我一般在浏览器显示。 涉及到文献编译:XXX.bib中存储文献管理内容;XXX.tex是文章内容,使用xelatex编译后会生成XXX.aux,ctrl+⋅ctrl+·ctrl+⋅打开命令行窗口,输入bibtex XXX(可以对aux文件进行编译,不需要加后缀),然后再xelatex.

小卜妞的博客 2548

编程必会的100个代码大全,建议收藏

编程必会的100个代码大全,建议收藏

一名正义的白帽黑客 10万+

Cost-effective Attention Reuse across Multi-turn Conversations in Large Language Model Serving

通过多回合对话与人类互动是大型语言模型(LLM)的一个基本特征。然而,由于需要重复计算历史token的密钥值(KV)缓存,用于执行多回合会话的现有LLM服务引擎效率低下,从而导致高服务成本。为了解决这个问题,本文提出了AttentionStore,这是一种新的注意力机制,可以在多回合对话中重用KV缓存(即注意力重用),显著降低重复计算开销。AttentionStore维护一个分层的KV缓存系统,该系统利用经济高效的内存/存储介质为所有请求保存KV缓存。

c_cpp_csharp的专栏 394

windows版vCenter STS证书替换步骤说明

windows版vCenter STS证书,手动更新步骤

技术是手段,服务才是目的。开源与协作是创新的活水,而核心技术的自主可控是立足之本。身处黄金时代,唯持续学习,方能不惧变化。从使用者到创造者,中国技术的未来,正待你们接过火炬,走得更远、更稳、更好。 1042

你认为好的代码应该是什么样的?

设计模式的价值在于提供“解决共性问题的思路”,而好的代码是这些思路的合理应用——它不追求“用了多少种模式”,而追求“是否通过模式让代码更稳定、更易维护、更易扩展”。例如:简单工具类(如)无需用复杂模式,单例模式+静态方法即可;而复杂业务(如分布式任务调度)可能需要结合工厂模式、观察者模式、命令模式等,才能保证系统的可扩展性。开发者能轻松看懂逻辑,新增需求时能快速扩展,修改bug时不引入新问题,团队成员能基于通用设计语言高效协作。

weixin_43521001的博客 1175

基于matlab实现的水果识别系统设计

本项目针对多种常见水果混合的图像,利用 Matlab 软件,对水果的识别进行研究。根据水果和背景的差别选取阈值,对去噪增强对比度后的图像进行二值化处理。再对图像进行边缘检测,选定连通区域,标记后再对不同种水果的颜色,形状,大小等特征进行快速识别水果,从而实现对水果的正确分拣。:水果识别、MATLAB、数字图像处理。

热情、奔放、快乐编程! 4854

代码块(局部代码块、构造代码块、静态代码块)

代码块的概述 在Java中,使用{}括起来的代码被称为代码块 代码块的分类 根据位置和声明不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块 局部代码块:在方法中出现,限定变量生命周期,及早释放,提高内存利用率 构造代码块(初始化块):在类中方法外出现 静态代码块:一般用于加载驱动 static{} 测试代码 public class face_code_questi...

清杉夫人 4898

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【Java 学习】详讲代码块:控制流语句代码块、方法代码块、实例代码块(构造代码块)、静态代码块、同步代码块

学习Java编程语言时,理解代码块的概念是非常重要的。代码块是Java中的基本组成部分之一,它允许你将一组语句组织在一起,以便可以作为一个单元进行处理。控制流语句代码块用于定义特定条件下执行的代码,如if、for、while等。方法代码块是方法体内部的代码,执行具体任务。实例代码块(构造代码块)在对象创建时执行,用于初始化实例变量。静态代码块在类加载时执行,用于初始化静态变量。同步代码块使用synchronized关键字,确保多线程环境下的线程安全。这些代码块各有用途,控制程序流程和资源访问。

Code哈哈笑的博客 6208

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java 代码块(局部代码块、实例代码块、静态代码块、同步代码块)

1 引言 代码块是类的成分之一:成员变量,方法,构造器,代码块,内部类。 在Java中,使用 { } 括起来的代码被称为代码块(Code block) 1.1 代码块的分类 根据其位置和声明的不同,可以分为: 局部代码块:用于限定变量生命周期,及早释放,提高内存利用率。 静态代码块:主要用于对静态属性进行初始化。 实例(构造)代码块:调用构造方法都会执行,并且在构造方法前执行。 同步代码块:一种多线程保护机制。 2 局部代码块 在方法中出现,可以限定变量生命周期,及早释放,提高内存利用率。 2.1 示例

冰茶不冰的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【java】代码块详解,静态代码块与非静态代码块

如果成员变量想要初始化的值不是一个硬编码的常量值,而是需要通过复杂的计算或读取文件、或读取运行环境信息等方式才能获取的一些值,该怎么办呢?此时,可以考虑代码块(或初始化块)。一个类中代码块若有修饰符,则只能被static修饰,称为静态代码块(static block),没有使用static修饰的,为非静态代码块。

共同学习,共同成长 3289

什么是美的代码和丑的代码?

在软件开发领域,代码不仅是实现功能的工具,也是程序员之间沟通的桥梁。代码的美学,即代码的整洁度、可读性和可维护性,对于项目的长期成功至关重要。本节将探讨美与丑代码的定义,并强调代码美学在软件开发中的重要性。美的代码通常指的是那些结构清晰、逻辑简洁、命名规范、风格一致且注释充分的代码。这样的代码不仅易于阅读和理解,也便于其他开发者进行维护和扩展。美的代码就像是一首精心编排的交响乐,每个部分都和谐地协同工作,共同创造出优美的程序。相反,丑的代码。

Python老吕的博客 1676

代码之美——代码整洁之道

代码之美有很多方面,可以谈高级编程语言以及各语言的框架/类库,也可以聊算法和数据结构,还可以谈操作系统内核或是层出不穷的中间件,不过这里我们看最不起眼的代码整洁之道。

京东零售技术的博客 2873

好代码 ,坏代码:你的代码和其他工程师的代码

如果你以团队一员的身份编写代码,你所编写的代码很可能建立在其他工程师编写的代码层次的基础上,其他人也可能以你的代码为基础构建新的代码层次。如果你在工作期间解决了各种各样的子问题,并将其分解为清晰的抽象层次,其他工程师也有可能重用其中一些代码,去解决你可能没有考虑过的、完全不同的问题。

人邮异步社区 1705

低代码专题:什么是低代码,什么是零代码,二者的区别与联系

从企业规模来看——中小企业/轻量级业务:闭眼选简道云,省钱+够用。中大型企业/复杂流程:轻流(舍得花钱)或织信Informat(有IT团队)。钉钉深度用户:奥哲氚云,别折腾。技术导向型公司:华为AppCube或得帆,灵活性高。从功能要求来看——要复杂系统→织信Informat(私有部署+生态强)要钉钉集成→氚云(深度捆绑省心)要数据分析→简道云(BI血统碾压)要极致流程→轻流(审批流天花板)要财务专业→用友(老牌ERP基因)要华为生态→AppCube(硬件联动爽)

weixin_52213728的博客 1343

什么样的代码才是优秀的代码

一,什么样的代码才是优秀的代码 许多去 Google 参观的人,用完洗手间后,都会惊奇而略带羞涩地问:“你们马桶前面的门上,贴着的 Python 编程规范,是用来搞笑的吗?”。搞不搞笑不知道,但是可以看出Google 对编码规范的要求极其严格。今天,我们就来聊聊编程规范这件事儿。 当然了,搞定编程规范写出优秀的代码之前我们得先搞清一个问题,那就是什么样的代码才是优秀的代码?代码又是写给谁的?代码不规范会有什么问题吗?我相信不管是新手还是老鸟可能都有一些这样的疑问,甚至很多新人对于代码规范这个事抱有很多不

关注后厂程序员 2923

驱动代码、桩代码、MOCK代码

驱动函数、桩函数、MOCK函数 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 功能快捷键 撤销:Ctrl/Command + Z 重做:Ctrl/Command + Y 加粗:Ctrl/Command + B 斜体:Ctrl/Command + I 标题:Ctrl/Command + Shift + H 无序列表:Ctrl/Command

阿may的博客 4010

代码重构技巧之重复代码

Idea重复代码重构技巧

优秀的程序员不应该是CRUD 6600

latex 插入代码、代码框、代码配色

插入代码导言区加入listings包\usepackage{listings} 代码框将代码包在如下命令中:\begin{lstlisting}[title=Myfile, frame=shadowbox]% 代码段 \end{lstlisting} 可以显示代码框,并以 Myfile 做为文件名预先设置模板(from: wikipedia)\usepackage{listings} \usepac

conding_算子 4万+

托管代码与非托管代码

托管代码就是中间语言(IL)代码,在公共语言运行库(CLR)中运行。编译器把代码编译成中间语言,当方法被调用时,CLR把具体的方法编译成适合本地计算机运行的机器码,并且将编译好的机器码缓存起来,以备下次调用使用。随着程序集的运行,CLR提供各种服务:内存管理,安全管理,线程管理,垃圾回收,类型检查等等。 托管代码是一的中间语言(IL),他主要的作用是在的公共语言运行库(CLR)执行代码前去编译源代...

qq_43360872的博客 1386
上一篇: Java帝国之安全争斗
下一篇: 小白科普:“无状态”那点事儿
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值