很多人以为提高编码质量,需要很多激动人心的创新,需要明显的飞跃,这也许对,
但我个人感觉项目中提高编码质量是个水磨功夫,要一步步积累,方法论大多时候帮助不大。
这次先从命名说起。
当我们看到一份设计图或一份代码时,大多数人会【望文生义】。但使人【望文生义】却正是语言文字的根本使命。
因此,如果一个函数被命名为Add(),但内部实际做的是减法,那么这份设计或者这份代码,一定是很难理解的。
于是一个非常现实的问题就摆在了我们的面前:我们究竟应该如何为类,为方法等等命名?
以命名而论,有两个较大的陷阱:一个是名实不符,一个是词义混淆。
名实不符的常见情形又有两类。比如:
- 以偏概全。假设说一个方法被命名为OutputLineNumber(),但实际上这个方法会在分析源文件后,同时输出LineNumber和指定行号下的内容
- 大而无当。假使说一个类被命名为XMLHandler,那么看得人基本不能从这个名字上获得有效信息。这主要是由于Handler这个词的含义过于宽泛。
上文所说的命名为Add()但实际做减法操作是名实不符的极端情形,达到了名实相反的地步。
词义混淆则源自语言文字自身的限制。常表现为一词多义或多词一义。
语言文字可以被看成是一种表意的符号系统,这个符号系统的典型特征是其模糊性。
同一个意思可以有许多种表达方法。比如说:index和number是两个不同的词,但很多时候其意义互相重叠。而假如说一个变量名为fileNumber,那么这个变量既可以代表文件的总数,也可以代表某个具体文件的编号。
上述问题会因为英语不是我们的母语而变得更为麻烦。
名实不符与词义混淆这类陷阱的一个主要触发条件是软件自身的不停衍化。
在之前的文章里曾经提到过,对于概念和逻辑的认知是一个逐层递进的过程。
在这一过程中,包,类,方法等的内涵必然会发生变更。变更无疑的会使名实不符这类问题加剧。比如:一个类原本负责输出测试结果,这时候OutputTestResult这样的命名可能是合适的。可随着软件功能的增强,最终可能不知要输出结果,还要对结果进行一定分析和统计。这样原来的命名就显的有些不合适了。
在对命名这一问题的根源进行分析之后,我们来看看可能的应对方法。
命名问题事实上并不能只在命名这一环节进行解决,首先要有容易命名的对象,接下来才有容易命名的事实。
比如说:是先有猫和狗这类外在特征不同的动物,接下来我们才用猫和狗这样不同的名字来称呼他们,而非相反。
如果概念之间是正交的,概念的边界也是清晰的,那么命名无疑会容易很多。好的设计是改善命名的基础。
也就是说,很多时候我们感到命名困难,真正原因可能并非是命名的技能不够,而是设计还不够优化。
在努力改善设计之后,才需要面对纯粹的命名问题。
从本质上来看,命名问题并不是一个编程的问题,而是一个表达的问题。命名最终对读程序的人负责。
有些表达上的基本原则对于解决命名问题会有些帮助,比如:
无疑的每个人都是有创造性的,但在命名的时候发挥创造性则更可能是有害的。比如说:在XML的世界中一般使用sibling这个词来表示兄弟节点,这种时候就不需要创造性的使用brother node这样的自制词汇了。
对一般人而言要求事先记忆几十个缩写词,而后来读程序是不太可能的事情。所以如果一个程序中充满_Tx和CSCP这样的特制符号的话,那这样的程序几乎一定是不容易懂的。
一个典型的反例是P.J Plauger版的C++标准模板库。也许是出于隐藏实现细节的目的,这份标准模板库的实现里面几乎完全不用完整词汇。如果想体验一下不用完整词汇的后果,那么可以读一下这里面的代码。
具体是一个方向。
比如说:可以用OutputLinenumber()的时候,就不要用Output()。而可以用OutputCppLinenumber()的时候就不要用OutputLinenumber()。
这条规则最终会导致常说的Coding Rule。对具体如何定义Coding Rule,《代码大全》一书中给出了详细的指导,这里就不在说明了。
有一点需要补充的是,就和说话的时候记不住语法一样,设计或做编码的人往往也记不住编码规则。所以规则也不宜过多。如果必须详细,那么至少要主次分明。比如说:统一使用主宾结构还是使用动宾结构这样的选择会影响程序的大部分内容,那么就应该优先统一。
分享到:
相关推荐
IOS 开发编码及命名规范的目的是为了提高代码的质量和可维护性,减少代码的维护成本和BUG的出现。同时,也为了提高团队的协作效率和开发效率。 适用范围 IOS 开发编码及命名规范适用于所有iOS 开发工程师,无论是...
遵循这些编码习惯和命名规则,可以显著提升代码质量,使得代码更容易理解和维护。同时,这也有助于团队成员之间达成共识,减少因个人风格差异引起的误解。在实际开发中,除了遵循这些规则,还应根据项目需求和团队...
区域和子区域的命名与编码是资源定位的基础。它们通常按照地理划分或者行政区域来定义,如省份、城市、区县等。命名规则可能要求包括特定的标识符,如城市拼音缩写,编码则可能采用数字组合,以便快速定位和检索。 ...
### 编码命名规约详解 #### 一、共性规则概述 在软件开发过程中,良好的命名习惯能够显著提升代码的可读性和可维护性。本文档总结了一系列实用且广泛的命名规则,适用于多种编程语言。 ##### 1.1 标识符直观且可...
### 观测指标标识符逻辑命名与编码系统(LOINC®) #### 一、概述 观测指标标识符逻辑命名与编码系统(LOINC®),即Logical Observation Identifier Names and Codes,是一种标准化的医疗术语编码系统,旨在提高...
《LOINC:观测指标标识符逻辑命名与编码系统的深度解析》 LOINC,全称Logical Observation Identifiers Names and Codes,是医疗行业中一个重要的标准,它为实验室检查、体征测量、问卷调查等各类医疗观测指标提供...
### Android编码命名规范详解 #### 一、Java代码命名规则 1. **代码与注释语言**:在Java代码中,避免使用中文字符,仅在注释中允许使用中文进行说明,以保持代码的国际化与易读性。 2. **变量命名**: - 局部...
《通信资源编码命名规范》旨在通过标准化通信资源的命名和编码规则,来提升电力通信网络的管理效率和服务质量。本规范主要面向中国南方电网通信网络资源的管理,其核心目标是统一资源理解,优化资源配置,保障通信...
C#编码命名规则是开发高质量C#项目的基础,遵循这些规则可以使代码更具可读性、一致性和维护性。以下是对标题和描述中提到的C#编码命名规则的详细解释: 1. **基本规则**: - 类、接口、枚举和结构的名称应使用...
.NET 编码方法和命名规则是软件开发中的关键实践,它们直接影响到代码的可读性和维护性。良好的编码规范能够帮助团队成员更好地理解和协作,同时也有助于减少误解和错误。下面将详细介绍这些规则。 首先,命名是...
【软件开发编码及命名规范】 编码规范在软件开发中扮演着至关重要的角色,因为它确保了代码的一致性、可读性和可维护性。本规范主要针对基于.NET平台的软件开发,旨在提供一套清晰的指导原则,使团队成员遵循统一的...
在编程世界中,遵循一套良好的编码和命名规范至关重要,它能提高代码的可读性、可维护性和团队协作效率。C#作为微软开发的面向对象的编程语言,也有其特定的编码和控件命名规范。以下是对这些规范的详细解释: 一、...
Java 编程命名规范和编码规范 Java 编程命名规范和编码规范是 Java...在 Java 编程中,遵守这些命名规范和编码规范是非常重要的,它们能够提高代码的可读性、可维护性和可扩展性,同时也能够提高开发效率和代码质量。
《观测指标标识符逻辑命名与编码系统(LOINC®)——中文翻译解析》 在医疗信息领域,LOINC®(Logical Observation Identifiers Names and Codes)是一种全球公认的标准,用于唯一标识医疗保健中的观察指标,如...
为了确保代码的可读性、可维护性和团队协作效率,遵循一套统一的编码规范、命名规范和优化规范至关重要。以下是一些关键点的详细说明: 1. **前言**: 编码规范的目的是为了提高代码质量,减少因不规范的编程习惯...
Java 安全与质量编码规范 本规范旨在提高 Java 应用系统的整体质量与安全水平,指导开发团队编写高质量的代码编码,并在软件开发生命周期的早期提供质量和安全保障。 引言 Java 安全与质量编码规范的制定旨在提高...
在软件开发领域,编码规范是提升代码质量和团队协作效率的重要工具。尤其对于C++这种复杂的编程语言,遵循一套统一的编码规范显得尤为重要。华为作为全球知名的科技公司,其在C++编码规范方面积累了丰富的实践经验。...
总之,遵循Java编码规范和代码检查实践,能有效提升代码质量,降低维护成本,增强团队间的协作效率。对于初学者来说,这些规范是良好编程习惯的起点;对于经验丰富的开发者,它们是保持代码整洁、专业和一致性的有力...