小酌重构系列[18]——重命名
概述
代码是从命名开始的,我们给类、方法、变量和参数命名,我们也给解决方案、工程、目录命名。在编码时,除了应该遵守编程语言本身的命名规范外,我们应该提供好的命名。好的命名意味着良好的可读性,读你代码的人无需太多的注释,就能通过名称知道它是什么,它能做什么事儿,以及它应该怎么用。
我们命名、命名,不断地命名。既然有这么多命名要做,我们不妨做好他。
关于命名
取名字的成本
取个名字很简单,取个好的名字就不那么容易了。快速随意地取个名字,还不如花点时间取个好名字,因为好名字省下来的时间要比花掉的多。
仔细算算吧,你们为了理解这些不好命名的含义,已经花了太多的时间了。
好的命名的关键是有意义
可以从以下几点出发,去取个有意义的名字。(以下内容,总结自《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;} }
小结
命名是程序员的基本功,很多程序员显然没有完全掌握这个基本功。如果你想成为一个优秀的程序员,良好的命名是必备的素质,它虽然不会体现出你会什么技术,但它会纵贯你整个编程生涯。
做好编程,从命名开始。
转载于:https://www.cnblogs.com/keepfool/p/5510803.html
小酌重构系列[18]——重命名相关推荐
- 路漫漫其修远兮,吾将上下而求索——小酌重构系列[0]开篇有益
相信博客园的读者大多都是千万"码农"中的一员,每个人都写过很多代码,但并不是每一个人都能写出高质量的代码. rome is not built in one day !--完成高质 ...
- 小酌重构系列[10]——分离职责
概述 "分离职责"是经常使用的一个重构策略,当一个类担任的职责太多时,应按职责将它拆分成多个类,每个类分别承担"单一"的职责,也就是让每个类专心地做" ...
- 小酌重构系列[3]——方法、字段的提升和降低
本文要介绍的是4种重构策略,它们分别是提升方法.降低方法.提升字段和降低字段. 由于这4种重构策略具有一定的相通性,所以我将它们放到一篇来讲解. 定义 以下是这4种策略的定义 提升方法:当子类的方法描 ...
- 小酌重构系列[8]——提取接口
前言 世间唯一"不变"的是"变化"本身,这句话同样适用于软件设计和开发. 在软件系统中,模块(类.方法)应该依赖于抽象,而不应该依赖于实现. 当需求发生&quo ...
- 小酌重构系列[19]——分解大括号
概述 if else, for, while等是程序中最常用的语句,这些语句有一个共同点--它们的逻辑都封装在一对"{}"包围的代码块中.在实现复杂的业务逻辑时,会较多地用到这些语 ...
- 小酌重构系列[20]——用条件判断代替异常
小酌重构系列[20]--用条件判断代替异常 参考文章: (1)小酌重构系列[20]--用条件判断代替异常 (2)https://www.cnblogs.com/keepfool/p/5513946.h ...
- 小酌重构系列[21]——避免双重否定
避免双重否定 在自然语言中,双重否定表示肯定.但是在程序中,双重否定会降低代码的可读性,使程序不易理解,容易产生错觉. 人通常是用"正向思维"去理解一件事情的,使用双重否定的判断, ...
- 小酌重构系列[4]——分解方法
概述 "分解方法"的思想和前面讲到的"提取方法"."提取方法对象"基本一致. 它是将较大个体的方法不断的拆分,让每个"方法&quo ...
- 小酌重构系列[17]——提取工厂类
概述 在程序中创建对象,并设置对象的属性,是我们长干的事儿.当创建对象需要大量的重复代码时,代码看起来就不那么优雅了.从类的职责角度出发,业务类既要实现一定的逻辑,还要负责对象的创建,业务类干的事儿也 ...
最新文章
- 速度超Mask RCNN四倍,仅在单个GPU训练的实时实例分割算法 | 技术头条
- 【Scrapy】OAuth 学习笔记
- BitMapData知识 转
- globalmapper如何选取图像上的点_OpenCV 进阶应用,用编程手段搞定图像处理
- 从头学习linux C 冒泡法排序
- Python 爬虫+tkinter界面 实现历史天气查询
- 大搜索时代下的网络拓扑搜索定位
- 两个列表(list)组成字典(dict)
- w3school离线手册
- win10隐藏任务栏_你真的了解任务栏吗?win10任务栏居然隐藏了这么多小窍门
- 基于matlab的微分例题,matlab程序设计常微分方程编程例题答案数学.doc
- [定理证明]正态随机过程又是马尔科夫过程的充要条件(高斯-马尔科夫过程的充要条件)...
- 前端实现导入(excel文件)导出(word)文件
- Reading Note(4)——面向关系型数据库的哈希连接加速器
- VUE2 组件间传值
- C语言初学者|新手入门
- [Markdown] 如何隐藏某些内容
- python -i 豆瓣源
- 测试你最关心的QQ好友并爬取空间留言
- webstorm配置Prettier
热门文章
- 在网站上更改鼠标样式
- 【spark】Spark SQL:INSERT INTO语句语法
- mysql前一天的数据_mysql查询前一天数据-mysql根据时间查询前一天数据-吾爱编程网...
- 2017年3月10日 星期五 --出埃及记 Exodus 23:28
- Matlab怎么从table变成matrix
- 6.27软件园与血站见习报告
- 冲天炉节能环保:烟气净化及烟气余热回收
- 逻辑与,逻辑或,逻辑非关系
- [android] 手机卫士号码归属地查询
- 写论文第二步——管理文献 上(文献管理软件)