好名字胜却注释万千

  • 表达到位:我的名字会告诉你一切
  • 清晰:不要误导
  • 体现作者 意图的名字
  • 好念:看的懂,还要读的出来
  • 能力体现在名字里
    • 接口和实现类的命名有两套规则:
  • 明确才是王道
    • 类名、对象名
    • 方法名
      • insert能不能 改用add?
      • 如果你无法命名,那就想想你能不能用专业领域的名称
  • 创造语境

表达到位:我的名字会告诉你一切

范例一

int n; //个人统计

n是一个无意义的。它没有任何个数的概念。通过注释,你或许能得到一点信息。但是,如果要通过注释来解释这个变量。那这个变量的名字就是有问题的。
我们应该指明 计量的对象和单位的名称:

int personNumInCompany;
int personNumInAndroidTeam;

范例二

public List<String> getList() {List<String> list = new ArrayList();for (String item : oneList) {if (item.contains("1900") {list.add(item);}}return list;
}

这段代码很简洁。大概意思就是如果List的item包含字符串1900,就添加到list中,并输出。
这段代码格式没问题、结构没问题,但是,它不清晰,有模糊感。
(1) oneList是什么?
(2) 1900代表什么?
(3) 输出的list能做什么?
这段代码没有给我们答案。那么它的答案自然在它出现的地方。

我们先给这段代码创建一个场景。比如1900是一个歌单中,属于电影the legend of ninteen hundred的歌曲的前缀。比如歌曲The Legend of the Pianist的歌名是:1900-The Legend of the Pianist
那oneList可以改名mPlayList。1900是电影的别称,那么可以改为有意义名称。

public List<String> getPlayListInMovie1900() {List<String> songListIn1900 = new ArrayList();for (String name : mPlayList) {if (name.contains(MOVIE_1900_CONDENSED_NAME) {songListIn1900.add(item);}}return songListIn1900;
}

其实,只是改了名字,没有结构,数量,嵌套层级,全都没变。但代码就是明确了。

当然这里的歌曲是String也不对。可以继续改。

public List<SongBean> getPlayListInMovie1900() {List<SongBean> songListIn1900 = new ArrayList();for (SongBean song : mPlayList) {if (song.isFromMovie1900() {songListIn1900.add(song);}}return songListIn1900;
}

给代码改个名字,更快的知道到底做了什么。


清晰:不要误导

在long或者Long赋值时,数值后使用大写字母L,不能是小写字母l,小写容易跟 数字混淆,造成误解。

Long a = 2l; //写的是数字的21,还是Long型的2

还有字母O

int index = 1;
if (O == 1) {index = O1; // 字母O+数字1
} else if (O == 2) {index = O; // 字母 O
} else {index = 0; // 数字0
}

超长但区别很小的变量名
AmazingBlockingControllerForRemoveableConcurrentMapInGroup
AmazingBlockingControllerForEffectiveMapWithSlipBladeInGroup
一旦,你的类里,出现这样的名字。
默数计时,读懂函数名你花了几秒?


体现作者 意图的名字

public static void deepCopy(ABean value1, ABean value2) {value1.index = value2.index;value1.name = value2.index;
}

这里的函数变量名称是无意义的。
既然是copy,要有从哪里拷贝到哪里。

public static void deepCopy(ABean dest, ABean source) {dest.index = source.index;dest.name = source.index;
}

范例二:类似的函数名,

PersonBean和PersonInfo
day和dayCount
message和mMessage

如果没有明确的约定,你如何做区分?这不就是误导吗?


好念:看的懂,还要读的出来

严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。

DaZhePromotion [打折]
getPingfenByName() [评分]
String fw[福娃]
int 某变量 = 3
String mYYYYMMDD = "20201229"
int mHeilianNumber = 1

感受一下语境:过来看一下,DaZhePromotion被设置为0.4了;mYYYYMMDD被设置为昨天了,有点问题哦。

老实说,如果再放纵一点,每个字母的手写拼起来。你还读的起来?


能力体现在名字里

如果模块、接口、类、方法使用了设计模式,在命名时需体现出具体模式。

public class OrderFactory;
public class LoginProxy;
public class ResourceObserver;

**说明:**将设计模式体现在名字中,有利于阅读者快速理解架构设计理念。

接口和实现类的命名有两套规则:

1)对于 Service 和 DAO 类,基于 SOA 的理念,暴露出来的服务一定是接口,内部的实现类用
Impl 的后缀与接口区别。

CacheServiceImpl 实现 CacheService 接口。

2)如果是形容能力的接口名称,取对应的形容词为接口名(通常是–able 的形容词)。

AbstractTranslator 实现 Translatable 接口。

明确才是王道

领域建模第一条:所有研发人员对 相同的专业名词,都有统一的认识

类名、对象名

Customer、ThreadFactory、AccountManager

名词、名词短语

方法名

动词+名字

  1. 获取单个对象的方法用 get 做前缀。
  2. 获取多个对象的方法用 list 做前缀,复数结尾,如:listObjects。
  3. 获取统计值的方法用 count 做前缀。
  4. 插入的方法用 save/insert 做前缀。
  5. 删除的方法用 remove/delete 做前缀。
  6. 修改的方法用 update 做前缀。

insert能不能 改用add?

add方法是很常见的,表达了 增加、连接 两个值。
insert方法,更倾向插入,从尾巴插入 | 从中间插入。

如果你无法命名,那就想想你能不能用专业领域的名称

至少,你的代码意图有专业领域的术语帮你解释。


创造语境

范例一

personName
personAge
personSex
personSchool
xxx

这里添加Person类型,将name、age、sex都囊括进去。
范例二

public class Client {public void buy(String computer) {System.out.println("I buy a computer");if (computer.equals("macbook")) {System.out.println("This is a macbook pro");} else if (computer.equals("surface")) {System.out.println("This is a surface book");}}public static void main(String[] args) {String computer = "macbook";Client c = new Client();c.buy(computer);}
}

这里变量computer是核心。
要分解这个函数,可以采用工厂的方法。封装Computer类。将变量computer封装进Factory类。这样,他就变成了Factory的一部分。
Computer的 打印文字,则封装进Computer类。这样所有跟购买 对象Computer有关系的都进了Computer类。

interface Computer {public void printComputer();
}class MacbookProComputer implements Computer {public void printComputer() {System.out.println("This is a macbook pro");}
}class SurfaceBookComputer implements Computer {public void printComputer() {System.out.println("This is a surface book");}
}class ComputerFactory {public Computer createComputer(String type) {Computer c = null;if(type.equals("macbook")) {c = new MacbookProComputer();}else if(type.equals("surface")) {c = new SurfaceBookComputer();}return c;}
}public class Client {public void buy(Computer c){System.out.println("I buy a computer");c.printComputer();}public static void main(String[] args) {Client c = new Client();ComputerFactory cf = new ComputerFactory();Computer computer = cf.createComputer("macbook");c.buy(computer);}
}

绞尽脑汁,给代码取个好名字相关推荐

  1. 编码之道:取个好名字很重要(转)

    代码就是程序员的孩子,给"孩子"取个好听的名字很重要! 我们在项目开发中,接触到的变量.函数.类多数都是项目自己定义的,往往都是为了解决一些特定的领域的问题,引入了各种各样的概念, ...

  2. 编码之道:取个好名字很重要

    11 February 2015 代码就是程序员的孩子,给"孩子"取个好听的名字很重要! 我们在项目开发中,接触到的变量.函数.类多数都是项目自己定义的,往往都是为了解决一些特定的 ...

  3. Robocode教程2——你的第一个robo,取个好名字哦

    摘自:http://site.douban.com/widget/notes/7736245/note/210029011/ 你需要准备的东西: 1.c语言的知识和一点点的java知识,robocod ...

  4. 王者荣耀在android目录下的名字,王者荣耀名字空白代码怎么弄_名字空白代码设置方法...

    王者荣耀名字空白代码怎么弄?名字空白代码设置方法.王者荣耀中起一个好听的名字是非常重要的,不少玩家看到别人名字有空白都想知道怎么弄,下面apk8小编为玩家们带来了名字空白代码设置方法,点进来看看. 王 ...

  5. 创业一定要取个好名字,才容易实现人生逆袭

    创业一定要取个好名字,才容易实现人生逆袭. 好名字不要太复杂,太高大上,就要简单粗暴. 今天给大家分享几个起名字的思路,建议收藏分享,用的着的时候可以拿出来看. 你看互联网公司的起名,都是很容易传播, ...

  6. 如何让debuge的dll名字改变_杨石头:如何给品牌取个好名字?

    一个好的品牌名称,不是一个简单的记号.它能强化定位,参与竞争,而且还以其可能隐含的形象价值使某一品牌获得持久的市场优势. 在1920 年时 "可口可乐"刚刚进入上海,最开始音译过来 ...

  7. 女孩姓聂取独特的名字大全

    起名字要好记好听,一个有良好寓意的名字,伴随着孩子一生的成长是非常重要的.好的名字能够带来步步高升之意,不好的名字,也会影响到孩子发展的气运,在选择名字上,不仅是好听的字,好听的名就能够适合孩子,关键 ...

  8. 做好APP推广的关键,给自己的APP取一个好名字Yopai.com

    每一个做APP产品和运营的伙伴们都知道,一个好名字对于自己的旗下的APP产品推广是有多重要,既要保证叫起来响亮,有新意,又要保证贴切内容,让大伙一听就知道,这是你们家的APP.和给小孩取名字一样,真是 ...

  9. 女孩姓闵取独特的名字大全

    名字对于一生的影响力不言而喻,有许多人在选择了适合自己的名字之后,气运和磁场也会改善不少.名字除了考虑到能否符合孩子的整体运势,也应该好听好记具有韵律的名字,或者平仄得体的好名字,自然也能够加分不少 ...

最新文章

  1. Docker入门-docker compose的使用
  2. 伪装 php 版本号,linux伪装隐藏Nginx,PHP版本号提升服务器安全性
  3. Loadrunner基本概念解析一
  4. 苹果或将推中国特色版iPhone 削掉了Face ID改用屏幕指纹
  5. 移动端web开发技巧
  6. C#基础知识-编写第一个程序(二)
  7. Java8 LocalDateTime和Date相互转换
  8. 多频段压缩参数均衡器:Initial Audio Dynamic EQ Mac
  9. 时间序列相似性度量-DTW
  10. Tomcat解惑 之 CATALINA_HOME与CATALINA_BASE
  11. 如何准备全国计算机二级Python,二级Python考试技巧
  12. c语言100列作业,C语言经典例题100例——C语言练习实例72解答(链表)
  13. 微信小程序免费资源大全
  14. HDU 5514 题解
  15. malloc,vmalloc,kmalloc区别
  16. 修改注册表,更改Win10版本,解决升级时无法“保留个人文件和应用”的问题
  17. 湿度传感器 DHT11
  18. gitlab设置普通用户为管理员
  19. 2023上海电力大学计算机考研信息汇总
  20. wscript.shell

热门文章

  1. OpenAI | GPT-3新模型Davinci,将AI写作提升到新水平!网友惊呼:GPT-4要来了?
  2. 基于卷积神经网络(CNN)模型的垃圾分类设计与实现
  3. 前端开发工程师 职业规划
  4. 每次审查 OKR时,团队要讨论的12个启发性问题
  5. PHP文件上传漏洞原理以及防御姿势
  6. 当太阳升起时开始奔跑
  7. python爬虫——爬取英雄联盟英雄基本信息
  8. CF手游明日迎来重大更新:生化模式升级,新地图新武器登场
  9. C++有哪些常用的库文件
  10. 用Dos命令一键备份和还原eMule重要文件