热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

从编程的命名谈编码质量问题

很多人以为提高编码质量,需要很多激动人心的创新,需要明显的飞跃,这也许对,但我个人感觉项目中提高编码质量是个水磨功夫,要一步步积累,方法论大多时候帮助不大。这次先从命名说起。当我们看到一份设计图或一份代码时,大多数人会【望文生义】。

很多人以为提高编码质量,需要很多激动人心的创新,需要明显的飞跃,这也许对,但我个人感觉项目中提高编码质量是个水磨功夫,要一步步积累,方法论大多时候帮助不大。

这次先从命名说起。

当我们看到一份设计图或一份代码时,大多数人会【望文生义】。但使人【望文生义】却正是语言文字的根本使命。因此,如果一个函数被命名为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,《代码大全》一书中给出了详细的指导,这里就不在说明了。

有一点需要补充的是,就和说话的时候记不住语法一样,设计或做编码的人往往也记不住编码规则。所以规则也不宜过多。如果必须详细,那么至少要主次分明。比如说:统一使用主宾结构还是使用动宾结构这样的选择会影响程序的大部分内容,那么就应该优先统一。

本文地址:http://www.nowamagic.net/librarys/veda/detail/1757,欢迎访问原出处。


推荐阅读
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了在使用MSXML解析XML文件时出现DTD禁用问题的解决方案。通过代码示例和错误信息获取方法,解释了默认情况下DTD是禁用的,以及如何启用DTD的方法。此外,还提到了网上关于该问题的信息相对较少,因此本文提供了解决方案以供参考。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
author-avatar
手机用户2602934117
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有