如何合理的定义接口出入参更优雅?

如何合理的定义领域模型

CREATE TABLE `user`
(
    `id`          VARCHAR(64) NOT NULL COMMENT '主键ID',
    `name`        VARCHAR(64) NOT NULL COMMENT '姓名',
    `email`       VARCHAR(32)  DEFAULT NULL COMMENT '邮箱号',
    `mobile`      VARCHAR(16)  DEFAULT NULL COMMENT '手机号',
    `password`    VARCHAR(128) DEFAULT NULL COMMENT '密码',
    PRIMARY KEY (`id`) USING BTREE
) COMMENT = '用户表';


CREATE TABLE `employee`
(
    `id`             VARCHAR(64) NOT NULL COMMENT '主键ID',
    `user_id`        VARCHAR(64) NOT NULL COMMENT '用户ID',
    `employee_no`    VARCHAR(32) NOT NULL COMMENT '工号',
    PRIMARY KEY (`id`) USING BTREE
) COMMENT = '员工表';


CREATE TABLE `department`
(
    `id`             VARCHAR(64)   NOT NULL COMMENT '主键ID',
    `parent_id`      VARCHAR(64)   NOT NULL COMMENT '父ID',
    `name`           VARCHAR(64)   NOT NULL COMMENT '部门名称',
) COMMENT = '部门表';

CREATE TABLE `user_department`
(
    `id`            VARCHAR(64) NOT NULL COMMENT '主键ID',
    `user_id`       VARCHAR(64) NOT NULL COMMENT '工号',
    `department_id` VARCHAR(64) NOT NULL COMMENT '部门ID',
    `sort`          INT         DEFAULT 0 COMMENT '用户在部门中显示顺序,值越大越靠前',
) COMMENT = '用户与部门关联表';

用户与员工一对一,员工与部门多对多。用户是员工才能有部门
1.创建部门、更新部门、获取部门详情信息
2.创建用户、更新用户、获取用户详情信息

如何合理的设计这几个接口的出入参数、提供代码的通用性且好扩展

阅读 1.2k
avatarAI BotBETA

为了合理地设计接口的出入参数,提供代码的通用性和可扩展性,可以考虑以下几点:

  1. 明确接口目的和参数用途
* 在设计接口之前,首先明确接口的目的和用途。例如,对于创建或更新部门,你需要知道需要传递哪些信息,如部门名称、父部门ID等。
  1. 使用DTO (Data Transfer Object)
* DTO是一个简单的对象,用于封装数据,用于在不同层之间传递。它通常不包含业务逻辑,只包含数据字段。例如,你可以创建一个`DepartmentDTO`,其中包含部门名称、父部门ID等字段。
  1. 定义通用参数和扩展点
* 定义一些通用的参数,如分页信息、排序方式等。这些参数可以在多个接口中共享。
* 同时,为将来的扩展预留一些接口参数或字段,例如可以为将来的搜索功能预留一个搜索关键字字段。
  1. 考虑异常处理和错误信息
* 在接口中考虑异常处理和错误信息返回。例如,当部门名称已存在时,可以返回一个错误信息而不是直接抛出异常。
  1. 遵循RESTful原则
* 如果你的接口是基于HTTP协议的RESTful API,建议遵循资源导向、无状态、幂等性、分层等原则。
  1. 参数校验
* 对入参进行校验,确保传入的数据格式正确、满足业务规则等。如果参数不满足要求,可以返回相应的错误信息。
  1. 提供文档和注释
* 对每个接口进行详细描述,包括输入参数、输出结果、异常处理等。这样其他开发者可以快速理解接口的用途和使用方式。
  1. 保持接口简洁
* 避免在单个接口中传递过多的数据或逻辑。如果需要传递大量数据或执行复杂的逻辑,可以考虑将其拆分为多个接口或服务。
  1. 考虑安全性
* 确保接口的安全性,如防止SQL注入、XSS攻击等。对所有传入的数据进行适当的转义和过滤。
  1. 提供单元测试和集成测试
  2. 对每个接口进行单元测试和集成测试,确保其正常工作并满足业务需求。这也有助于确保接口的稳定性和可靠性。
1 个回答

在当前的Java EE趋势下,你这种简单的CRUD,出入参完全就取决于Model如何设计了,Model设计的好,代码自然简单易懂,我建议如下

1.用户与员工一对一,但是先有用户,后有员工还是先有员工,后有用户,由你自己来决定,既然是一对一,你就应该用一张表来存储,满足SQL范式

2.解决is-a问题,用户是员工,或者员工是可登录的用户,为了区分是员工和是用户,可以用继承完成,员工employee继承userMapper层面也可以继承,运行时,可通过instanceof employee完成对员工的判定

3.相信到这里,不难看出,新增用户和将一个用户变成员工,是完全不同的接口设计,这样拓展性极强,而且底层表是同一张,链表查询复杂度大大降低

4.如果后续有其他新增字段,可以选择_extents这样的表,将不常用字段或附加属性隔离

5.回头看这6个接口的出入参设计

  • 创建部门、更新部门、获取部门详情信息 都是单表CRUD
  • 创建用户、更新用户 入参是user,返回是整个父类对象
  • 获取用户详情信息入参是id,返回是整个父类对象

其他细节自行考虑

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题