不是谈帕斯卡,骆驼命名等问题。而是说说业务模块和技术模块的一些命名优劣。以订单模块为例,我会给出OrderServiceOrderDao中一些基本的接口定义。

下面先列出,我认为不太友好的服务接口定义方式:

// 我先给出DAO的定义,这个DAO的定义没有问题的,主要看下面的OrderService的定义
public interface OrderDao {// 根据用户Id和状态查询订单List<Order> selectByUserIdAndState(String userId, List<Integer> orderStates);// 根据订单Id查询订单Order selectByPrimaryKey(String id);// 插入订单数据int insert(Order order);// 更新订单状态int updateStateById(String id, Integer state);
}
Bad Case
// 这个接口定义是我自己编出来的,虽然不完全真实。但我想大家项目中一定见到过在业务逻辑中这么与定义方法名字。
// 出现了insert,update,select等等技术行为动作
// 看着像是DAO的定义,但有不完全像,下面注释具体说问题。
public interface OrderService {// 根据用户Id和状态查询订单// 问题① select不应该出现在业务层,可以使用query代替,偏业务化// 问题② state状态不应该暴露给外面,订单状态应该有订单模块内部控制List<Order> selectOrdersByUserIdAndState(String userId, int state);// 根据订单Id查询订单// 问题① select不应该出现在业务层,可以使用query代替,偏业务化Order selectOrderById(String orderId);// 插入订单信息// 问题① insert不应该出现在业务层,从业务角度我们可以说初始化订单,生成订单,创建订单等等,但是不要用插入这种数据库专用名词boolean insertOrder(String userId, String price, String productId);// 更新订单状态// 问题① update不应该出现在业务层,我们可以换个方式去暴露接口// 问题② state状态不应该暴露给外面,订单状态应该有订单模块内部控制void updateOrderState(String orderId, int state);
}
Good Case
// 优化过后
public interface OrderService {// 查询用户初始化订单// ① 把select修改成了偏业务化的query,也不再有by,userId,state这种数据库关键字或者字段化的概念了// ② 把订单状态对其他模块屏蔽了,其他模块只需要向订单模块发起查询初始化订单的请求,不再需要知道初始化订单状态是啥数字List<Order> queryUserInitOrders(String userId);// 查询用户完成订单// ① 把select修改成了偏业务化的query,也不再有by,userId,state这种数据库关键字或者字段化的概念了// ② 把订单状态对其他模块屏蔽了,其他模块只需要向订单模块发起查询完成订单的请求,不再需要知道完成订单状态是啥数字List<Order> queryUserFinishOrders(String userId);// 根据订单Id查询订单// ① 把select修改成了偏业务化的query,也不再有by,orderId这种数据库关键字或者字段化的概念了Order queryOrder(String orderId);// 初始化订单// ① 插入订单的概念被修改成初始化订单,更偏业务化,而不是机械动作boolean initOrder(String userId, String price, String productId);// 支付成功通知// ① 更新订单状态的行为不再交由外部模块控制,而是由订单模块内部自己控制。// 订单模块只管给外部提供支付成功的通知接口,其他模块不关心通知过后订单模块干了啥,接到通知,是否要修改订单状态,订单状态要修改成什么,是订单模块自己的事情。void paySuccessNotice(String orderId);// 支付失败通知// ① 更新订单状态的行为不再交由外部模块控制,而是由订单模块内部自己控制。// 订单模块只管给外部提供支付失败的通知接口,其他模块不关心通知过后订单模块干了啥,接到通知,是否要修改订单状态,订单状态要修改成什么,是订单模块自己的事情。void payErrorNotice(String orderId);
}// 根据上述订单服务,简单列了几个基本的订单状态,不是很严谨。
public enum OrderStateEnum {INIT(0),// 初始化PAY_ING(1),// 支付中ORDER_FINISH(2),// 订单完成ORDER_CLOSE(3),// 订单关闭;private int state;OrderStateEnum(int state) {this.state = state;}public int getState() {return state;}
}

在三层架构(展示层,业务逻辑层,数据访问层)下,我们编码时应该要充分考虑每一层各自的职责。业务逻辑层的重要性谁都清楚。但很多时候,我经常看到业务逻辑层的方法命名长得跟DAO类似。特别是updateXXXinsertXXX。分层或者分模块的目的就是为了解耦合,各自职责独立,我们应该严格遵守迪米特法则,把对外暴露的接口信息降到最低。

有朋友会说,queryUserInitOrdersqueryUserFinishOrders分开了,那如果订单表有10个状态,岂不是得写10个方法。我想说对,就是这样。封装10个不同状态的查询接口是订单模块细粒度提供服务的职责。

如果想要查询某用户下所有终止状态(完成和关闭)的订单,还需要封装queryUserEndOrders的服务,这算是门面模式。

绝对业务化的命名方式有几个好处。

