概述

代码是从命名开始的,我们给类、方法、变量和参数命名,我们也给解决方案、工程、目录命名。在编码时,除了应该遵守编程语言本身的命名规范外,我们应该提供好的命名。好的命名意味着良好的可读性,读你代码的人无需太多的注释,就能通过名称知道它是什么,它能做什么事儿,以及它应该怎么用。

我们命名、命名,不断地命名。既然有这么多命名要做,我们不妨做好他。

关于命名

取名字的成本

取个名字很简单,取个好的名字就不那么容易了。快速随意地取个名字,还不如花点时间取个好名字,因为好名字省下来的时间要比花掉的多。

假设你在程序中使用了不好的命名,将来有人读到你的程序时,他人可能会难以理解,于是去询问你。由于时间有点久远了,你需要花时间回忆当时的场景和逻辑。也许你能想起来,也许你忘记了它的确切含义,以至于最终你给到他人的答复是模糊不清的。
仔细算算吧,你们为了理解这些不好命名的含义,已经花了太多的时间了。

好的命名的关键是有意义

可以从以下几点出发,去取个有意义的名字。(以下内容,总结自《Clean code》)

  • 名副其实:名称本身应该告诉了你“它是谁?它是做什么的?它该怎么用”,如果名称需要注释来补充,则是名不副实的。
  • 避免误导:提防使用差异较小的名称,例如:你在ProductService中提供了3个方法,GetProducts,GetProductInfo和GetProductList。这3个名字可能是在不同场景下使用的,调用者要获取产品信息时,到底该用哪个名字呢?如果你通过注释来描述这3个方法的使用场景,那就是名不副实。
  • 做有意义的区分:如果缺少明确的约定,GetProducts,GetProductInfo和GetProductList是没有区别的。在程序中最好制定一个规则,例如通过“Get + 名词复数”的方式获取批量信息,那么在ProductService中就应该只能出现GetProducts方法。
  • 使用可搜索的名称:可搜索的名称,意味着在修改代码时,你可以通过全文搜索找到它们。例如:订单审批的状态,你通过1、2、3、4这些数字来表示,还不如通过NewCreated、Approving、Approved、Rejected来表示,它们既有实际意义,也更容易搜索。
  • 每个概念对应一个词:Fetch, Retrieve和Get都表示“获取”,如果你用这些词为同种方法命名,请取其一,并作为命名规则贯彻实行下去。
  • 添加有意义的语境:很少有名称是能自我说明的,你需要用良好命名的类、函数或命名空间来放置名称,给读者提供语境。如果没有这么做,则可以给名称添加前缀。假设你有firstName、lastName、street、houseNumber、state这些变量,当它们放一起的时候,很明确地构成了一个地址。但当你在某个方法中看到单独state变量时,state既能表示“状态”,又能表示“州”,你能推算出它的含义吗?你可以为变量添加前缀,addrFirstName, addrLastName和addrState等,这样就提供了明确且有意义的语境。

以上这些point,是除了编程语言本身的命名规范之外,你需要额外考虑的。不好的命名能混淆程序员的认知,给开发带来很多困扰。好的命名也不是一刻就能实现的,有时候限于你对系统和业务的理解,你可能难以给定一个“精确”的名称,但随着你掌握更深的业务,那些不好的名称你应该再反复推敲并调整。

示例

前面讲了那么多关于“命名”的事儿,都是为本文要讲的重构策略“重命名”做铺垫。

如果你使用Visual Studio开发程序,你可以借助一些工具来重命名,例如Resharper,这个工具还提供了良好的命名建议。

重构前

下面的代码为了描述员工的姓名和计算小时收入的方法。

public abstract class Person
{public string FN { get; set; }public decimal ClcHrlyPR(){// code to calculate hourly payratereturn 0m;}
}

很显然,这段代码提供了难以理解的命名。

重构后

于是对这段代码做了3处重构:

  • 将Person类重命名为Employee。"Person"的含义太宽泛,"Employee"则能体现员工的概念。
  • 将FN属性重命名为FirstName。"FN"没有提供确切的语义,它是什么单词的缩写?是"File Number"(档案编号),还是Frost Nova(霜冻新星)?
  • 将ClcHrlyPR()方法重命名为CalculateHourlyPay()。"ClcHrlyPR()",如果没有注释,我们无从知道Clc、Hrly和PR所代表的含义。
// Changed the class name to Employee
public class Employee
{public string FirstName { get; set; }public decimal CalculateHourlyPay(){// code to calculate hourly payratereturn 0m;}
}

小结

命名是程序员的基本功,很多程序员显然没有完全掌握这个基本功。如果你想成为一个优秀的程序员,良好的命名是必备的素质,它虽然不会体现出你会什么技术,但它会纵贯你整个编程生涯。
做好编程,从命名开始。

小酌重构系列目录汇总
关注keepfool

转载于:https://www.cnblogs.com/keepfool/p/5510803.html

小酌重构系列[18]——重命名相关推荐

