当前位置: 首页 > 编程日记 > 正文

恭喜你发现了宝藏,编程习惯-日积月累

总结:

  1. 条件查询可在数据库层创建queryDto进行统一操作。

  2. 代码复用:若有代码重复出现了三次,很大概率可以重构。(三则重构)

  3. dto和entity中的赋值操作,可以写成方法放在dto中。(充血模型)

  4. dto中不写id,id是前端另外传过来或后端生成的。(幂等)

  5. 取和存数据相同时,可只用entity一个数据传输对象。

  6. 使用框架、工具类的代码不可直接在业务层引入(业务就是业务,工具可以包装调用),操作数据需统一通过持久化层进行封装(持久层与业务层代码隔离)。

  7. 领域、对象的命名需使用名词,不可有歧义。若命名不理想,需商讨。(软件设计很重要的一点:如何命名)

  8. 接口对外暴露地址要语义明确,单词间使用 “-” 分割(简短精确!restful)

  9. 当领域中有相似功能实现时,有三种数据库设计方式:

​ (1)将所有字段合并在一张表中,各业务留冗余为空的字段。【不使用】

​ (2)抽离出公共属性字段,独立成表,在使用时关联相关独立业务表查询。【符合第三范式,但在查询时需要扫描连表查询,使用较少】

​ (3)在实际使用中,常常使用水平拆分,降低单库(一张表)的数据量,使用反范式设计来满足不同维度上的查询需求。将两张表中的查询展示数据抽离在一张表中,保留一定的数据冗余,通过标志位区分不同业务。其余的一些下一阶段的查询存放于各自的单表中。实现冗余和查询功能的中和。【使用较多】

  1. 前后端有关时间类型的传输要保证准确,统一使用编程语言中的时间类型进行传输,而不采用String,具体使用再进行不同的转化。

  2. 每一个实体所包含的字段,应该具有该实体的唯一使用场景。如:游戏中的"预约数",该字段虽为游戏本身属性,但只针对"预约游戏",而非所有的游戏(包含已上线的游戏),这时,应将 预约数量独立出来,而非与"游戏"实体的固有属性存放在一张数据库表中。

  3. 领域之间的松耦合:一个领域中使用一个service,同一个Repository只在对应领域中的一个service中出现。若两个领域中有业务上的交互,那么应该由被调用方抽离出被调用的方法,提供调用接口(如:GameServiceFacade)给调用方使用。若业务不复杂或交互点不多时,也可直接进行service层的互调。

  4. 测试

​ (1)为了利于编码测试,可以在业务层进行改造,改造方式有两种:1、修改repo的注入方式,将mock包裹的repo对象注入service中的repo;2、修改业务层逻辑,将独立的repo逻辑剔出,放在controller统一调用。

​ (2)能不使用mock进行隔离则不进行mock隔离,保证代码在功能上的独立测试性。

关于测试:如果你的代码功能不利于单元测试,那么你的代码多半是有毛病的(很大的重构空间和优化空间)

  1. k8s是个好东西,不要拒绝难度高的技术选型。
  2. 允许数据结构上的字段冗余,权衡利弊,这个需要经验。
  3. 少用继承(extents),多用组合(implement)。其实工作中我几乎不会用继承,徒增复杂度。

引用一下:我的观点没那么极端!之所以“多用组合少用继承”这个口号喊得这么响,只是因为,长期以来,我们过度使用继承。
还是那句话,组合并不完美,继承也不是一无是处。只要我们控制好它们的副作用、发挥它们各自的优势,在不同的场合下,恰当地选使用继承还是组合,这才是我们所追求的境界。

更新:2021-10-19

相关文章:

Gradle 将项目publish到Nexus,Kotlin将项目发布到nexus,springboot项目发布到maven仓库

示例见:Gitte 公仓设置 在项目中添加maven-publish的插件 plugins {kotlin("jvm") version "1.3.72"kotlin("plugin.spring") version "1.3.72"java-librarymaven-publishmaven }如同maven项目一样设置组、版本信息 gr…

妙用postman系列——postman建组、分享

妙用postman系列——postman建组、分享 添加新的组和请求。 3、生成分享链接 4、导入分享链接

Postman使用Date数据类型,Postman发送Date类型数据,Postman模拟前端调用

Postman使用Date数据类型: 在form-data数据类型下,使用 2021/7/7 11:11:00 (yyyy/MM/dd HH:mm:ss) 的数据格式即可 如下: 在json数据格式中,这种的则不能适用,需要在Per-request Script中设置…

IDEA中将代码块封装为方法,IDEA代码重构快捷键

IDEA中将代码块封装为方法 选中要转换的代码块,快捷键: Windows快捷键:Alt Shift M Mac快捷键:Alt Command M 如图:

Kotlin协程使用,协程使用注意事项,协程中的await方法使用|不使用suspend使用协程