① 模块多了,各个模块的业务方法多了,维护业务+数据库混杂命名的方法,会晕的。维护纯业务命名的方法会舒服一些。

② 其他模块的开发者并不想知道你内部模块实现细节,干嘛要在命名中带有隐晦的提现。

③ 做一个系统,我一般定先定流程骨架,业务模块只写接口定义,不写实现,业务模块的命名对我后期来完善方法具体实现有指导价值。

④ 显得专业,不,是真的专业。

全部内容查看 优雅代码汇总篇

优雅代码 - 业务层代码命名相关推荐

  1. 【飞秋】OR层代码组织介绍

    OR层代码组织和映射介绍 即时通讯软件 OR层也是老生常谈了,有的朋友说我是重复造车轮,只是OR这部分写的太早了,更主要是的与BLL层代码的集成,非常方便,所以呢,虽然后来NH和IB出来了我没有换,M ...

  2. 如何优雅的写 Controller 层代码?找对姿势!

    前言 本篇主要要介绍的就是controller层的处理,一个完整的后端请求由4部分组成:1. 接口地址(也就是URL地址)2. 请求方式(一般就是get.set,当然还有put.delete)3. 请 ...

  3. springboot中controller层代码优雅写法

    在基于spring框架的项目开发中,必然会遇到controller层,它可以很方便的对外提供数据接口服务,也是非常关键的出口,所以非常有必要进行规范统一,使其既简洁又优雅. controller层的职 ...

  4. 使用Spring特性优雅书写业务代码

    作者:阿里巴巴淘系技术 链接:https://www.zhihu.com/question/60761181/answer/1737592739 来源:知乎 著作权归作者所有.商业转载请联系作者获得授 ...

  5. [如何书写优雅的代码]有意义的命名

    [如何书写优雅的代码]有意义的命名 好的命名让人更容易理解和修改代码,但要让命名做到"名副其实"说起来简单,做好却很难,好的命名已经回复了很多大问题,比如这些类.函数.变量为什么存 ...

  6. 编写业务层和持久层事务控制代码并配置spring的ioc

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  7. 代码精进之路-命名与规范

    一.命名 1.有意义的命名 如果你无法想出一个合适的名字,很可能意味着代码"坏味道".设计有问题.这时可以思考一下:是不是方法里实现了太多的功能?或者类的封装内聚性不够? 2.函数 ...

  8. [WebAssembly 入门] 实现数独游戏 - 如何优雅的组织Rust代码

    title: [WebAssembly 入门] 实现数独游戏 - 如何优雅的组织Rust代码 date: 2018-4-23 22:55:00 categories: WebAssembly, 笔记 ...

  9. dao层和service层和control_maven分模块构建SSM普通web项目:service层代码编写

    接着编写service层的代码. 1.service接口及其实现类 新建service包用于放service接口,还有,新建service.impl包放接口的实现类.如下图,BookService和其 ...

最新文章

  1. python 数据库查询结果邮件提醒_Python实现的查询mysql数据库并通过邮件发送信息功能...
  2. python3 的encode 和 decode
  3. Linux虚拟机基本操作
  4. 解决idea中maven项目无法读取src/main/java目录下面的配置文件问题
  5. git 管理 Linux 文件系统
  6. c# 获取html代码怎么写,C#获取网页源代码的方法
  7. (PDF格式论文加书签)Tampermonkey + 知网下载助手 + FreePic2Pdf
  8. 如何由 XRD 图谱确定所做的样品是准晶结构
  9. 计算机基础第四章excel,计算机基础第4次作业 第四章 Excel知识题
  10. 一般线性模型混合线性模型广义线性模型【转】
  11. visio软件接口流程图_绘制流程图——Visio可以让你事半功倍哦!
  12. 谷歌翻译 翻译文档爬虫
  13. 【Tableau Desktop 企业日常问题28】Tableau 如何发布到public ?
  14. lenovo计算机无法启动,联想台式电脑不能启动开机
  15. 赛格威机器人路萌中国首秀 开发者计划今年将在国内落地
  16. 一个Java菜鸟的学习之道~~~
  17. Android 消息队列
  18. linux解压压缩包分卷
  19. python爬虫百度安全验证_爬虫黑科技-绕开百度人机验证
  20. 启动马达接线实物图_软启动器接线实物图 - 软启动器工作原理与主电路图_软启动器接线实物图...

热门文章

  1. 电骡(eMule)中文版 - NAT原理简介及各种路由器的端口映射方法
  2. qq邮箱、qq空间点击后以word方式打开解决办法
  3. 华为机试题练习-保险箱
  4. Tomcat 部署 war 包
  5. ThinkPHP框架信息泄露
  6. win_server_2008x64升级powershell到4.0
  7. Linux文件管理命令大全
  8. 基于JAVA体检系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  9. Flutter完整开发实战详解(二、 快速开发实战篇) | 掘金技术征文
  10. 又一个北漂离开了,我还想坚持一下!