  1. 路漫漫其修远兮,吾将上下而求索——小酌重构系列[0]开篇有益

    相信博客园的读者大多都是千万"码农"中的一员,每个人都写过很多代码,但并不是每一个人都能写出高质量的代码. rome is not built in one day !--完成高质 ...

  2. 小酌重构系列[10]——分离职责

    概述 "分离职责"是经常使用的一个重构策略,当一个类担任的职责太多时,应按职责将它拆分成多个类,每个类分别承担"单一"的职责,也就是让每个类专心地做" ...

  3. 小酌重构系列[3]——方法、字段的提升和降低

    本文要介绍的是4种重构策略,它们分别是提升方法.降低方法.提升字段和降低字段. 由于这4种重构策略具有一定的相通性,所以我将它们放到一篇来讲解. 定义 以下是这4种策略的定义 提升方法:当子类的方法描 ...

  4. 小酌重构系列[8]——提取接口

    前言 世间唯一"不变"的是"变化"本身,这句话同样适用于软件设计和开发. 在软件系统中,模块(类.方法)应该依赖于抽象,而不应该依赖于实现. 当需求发生&quo ...

  5. 小酌重构系列[19]——分解大括号

    概述 if else, for, while等是程序中最常用的语句,这些语句有一个共同点--它们的逻辑都封装在一对"{}"包围的代码块中.在实现复杂的业务逻辑时,会较多地用到这些语 ...

  6. 小酌重构系列[20]——用条件判断代替异常

    小酌重构系列[20]--用条件判断代替异常 参考文章: (1)小酌重构系列[20]--用条件判断代替异常 (2)https://www.cnblogs.com/keepfool/p/5513946.h ...

  7. 小酌重构系列[21]——避免双重否定

    避免双重否定 在自然语言中,双重否定表示肯定.但是在程序中,双重否定会降低代码的可读性,使程序不易理解,容易产生错觉. 人通常是用"正向思维"去理解一件事情的,使用双重否定的判断, ...

  8. 小酌重构系列[4]——分解方法

    概述 "分解方法"的思想和前面讲到的"提取方法"."提取方法对象"基本一致. 它是将较大个体的方法不断的拆分,让每个"方法&quo ...

  9. 小酌重构系列[17]——提取工厂类

    概述 在程序中创建对象,并设置对象的属性,是我们长干的事儿.当创建对象需要大量的重复代码时,代码看起来就不那么优雅了.从类的职责角度出发,业务类既要实现一定的逻辑,还要负责对象的创建,业务类干的事儿也 ...

最新文章

  1. 速度超Mask RCNN四倍,仅在单个GPU训练的实时实例分割算法 | 技术头条
  2. 【Scrapy】OAuth 学习笔记
  3. BitMapData知识 转
  4. globalmapper如何选取图像上的点_OpenCV 进阶应用,用编程手段搞定图像处理
  5. 从头学习linux C 冒泡法排序
  6. Python 爬虫+tkinter界面 实现历史天气查询
  7. 大搜索时代下的网络拓扑搜索定位
  8. 两个列表(list)组成字典(dict)
  9. w3school离线手册
  10. win10隐藏任务栏_你真的了解任务栏吗?win10任务栏居然隐藏了这么多小窍门
  11. 基于matlab的微分例题,matlab程序设计常微分方程编程例题答案数学.doc
  12. [定理证明]正态随机过程又是马尔科夫过程的充要条件(高斯-马尔科夫过程的充要条件)...
  13. 前端实现导入(excel文件)导出(word)文件
  14. Reading Note(4)——面向关系型数据库的哈希连接加速器
  15. VUE2 组件间传值
  16. C语言初学者|新手入门
  17. [Markdown] 如何隐藏某些内容
  18. python -i 豆瓣源
  19. 测试你最关心的QQ好友并爬取空间留言
  20. webstorm配置Prettier

热门文章

  1. 在网站上更改鼠标样式
  2. 【spark】Spark SQL:INSERT INTO语句语法
  3. mysql前一天的数据_mysql查询前一天数据-mysql根据时间查询前一天数据-吾爱编程网...
  4. 2017年3月10日 星期五 --出埃及记 Exodus 23:28
  5. Matlab怎么从table变成matrix
  6. 6.27软件园与血站见习报告
  7. 冲天炉节能环保:烟气净化及烟气余热回收
  8. 逻辑与,逻辑或,逻辑非关系
  9. [android] 手机卫士号码归属地查询
  10. 写论文第二步——管理文献 上(文献管理软件)