参见 码云 协程使用方法一 (Dispatchers调度器模式) 指定不同线程。同线程会挂起并阻塞(挂起是不影响主线程执行,阻塞是同样的IO线程会阻塞) withContext(Dispatchers.IO) { // 👈 切换到 IO 线程&…

Alibaba Cloud Linux 2.1903 LTS 64位服务器yum源下载404,Alibaba Cloud Linux 2实例中使用docker-ce、epel等YUM源安装软件失败

[Alibaba Cloud Linux 2.1903 LTS 64位]服务器yum源下载404 failure: repodata/repomd.xml from docker-ce-stable: [Errno 256] No more mirrors to try. https://download.docker.com/linux/centos/2.1903/x86_64/stable/repodata/repomd.xml: [Errno 14] HTTPS Error 404 -…

OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3

OpenAPI使用(swagger3) demo见Gitte 一、背景及名词解释 OpenAPI是规范的正式名称。规范的开发工作于2015年启动,当时SmartBear(负责Swagger工具开发的公司)将Swagger 2.0规范捐赠给了Open API Initiative&#xff0…

linux环境下nacos的安装+启动,阿里云服务器安装nacos

nacos安装启动(linux环境): 基础:安装java环境 官网下载压缩包:如 nacos-server-1.2.1.tar.gz 放在自定义目录下 # 解压 tar -xvf nacos-server-1.2.1.tar.gz进入bin目录 cd nacos/bin # 启动 sh startup.sh -m sta…

SpringBoot项目使用nacos,kotlin使用nacos,java项目使用nacos,gradle项目使用nacos,maven项目使用nacos

SpringBoot项目使用nacos kotlin demo见Gitte 一、引入依赖 提示&#xff1a;这里推荐使用2.2.3版本&#xff0c;springboot与nacos的依赖需要版本相同&#xff0c;否则会报错。 maven版本 <dependency><groupId>com.alibaba.cloud</groupId><artifact…

使用第三方SDK(如微信、qq、快看、头条等),调用接口405 Method Not Allowed

使用第三方SDK&#xff08;如微信、qq、快看、头条等&#xff09;&#xff0c;调用接口405 Method Not Allowed 错误描述&#xff1a;postman请求正常&#xff0c;但客户端调用后接口没有反应&#xff0c;但返回了405错误。 解决方法&#xff1a;第三方sdk调用接口需要使用http…

ECS(Linux)连接RDS,使用命令行方式连接实例

使用命令行方式连接实例 通过命令行连接RDS MySQL数据库&#xff0c;连接方式如下&#xff1a; mysql -h<连接地址> -P<端口> -u<用户名> -p -D<数据库名称># 假设 用户testuser 密码123 数据库连接为 rm-bp1457xxxxxx.mysql.rds.aliyuncs.com mysql…

kotlin设置CORS跨域资源共享,java设置允许跨域,服务端如何设置 springboot中设置跨域资源共享

CORS通信过程&#xff0c;都是浏览器或http插件自动完成&#xff0c;不需要 用户/开发人员 参与。对于开发者来说&#xff0c;CORS通信与同源的AJAX通信没有差别&#xff0c;代码是完全一样的。浏览器一旦发现AJAX请求跨源&#xff0c;就会自动添加一些附加的头信息&#xff0c…

创建数据库,指定数据库的字符集和编码顺序

创建数据库&#xff0c;指定它的字符集和编码顺序 create database {数据库名称} CHARACTER SET {字符集} COLLATE {排序规则}举例&#xff1a; create database collage CHARACTER SET utf8mb4 COLLATE utf8_general_ci

Java | kotlin 手动注入bean,解决lateinit property loginService has not been initialized异常

kotlin.UninitializedPropertyAccessException: lateinit property loginService has not been initialized 注解类加载延迟导致的异常 解决方法一&#xff1a;工厂模式 建一个工厂类&#xff0c;如UserServiceFactory&#xff0c;使用该方法 java版&#xff1a; public abs…

kotlin中继承父属性使用构造方法

kotlin中继承父属性使用构造方法 1. 定义父类&#xff0c;给它两个属性&#xff1a; abstract class AbstractResponseMessage {private var success trueprivate var reason: String? nullconstructor() {}constructor(success: Boolean, reason: String?) {this.succes…

在kotlin companion object中读取spring boot配置文件,静态类使用@Value注解配置

在kotlin companion object中读取配置文件 静态类使用Value注解配置 class Config {Value("\${name}")fun setName(name: String) {Config.name name}companion object {private var name:String ? nullfun getName(): String {return name}} }在companion object…

微信公众号为指定openid用户推送消息

微信公众号为指定openid用户推送消息 微信提供的开放接口中&#xff0c;有两个给指定openid的用户发送信息的接口&#xff0c;适用场景应该是向 预约用户或者中奖用户发送消息。 第一个接口&#xff1a;客服发送消息 请求方式&#xff1a; POST 请求地址&#xff1a;https://a…

Docker容器的备份与恢复,Docker镜像的备份与恢复

1. 备份容器 首先&#xff0c;为了备份Docker中的容器&#xff0c;我们会想看看我们想要备份的容器列表。要达成该目的&#xff0c;我们需要在我们运行着Docker引擎&#xff0c;并已创建了容器的Linux机器中运行 docker ps 命令。 # docker ps Docker Containers List 在此之…

SpringBoot部署脚本,拿走即用!

一个可以直接拿来使用的shell脚本&#xff0c;适用于springboot项目 #!/bin/bash # 这里可替换为你自己的执行程序&#xff0c;其他代码无需更改,绝对路径相对路径均可。 # 若使用jenkins等工具远程构建&#xff0c;则使用绝对路径&#xff0c;下面的日志输出路径同&#xff0…

淘宝获取单笔订单信息服务端调用API及流程

淘宝获取单笔交易接口&#xff08;文档地址&#xff09;&#xff1a;https://open.taobao.com/api.htm?docId54&docType2 调用接口所需依赖&#xff08;文档地址&#xff09;&#xff1a;https://developer.alibaba.com/docs/doc.htm?treeId1&articleId101618&d…

在Chrome中打开网页时出现以下问题 您的连接不是私密连接 攻击者可能会试图从 x.x.x.x 窃取您的信息(例如:密码、通讯内容或信用卡信息)

现象&#xff1a;在Chrome中打开网页时出现以下问题 您的连接不是私密连接 攻击者可能会试图从 x.x.x.x 窃取您的信息&#xff08;例如&#xff1a;密码、通讯内容或信用卡信息&#xff09;。 当点开“了解详情”后显示&#xff1a; 了解详情 NET::ERR_CERT_INVALID 将您访问的…

Dockerfile springboot项目拿走即用,将yml配置文件从外部挂入容器

Dockerfile 将springboot项目jar包打成镜像&#xff0c;并将yml配置文件外挂。 # 以一个镜像为基础&#xff0c;在其上进行定制。就像我们之前运行了一个 nginx 镜像的容器&#xff0c;再进行修改一样&#xff0c;基础镜像是必须指定的。而 FROM 就是指定 基础镜像&#xff0c…

解决gitte提交报错 error: GE007: Your push would publish a private email address.

错误情况&#xff1a; gitte提交报错&#xff0c;无法提交上去&#xff0c;报错如下&#xff1a; remote: Powered by GITEE.COM [GNK-6.0] remote: error: GE007: Your push would publish a private email address. remote: You can make your email public or disa…

Reject: HTTP ‘DELETE‘ is not allowed, Not injecting HSTS.....DELETE请求PUT请求跨域问题

CORS&#xff08;DELETE请求、PUT请求&#xff09; Reject: HTTP DELETE is not allowed [DEBUG] 2021-08-25 15:23:52.401 [http-nio-10010-exec-1] HstsHeaderWriter.writeHeaders(169) - Not injecting HSTS header since it did not match the requestMatcher org.springf…

Not injecting HSTS header since it did not match the requestMatcher HSTS设置问题解决

HSTS请求设置 错误描述&#xff1a;在使用文件上传功能时&#xff0c;form表单提交带有header数据的请求时遇到这个问题&#xff0c;报错如下&#xff1a; Not injecting HSTS header since it did not match the requestMatcher org.springframework.security.web.header.wr…

restTemplate http请求报错:no suitable HttpMessageConverter found for response type and content type

报错信息&#xff1a; org.springframework.web.client.UnknownContentTypeException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.xxx] and content type [text/html;charsetutf-8] 异常原因&#xff1a;RestTempla…

mongo报错:not authorized on bb to execute command { create: \“xxx\“...}

mongo报错&#xff1a; {"ok" : 0,"errmsg" : "not authorized on bb to execute command { create: \"a\", capped: \"1\", lsid: { id: UUID(\"f01a76ec-6261-4886-9a3f-e07169eed122\") }, $db: \"bb\" …

阿里云如何将服务器添加至跳板机,如何将服务器添加至jumpsever

如何将服务器添加至跳板机。 获取跳板机/root/.ssh/id_rsa.pub 中的内容 登陆要添加到跳板机的目标机器 /root/.ssh/authorized_keys 将跳板机id_rsa.pub 内容复制到目标机器的authorized_keys中&#xff0c;累加在后面。 目标机器执行service sshd restart 在跳板机控制台添加…

zip压缩多个文件,解压时不包含目录层级

假设我们有个目录叫 dev&#xff0c;dev中有很多文件&#xff0c;我们想要将dev中的文件打包&#xff0c;名字可能叫dev.zip,但当我们解压的时候&#xff0c;不想要解压生成一个dev目录&#xff0c;想要直接解压在当前目录&#xff0c;这样如何压缩呢&#xff1f; # 进入dev目…

过滤Linux下不同大小的文件,linux查找当前目录下 M/G 大小的文件,删除Linux下指定大小的文件

过滤Linux下不同大小的文件&#xff0c;linux查找当前目录下 M/G 大小的文件&#xff0c;删除Linux下指定大小的文件 find ./ -type f -size 1G| xargs rm在清理系统日志文件、备份文件等场景中&#xff0c;可以使用这个命令。 这里的参数还可以改为 100M 等等&#xff0c;也…