优雅整洁的 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技能

    点赞和在看就是最大的支持❤️

    19个优雅的Python编程技巧

    Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净、整洁、一目了然。要写出 Pythonic(优雅的、地道的、整洁的)代码,需要多看多学大牛们写的代码,github 上有很多非常优秀的源代码值得阅读,比如:requests、flask、tornado,下面列举一些常见的Pythonic写法。

    0. 程序必须先让人读懂,然后才能让计算机执行。

    “Programs must be written for people to read, and only incidentally for machines to execute.”

    1. 交换赋值

    ##不推荐
    temp = a
    a = b
    b = a  
    
    ##推荐
    a, b = b, a  #  先生成一个元组(tuple)对象,然后unpack

    2. Unpacking

    ##不推荐
    l = [‘David‘, ‘Pythonista‘, ‘+1-514-555-1234‘]
    first_name = l[0]
    last_name = l[1]
    phone_number = l[2]  
    
    ##推荐
    l = [‘David‘, ‘Pythonista‘, ‘+1-514-555-1234‘]
    first_name, last_name, phone_number = l
    # Python 3 Only
    first, *middle, last = another_list

    3. 使用操作符in

    ##不推荐
    if fruit == "apple" or fruit == "orange" or fruit == "berry":
        # 多次判断  
    
    ##推荐
    if fruit in ["apple", "orange", "berry"]:
        # 使用 in 更加简洁

    技术分享图片

    4. 字符串操作

    ##不推荐
    colors = [‘red‘, ‘blue‘, ‘green‘, ‘yellow‘]
    
    result = ‘‘
    for s in colors:
        result += s  #  每次赋值都丢弃以前的字符串对象, 生成一个新对象  
    
    ##推荐
    colors = [‘red‘, ‘blue‘, ‘green‘, ‘yellow‘]
    result = ‘‘.join(colors)  #  没有额外的内存分配

    5. 字典键值列表

    ##不推荐
    for key in my_dict.keys():
        #  my_dict[key] ...  
    
    ##推荐
    for key in my_dict:
        #  my_dict[key] ...
    
    # 只有当循环中需要更改key值的情况下,我们需要使用 my_dict.keys()
    # 生成静态的键值列表。

    6. 字典键值判断

    ##不推荐
    if my_dict.has_key(key):
        # ...do something with d[key]  
    
    ##推荐
    if key in my_dict:
        # ...do something with d[key]

    7. 字典 get 和 setdefault 方法

    ##不推荐
    navs = {}
    for (portfolio, equity, position) in data:
        if portfolio not in navs:
                navs[portfolio] = 0
        navs[portfolio] += position * prices[equity]
    ##推荐
    navs = {}
    for (portfolio, equity, position) in data:
        # 使用 get 方法
        navs[portfolio] = navs.get(portfolio, 0) + position * prices[equity]
        # 或者使用 setdefault 方法
        navs.setdefault(portfolio, 0)
        navs[portfolio] += position * prices[equity]

    8. 判断真伪

    ##不推荐
    if x == True:
        # ....
    if len(items) != 0:
        # ...
    if items != []:
        # ...  
    
    ##推荐
    if x:
        # ....
    if items:
        # ...

    9. 遍历列表以及索引

    ##不推荐
    items = ‘zero one two three‘.split()
    # method 1
    i = 0
    for item in items:
        print i, item
        i += 1
    # method 2
    for i in range(len(items)):
        print i, items[i]
    
    ##推荐
    items = ‘zero one two three‘.split()
    for i, item in enumerate(items):
        print i, item

    10. 列表推导

    ##不推荐
    new_list = []
    for item in a_list:
        if condition(item):
            new_list.append(fn(item))  
    
    ##推荐
    new_list = [fn(item) for item in a_list if condition(item)]

    11. 列表推导-嵌套

    ##不推荐
    for sub_list in nested_list:
        if list_condition(sub_list):
            for item in sub_list:
                if item_condition(item):
                    # do something...  
    ##推荐
    gen = (item for sl in nested_list if list_condition(sl)             for item in sl if item_condition(item))
    for item in gen:
        # do something...

    12. 循环嵌套

    ##不推荐
    for x in x_list:
        for y in y_list:
            for z in z_list:
                # do something for x & y  
    
    ##推荐
    from itertools import product
    for x, y, z in product(x_list, y_list, z_list):
        # do something for x, y, z

    13. 尽量使用生成器代替列表

    ##不推荐
    def my_range(n):
        i = 0
        result = []
        while i < n:
            result.append(fn(i))
            i += 1
        return result  #  返回列表
    
    ##推荐
    def my_range(n):
        i = 0
        result = []
        while i < n:
            yield fn(i)  #  使用生成器代替列表
            i += 1
    *尽量用生成器代替列表,除非必须用到列表特有的函数。

    14. 中间结果尽量使用imap/ifilter代替map/filter

    ##不推荐
    reduce(rf, filter(ff, map(mf, a_list)))
    
    ##推荐
    from itertools import ifilter, imap
    reduce(rf, ifilter(ff, imap(mf, a_list)))
    *lazy evaluation 会带来更高的内存使用效率,特别是当处理大数据操作的时候。

    15. 使用any/all函数

    ##不推荐
    found = False
    for item in a_list:
        if condition(item):
            found = True
            break
    if found:
        # do something if found...  
    
    ##推荐
    if any(condition(item) for item in a_list):
        # do something if found...

    16. 属性(property)

    ##不推荐
    class Clock(object):
        def __init__(self):
            self.__hour = 1
        def setHour(self, hour):
            if 25 > hour > 0: self.__hour = hour
            else: raise BadHourException
        def getHour(self):
            return self.__hour
    
    ##推荐
    class Clock(object):
        def __init__(self):
            self.__hour = 1
        def __setHour(self, hour):
            if 25 > hour > 0: self.__hour = hour
            else: raise BadHourException
        def __getHour(self):
            return self.__hour
        hour = property(__getHour, __setHour)

    17. 使用 with 处理文件打开

    ##不推荐
    f = open("some_file.txt")
    try:
        data = f.read()
        # 其他文件操作..
    finally:
        f.close()
    
    ##推荐
    with open("some_file.txt") as f:
        data = f.read()
        # 其他文件操作...

    18. 使用 with 忽视异常(仅限Python 3)

    ##不推荐
    try:
        os.remove("somefile.txt")
    except OSError:
        pass
    
    ##推荐
    from contextlib import ignored  # Python 3 only
    
    with ignored(OSError):
        os.remove("somefile.txt")

    19. 使用 with 处理加锁

    ##不推荐
    import threading
    lock = threading.Lock()
    
    lock.acquire()
    try:
        # 互斥操作...
    finally:
        lock.release()
    
    ##推荐
    import threading
    lock = threading.Lock()
    
    with lock:
        # 互斥操作...
    

     

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

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

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

    19个优雅的Python编程技巧

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

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

    读书笔记3.29