优雅整洁的 Java 代码命名技巧,风之极·净化

Posted ImportNew

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了优雅整洁的 Java 代码命名技巧,风之极·净化相关的知识,希望对你有一定的参考价值。

 now 标识当前时间。
  • 防止出现让人模糊无法理解,必须还要依据大量上下文才能理解的代码。
  • 不要使用魔术。
  • ,清晰简单的表达出关联主体的业务逻辑都在该类。

    和函数deleteIndexEx,这两个函数名区别很小了,加之函数 deleteIndexEx后面Ex还是缩写,也不知道是什么意思,所以他人只能去看函数内容才能明白两者的区别。

    1. XYZStringHandlerXYZStringStorage
    2. UserControllerUserInfoController

    让人抓狂,他们到底是一个东西还是不同的?差别在哪?没有两年脑血栓写不出这样的。

    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主要属于发起者。
    perspers.个人名.项目名.模块名.……个人项目,指个人发起,独自完成,可分享的项目,copyright主要属于个人
    privpriv.个人名.项目名.模块名.……私有项目,指个人发起,独自完成,非公开的私人使用的项目,copyright属于个人。
    teamteam.团队名.项目名.模块名.……团队项目,指由团队发起,并由该团队开发的项目,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-单独使用

    位置单词意义
    Prefixis对象是否符合期待的状态isValid
    Prefixcan对象能否执行所期待的动作canRemove
    Prefixshould调用方执行某个命令或方法是好还是不好,应不应该,或者说推荐还是不推荐shouldMigrate
    Prefixhas对象是否持有所期待的数据和属性hasObservers
    Prefixneeds调用方是否需要执行某个命令或方法needsMigrate
    按需执行的方法
    位置单词意义
    SuffixIfNeeded需要的时候执行,不需要的时候什么都不做drawIfNeeded
    Prefixmight同上mightCreate
    Prefixtry尝试执行,失败时抛出异常或是返回errorcodetryCreate
    SuffixOrDefault尝试执行,失败时返回默认值getOrDefault
    SuffixOrElse尝试执行、失败时返回实际参数中指定的值getOrElse
    Prefixforce强制尝试执行。error抛出异常或是返回值forceCreate, forceStop
    用来检查的方法
    单词意义
    ensure检查是否为期待的状态,不是则抛出异常或返回error codeensureCapacity
    validate检查是否为正确的状态,不是则抛出异常或返回error codevalidateInputs
    异步相关方法
    位置单词意义
    Prefixblocking线程阻塞方法blockingGetUser
    SuffixInBackground执行在后台的线程doInBackground
    SuffixAsync异步方法sendAsync
    SuffixSync对应已有异步方法的同步方法sendSync
    Prefix or AlonescheduleJob和Task放入队列schedule, scheduleJob
    Prefix or Alonepost同上postJob
    Prefix or Aloneexecute执行异步方法(注:我一般拿这个做同步方法名)execute, executeTask
    Prefix or Alonestart同上start, startJob
    Prefix or Alonecancel停止异步方法cancel, cancelJob
    Prefix or Alonestop同上stop, stopJob
    回调方法
    位置单词意义
    Prefixon事件发生时执行onCompleted
    Prefixbefore事件发生前执行beforeUpdate
    Prefixpre同上preUpdate
    Prefixwill同上willUpdate
    Prefixafter事件发生后执行afterUpdate
    Prefixpost同上postUpdate
    Prefixdid同上didUpdate
    Prefixshould确认事件是否可以发生时执行shouldUpdate
    操作对象生命周期的方法
    单词意义
    initialize初始化。也可作为延迟初始化使用initialize
    pause暂停onPause ,pause
    stop停止onStop,stop
    abandon销毁的替代abandon
    destroy同上destroy
    dispose同上dispose
    4.7 与集合操作相关的方法
    单词意义
    contains是否持有与指定对象相同的对象contains
    add添加addJob
    append添加appendJob
    insert插入到下标ninsertJob
    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修饰符

    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知识体系总结

    Spring框架总结

    超详细的springBoot学习笔记

    常见数据结构与算法整理总结

    Java设计模式:23种设计模式全面解析

    Java面试题总结(附答案)

    MySql知识体系总结

    Linux知识体系总结

    Redis知识体系总结

    以上是关于优雅整洁的 Java 代码命名技巧,风之极·净化的主要内容,如果未能解决你的问题,请参考以下文章

    优雅整洁的 Java 代码命名技巧,风之极·净化

    Vue知识体系总结Vue入门(风之极陨杀)

    19个优雅的Python编程技巧

    10个优雅的Python编程技巧,掌握后瞬间玩转Python(持续更新)

    [阅读笔记]代码整洁之道

    读书笔记3.29