优雅整洁的 Java 代码命名技巧,风之极·净化
Posted ImportNew
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了优雅整洁的 Java 代码命名技巧,风之极·净化相关的知识,希望对你有一定的参考价值。
now 标识当前时间。
deleteIndexEx
,这两个函数名区别很小了,加之函数 deleteIndexEx
后面Ex
还是缩写,也不知道是什么意思,所以他人只能去看函数内容才能明白两者的区别。XYZStringHandler
与XYZStringStorage
。UserController
与UserInfoController
。
让人抓狂,他们到底是一个东西还是不同的?差别在哪?没有两年脑血栓写不出这样的。
与fileDownload
到底有啥区别?为啥要调用两次。这种真的是十年脑血栓才写得出来。
downLoadFiles
的功能是创建将 files 打包成 zip 文件,而 fileDownload
则是把指定的文件输出给浏览器下载。
所以 downLoadFiles
应该命名为 createZipFile
用于合理区分避免误人子弟。
Order order = new Order();
order.getCreateTime();
名称易读、可搜索可读指的是不要使用一些生僻字,难以发音的单词。
可搜索是便于利用 IED 的自动补全和搜索功能,能根据我们的命名规范快速定位想要找的类或者方法等。
可读名称读不出来,在讨论的时候就好像是一个沙雕。
哎,那个「treeNewBeeAxibaKula」类是什么作用?
听到这样的名字尴尬癌都犯了。
使用一些生僻字,犹如「王大妈的裹脚布,又长又臭」,没有两年脑血栓写不出这样的垃圾代码。
可搜索IED 很智能,当我们输入 「Hash」的时候,会列举出所有 Hash 相关的类。
命名的时候最好符合项目命名习惯,列表数据查询大家使用 listXXX,你就不要用 queryXXX,统一命名规范,很重要。
包命名包名统一使用小写,点分隔符之间有且仅有一个自然语义的英文单词或者多个单词自然连接到一块(如 springframework,deepspace 不需要使用任何分割)。
包名的构成可以分为以下几四部分【前缀】 【发起者名】【项目名】【模块名】。
❝以下表格授权于「Java 填坑笔记」
常见的前缀可以分为以下几种:
前缀名 | 例 | 含义 |
---|---|---|
indi(或onem ) | indi.发起者名.项目名.模块名.…… | 个体项目,指个人发起,但非自己独自完成的项目,可公开或私有项目,copyright主要属于发起者。 |
pers | pers.个人名.项目名.模块名.…… | 个人项目,指个人发起,独自完成,可分享的项目,copyright主要属于个人 |
priv | priv.个人名.项目名.模块名.…… | 私有项目,指个人发起,独自完成,非公开的私人使用的项目,copyright属于个人。 |
team | team.团队名.项目名.模块名.…… | 团队项目,指由团队发起,并由该团队开发的项目,copyright属于该团队所有 |
顶级域名 | com.公司名.项目名.模块名.…… | 公司项目,copyright由项目发起的公司所有 |
类名使用大驼峰命名形式,应该使用名词或者名词短语,比如:Customer、Account。
避免使用 Manager、Processor 等动词。
接口名除了用名词和名词短语以外,还可以使用形容词或形容词短语,如 Cloneable,Callable 等,表示实现该接口的类有某种功能或能力。
属性 | 约束 | 例 |
---|---|---|
抽象类 | Abstract 或者 Base 开头 | BaseUserService |
枚举类 | Enum 作为后缀 | GenderEnum |
工具类 | Utils作为后缀 | StringUtils |
异常类 | Exception结尾 | RuntimeException |
接口实现类 | 接口名+ ImpI 或者 前缀接口名 + 接口名 | UserService + UserServiceImpl、IUserService + UserService |
领域模型相关 | /DO/DTO/VO/DAO | 正例:UserDAO 反例:UserDo, UserDao |
设计模式相关类 | Builder,Factory等 | 当使用到设计模式时,需要使用对应的设计模式作为后缀,如ThreadFactory |
处理特定功能的 | Handler,Predicate, Validator | 表示处理器,校验器,断言,这些类工厂还有配套的方法名如handle,predicate,validate |
测试类 | Test结尾 | UserServiceTest, 表示用来测试UserService类的 |
方法命名一般为动词或动词短语,与参数或参数名共同组成动宾短语,即动词 + 名词。一个好的函数名一般能通过名字直接获知该函数实现什么样的功能。
布尔返回值的方法注:Prefix-前缀,Suffix-后缀,Alone-单独使用
位置 | 单词 | 意义 | 例 |
---|---|---|---|
Prefix | is | 对象是否符合期待的状态 | isValid |
Prefix | can | 对象能否执行所期待的动作 | canRemove |
Prefix | should | 调用方执行某个命令或方法是好还是不好,应不应该,或者说推荐还是不推荐 | shouldMigrate |
Prefix | has | 对象是否持有所期待的数据和属性 | hasObservers |
Prefix | needs | 调用方是否需要执行某个命令或方法 | needsMigrate |
位置 | 单词 | 意义 | 例 |
---|---|---|---|
Suffix | IfNeeded | 需要的时候执行,不需要的时候什么都不做 | drawIfNeeded |
Prefix | might | 同上 | mightCreate |
Prefix | try | 尝试执行,失败时抛出异常或是返回errorcode | tryCreate |
Suffix | OrDefault | 尝试执行,失败时返回默认值 | getOrDefault |
Suffix | OrElse | 尝试执行、失败时返回实际参数中指定的值 | getOrElse |
Prefix | force | 强制尝试执行。error抛出异常或是返回值 | forceCreate, forceStop |
单词 | 意义 | 例 |
---|---|---|
ensure | 检查是否为期待的状态,不是则抛出异常或返回error code | ensureCapacity |
validate | 检查是否为正确的状态,不是则抛出异常或返回error code | validateInputs |
位置 | 单词 | 意义 | 例 |
---|---|---|---|
Prefix | blocking | 线程阻塞方法 | blockingGetUser |
Suffix | InBackground | 执行在后台的线程 | doInBackground |
Suffix | Async | 异步方法 | sendAsync |
Suffix | Sync | 对应已有异步方法的同步方法 | sendSync |
Prefix or Alone | schedule | Job和Task放入队列 | schedule, scheduleJob |
Prefix or Alone | post | 同上 | postJob |
Prefix or Alone | execute | 执行异步方法(注:我一般拿这个做同步方法名) | execute, executeTask |
Prefix or Alone | start | 同上 | start, startJob |
Prefix or Alone | cancel | 停止异步方法 | cancel, cancelJob |
Prefix or Alone | stop | 同上 | stop, stopJob |
位置 | 单词 | 意义 | 例 |
---|---|---|---|
Prefix | on | 事件发生时执行 | onCompleted |
Prefix | before | 事件发生前执行 | beforeUpdate |
Prefix | pre | 同上 | preUpdate |
Prefix | will | 同上 | willUpdate |
Prefix | after | 事件发生后执行 | afterUpdate |
Prefix | post | 同上 | postUpdate |
Prefix | did | 同上 | didUpdate |
Prefix | should | 确认事件是否可以发生时执行 | shouldUpdate |
单词 | 意义 | 例 |
---|---|---|
initialize | 初始化。也可作为延迟初始化使用 | initialize |
pause | 暂停 | onPause ,pause |
stop | 停止 | onStop,stop |
abandon | 销毁的替代 | abandon |
destroy | 同上 | destroy |
dispose | 同上 | dispose |
单词 | 意义 | 例 |
---|---|---|
contains | 是否持有与指定对象相同的对象 | contains |
add | 添加 | addJob |
append | 添加 | appendJob |
insert | 插入到下标n | insertJob |
put | 添加与key对应的元素 | putJob |
remove | 移除元素 | removeJob |
enqueue | 添加到队列的最末位 | enqueueJob |
dequeue | 从队列中头部取出并移除 | dequeueJob |
push | 添加到栈头 | pushJob |
pop | 从栈头取出并移除 | popJob |
peek | 从栈头取出但不移除 | peekJob |
find | 寻找符合条件的某物 | findById |
单词 | 意义 | 例 |
---|---|---|
create | 新创建 | createAccount |
new | 新创建 | newAccount |
from | 从既有的某物新建,或是从其他的数据新建 | fromConfig |
to | 转换 | toString |
update | 更新既有某物 | updateAccount |
load | 读取 | loadAccount |
fetch | 远程读取 | fetchAccount |
delete | 删除 | deleteAccount |
remove | 删除 | removeAccount |
save | 保存 | saveAccount |
store | 保存 | storeAccount |
commit | 保存 | commitChange |
apply | 保存或应用 | applyChange |
clear | 清除数据或是恢复到初始状态 | clearAll |
reset | 清除数据或是恢复到初始状态 | resetAll |
单词 | 意义 |
---|---|
get获取 | set 设置 |
add 增加 | remove 删除 |
create 创建 | destory 移除 |
start 启动 | stop 停止 |
open 打开 | close 关闭 |
read 读取 | write 写入 |
load 载入 | save 保存 |
create 创建 | destroy 销毁 |
begin 开始 | end 结束 |
backup 备份 | restore 恢复 |
import 导入 | export 导出 |
split 分割 | merge 合并 |
inject 注入 | extract 提取 |
attach 附着 | detach 脱离 |
bind 绑定 | separate 分离 |
view 查看 | browse 浏览 |
edit 编辑 | modify 修改 |
select 选取 | mark 标记 |
copy 复制 | paste 粘贴 |
undo 撤销 | redo 重做 |
insert 插入 | delete 移除 |
add 加入 | append 添加 |
clean 清理 | clear 清除 |
index 索引 | sort 排序 |
find 查找 | search 搜索 |
increase 增加 | decrease 减少 |
play 播放 | pause 暂停 |
launch 启动 | run 运行 |
compile 编译 | execute 执行 |
debug 调试 | trace 跟踪 |
observe 观察 | listen 监听 |
build 构建 | publish 发布 |
input 输入 | output 输出 |
encode 编码 | decode 解码 |
encrypt 加密 | decrypt 解密 |
compress 压缩 | decompress 解压缩 |
pack 打包 | unpack 解包 |
parse 解析 | emit 生成 |
connect 连接 | disconnect 断开 |
send 发送 | receive 接收 |
download 下载 | upload 上传 |
refresh 刷新 | synchronize 同步 |
update 更新 | revert 复原 |
lock 锁定 | unlock 解锁 |
check out 签出 | check in 签入 |
submit 提交 | commit 交付 |
push 推 | pull 拉 |
expand 展开 | collapse 折叠 |
begin 起始 | end 结束 |
start 开始 | finish 完成 |
enter 进入 | exit 退出 |
abort 放弃 | quit 离开 |
obsolete 废弃 | depreciate 废旧 |
collect 收集 | aggregate 聚集 |
命名目的都是为了让代码和工程师进行对话,增强代码的可读性,可维护性。优秀的代码往往能够见名知意。
大家在工作中是否有遇到一些垃圾命名的代码呢?欢迎留言
- EOF -
还在用策略模式解决 if-else?Map+函数式接口方法才是YYDS!
一个 HashMap 跟面试官扯了半个小时
阿里二面:main 方法可以继承吗?
看完本文有收获?请转发分享给更多人
关注「ImportNew」,提升Java技能
点赞和在看就是最大的支持❤️
Vue知识体系总结Vue入门(风之极陨杀)
在进行一门新的语言学习时,基础是最重要的点,只要你get到它,学习新技术只是时间的问题。
一、vue常用标签简介
1、v-for和@click实现点击赋予红色效果
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.active{
color: red;
}
</style>
</head>
<body>
<div id="app">
<ul>
<li v-for="(item,index) in girls"
v-bind:class="{active:currentIndex == index}"
@click="liClick(index)">{{item}}</li>
</ul>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好',
girls: ['比比东','千仞雪','美杜莎','云韵','雅妃'],
currentIndex: 0
},
methods: {
liClick(index){
this.currentIndex = index
}
}
})
</script>
</body>
</html>
2、合并两个字符串
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">{{fullName}}</div>
<script src="../js/vue.js"></script>
<script>
let app = new Vue({
el: '#app',
data: {//定义数据
message: '哪吒',
firstName: '无情',
lastName:'冷血'
},
computed: {
fullName: function () {
return this.firstName + ' ' + this.lastName
}
}
})
</script>
</body>
</html>
3、计算属性的复杂操作
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">{{es62}}</div>
<script src="../js/vue.js"></script>
<script>
let app = new Vue({
el: '#app',
data: {//定义数据
girls: [
{name: '千仞雪',age:18},
{name: '云韵',age:20},
{name: '比比东',age:25},
{name: '美杜莎',age:22}
]
},
computed: {
ageSum: function () {
let sum = 0
let result = 0
for(let i = 0;i<this.girls.length;i++){
sum += this.girls[i].age
}
result = sum/this.girls.length;
return result
},
es6: function () {
let sum = 0
let result = 0
for(let i in this.girls){
sum += this.girls[i].age
}
result = sum/this.girls.length;
return result
},
es62: function () {
let sum = 0
let result = 0
for(let girl of this.girls){
sum += girl.age
}
result = sum/this.girls.length;
return result
}
}
})
</script>
</body>
</html>
4、var没有块级作用域,let有块级作用域
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">{{message}}</div>
<script src="../js/vue.js"></script>
<button>按钮1</button>
<button>按钮2</button>
<button>按钮3</button>
<button>按钮4</button>
<button>按钮5</button>
<script>
let app = new Vue({
el: '#app',
data: {//定义数据
message: '哪吒'
}
})
// 因为ES5前if和for都没有块级作用域,所以很多时候引入function的块级作用域
var btns = document.getElementsByTagName('button');
for(var i = 0;i<btns.length;i++){
(function (i) {
btns[i].addEventListener('click',function () {
console.log('第'+i+'个按钮被点击');
})
})(i)
}
const btns = document.getElementsByTagName('button')
for(let i = 0;i<btns.length;i++){
btns[i].addEventListener('click',function () {
console.log('第'+i+'个按钮被点击');
})
}
</script>
</body>
</html>
5、const 常量的定义
6、v-on的参数问题
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<button @click="btnClick(abc, $event)">按钮</button>
</div>
<script src="../js/vue.js"></script>
<script>
let app = new Vue({
el: '#app',
data: {//定义数据
message: '哪吒',
abc: 123
},
methods: {
btnClick(abc,event){
console.log(abc, event);
}
}
})
</script>
</body>
</html>
7、v-on修饰符
- stop - 调用 event.stopPropagation(),停止冒泡。
- prevent - 调用 event.preventDefault(),组织浏览器默认事件。
- capture - 添加事件侦听器时使用 capture 模式。
- self - 只当事件是从侦听器绑定的元素本身触发时才触发回调。
- {keyCode | keyAlias} - 只当事件是从特定键触发时才触发回调。
- native - 监听组件根元素的原生事件。
- once - 只触发一次回调。
- left - (2.2.0) 只当点击鼠标左键时触发。
- right - (2.2.0) 只当点击鼠标右键时触发。
- middle - (2.2.0) 只当点击鼠标中键时触发。
- passive - (2.3.0) 以 { passive: true } 模式添加侦听器
8、v-if
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<span v-if="isUser">
<label for="username">用户账号</label>
<input type="text" id="username" placeholder="用户账号" key="username">
</span>
<span v-else>
<label for="email">用户邮箱</label>
<input type="text" id="email" placeholder="用户邮箱" key="email">
</span>
<button @click="isUser = !isUser">切换类型</button>
</div>
<script src="../js/vue.js"></script>
<script>
let app = new Vue({
el: '#app',
data: {//定义数据
message: '哪吒',
isUser: true
}
})
</script>
</body>
</html>
注:通过key=username解决input复用问题,input复用机制是vue底层为了缓存而制定的策略。
9、v-show
10、v-for遍历对象
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<ul>
<li v-for="item in user">{{item}}</li>
</ul>
<ul>
<li v-for="(key, value) in user">{{key}}-{{value}}</li>
</ul>
</div>
<script src="../js/vue.js"></script>
<script>
let app = new Vue({
el: '#app',
data: {//定义数据
message: '哪吒',
user: {
name: '哪吒',
age: 18,
address: '大连'
}
}
})
</script>
</body>
</html>
key的作用主要是为了高效的更新虚拟DOM。
11、哪些数组的方法是响应式的
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<ul>
<li v-for="item in girls" :key="item">{{item}}</li>
</ul>
<button @click="btnClick">按钮</button>
</div>
<script src="../js/vue.js"></script>
<script>
let app = new Vue({
el: '#app',
data: {//定义数据
message: '哪吒',
girls: [
'比比东','云韵','美杜莎','雅妃'
]
},
methods: {
// 响应式方法简介
btnClick(){
//1.push方法
this.girls.push('哪吒')
//2.pop():删除数组中的最后一个元素
this.girls.pop()
//3.shift():删除数组中的第一个元素
this.girls.shift()
//4.unshift():在数组最前面添加元素
this.girls.unshift('哪吒')
this.girls.unshift('CSDN','哪吒')
//5.splice():删除元素/插入元素/替换元素
//删除元素:第二个参数表示你要删除几个元素
//插入元素:第二个参数,传入0,后面加上要插入的元素
//替换元素:第二个参数,表示我们要替换几个元素,后面是用于替换前面元素的新元素
//splice(start)
this.girls.splice(2,2,'无情','冷血')
//6.sort()
this.girls.sort()
//7.reverse()
this.girls.reverse()
//8.注意:通过索引值修改数组中的元素,不是响应式的
this.girls[0] = '云芝'
//9.set(要修改的元素,索引值,修改后的值)
Vue.set(this.girls,0,'云芝啊')
}
}
})
</script>
</body>
</html>
非响应式“云芝”写入失败。
响应式,“云芝”写入成功
二、购物车综合案例
需求分析:通过动态加载数据,价格格式化展示,数量可增可减,可移除购物车,可清空购物车。
1、index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div id="app">
<div v-if="girls.length">
<table>
<thead>
<tr>
<th></th>
<th>名字</th>
<th>年龄</th>
<th>价格</th>
<th>数量</th>
<th>技能</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr v-for="(item,index) in girls">
<td>{{item.id}}</td>
<td>{{item.name}}</td>
<td>{{item.age}}</td>
<td>{{item.price | showPrice}}</td>
<td>
<button @click="decrement(index)"
:disabled="item.count <= 1">-</button>
{{item.count}}
<button @click="increment(index)">+</button>
</td>
<td>{{item.skill}}</td>
<td>
<button @click="removeHandler(index)">移除</button>
</td>
</tr>
</tbody>
</table>
<h2>总价格:{{totalPrice | showPrice}}</h2>
</div>
<h2 v-else>购物车为空</h2>
</div>
<script src="../js/vue.js"></script>
<script src="index.js"></script>
</body>
</html>
2、index.js
const app = new Vue({
el: '#app',
data: {
girls: [
{
id: 1,
name: '比比东',
age: 18,
count: 1,
skill: '不死之身',
price: 100.00
},{
id: 2,
name: '千仞雪',
age: 20,
count: 1,
skill: '天使圣剑',
price: 25.00
},{
id: 3,
name: '美杜莎',
age: 17,
count: 1,
skill: '美杜莎的凝望',
price: 19.00
},{
id: 4,
name: '云韵',
age: 25,
count: 1,
skill: '风之极陨杀',
price: 1999.99
},{
id: 5,
name: '雅妃',
age: 21,
count: 1,
skill: '红衣诱惑',
price: 68.00
}
]
},
methods :{
increment(index){
this.girls[index].count++
},
decrement(index){
this.girls[index].count--
},
removeHandler(index){
this.girls.splice(index, 1)
}
},
computed: {
totalPrice(){
let totalPrice = 0;
for(let i=0;i<this.girls.length;i++){
totalPrice += this.girls[i].price * this.girls[i].count;
}
return totalPrice;
}
},
filters: {
showPrice(price) {
return '$' + price.toFixed(2)
}
}
})
3、style.css
table {
border: 1px solid #e9e9e9;
border-collapse: collapse;
border-spacing: 0;
}
th,td {
padding: 8px 16px;
border: 1px solid #e9e9e9;
text-align: left;
}
th {
background-color: #f7f7f7;
color: #5c6b77;
font-weight: 600;
}
4、实现效果
通过移除,清空购物车。
往期精彩内容:
以上是关于优雅整洁的 Java 代码命名技巧,风之极·净化的主要内容,如果未能解决你的问题,请参考以下文章