2025系统架构师---数据抽象(Data Abstraction)与面向对象架构风格
引言
在软件系统复杂度与规模不断攀升的今天,如何设计出可扩展、易维护且能快速响应需求变化的架构,是每一位系统架构师面临的挑战。数据抽象(Data Abstraction)与面向对象架构风格(Object-Oriented Architecture Style)作为软件工程领域的经典范式,通过封装、继承、多态等核心机制,为构建高内聚、低耦合的系统提供了方法论支持。本文将从概念本质、功能特性、典型业务场景及实际项目实践出发,深入探讨这两种架构风格的设计哲学与工程价值。
第一章 核心概念解析
1.1 数据抽象的本质与意义
数据抽象的核心在于隐藏实现细节,暴露必要接口。其核心思想是将复杂系统的内部实现与外部使用分离,仅通过定义明确的操作接口与外界交互。例如,在文件系统中,用户无需了解磁盘扇区的读写细节,只需调用open()
、read()
等接口即可完成文件操作。
- 抽象层次划分:通过分层抽象(如硬件层→操作系统层→应用层)逐级屏蔽复杂性。
- 接口隔离原则:为不同客户端提供差异化的访问接口(如管理员接口与普通用户接口)。
1.2 面向对象架构的核心特征
面向对象架构风格以对象为基本单元组织系统,其核心特征包括:
- 封装(Encapsulation):将数据与操作绑定,限制外部对内部状态的直接访问。
- 继承(Inheritance):通过泛化与特化关系复用代码,例如“动物”类派生出“猫”“狗”等子类。
- 多态(Polymorphism):同一接口的不同实现(如“支付”接口支持支付宝、微信支付等具体方式)。
1.3 数据抽象与面向对象的关系
- 互补性:数据抽象是面向对象的基础,封装则是实现抽象的核心手段。
- 差异点:数据抽象更关注接口设计,而面向对象强调对象之间的交互与责任分配。
第二章 功能特性与设计原则
2.1 数据抽象的核心功能
- 复杂性管理:通过分层抽象简化系统认知负担(如网络协议栈的七层模型)。
- 变更隔离:修改底层实现不影响上层调用(如替换数据库引擎无需修改业务逻辑)。
- 接口标准化:统一不同实现的访问方式(如不同存储引擎提供相同的文件操作接口)。
2.2 面向对象架构的设计原则
- 单一职责原则(SRP):每个类仅承担一个职责(如“订单类”不处理支付逻辑)。
- 开闭原则(OCP):对扩展开放,对修改关闭(通过继承或组合增加功能)。
- 依赖倒置原则(DIP):高层模块依赖抽象接口而非具体实现(如“订单服务”依赖抽象的“支付接口”)。
2.3 架构优势对比
维度 | 数据抽象架构 | 面向对象架构 |
---|---|---|
核心目标 | 简化复杂性,隔离变化 | 模拟现实世界,提高代码复用性 |
适用场景 | 底层系统设计(操作系统、驱动) | 业务系统建模(电商、ERP) |
扩展方式 | 接口扩展 | 继承与组合扩展 |
第三章 典型业务场景分析
3.1 场景1:电商订单系统
- 需求挑战:
- 订单状态的复杂流转(创建、支付、发货、退货)。
- 多种促销规则(满减、折扣、积分抵扣)的动态叠加。
- 架构设计:
- 数据抽象:定义统一的订单操作接口(如
submitOrder()
、cancelOrder()
),隐藏库存扣减、优惠计算等细节。 - 面向对象:
- 使用策略模式实现促销规则(每个规则封装为独立对象)。
- 通过状态模式管理订单生命周期(不同状态对应不同行为)。
- 数据抽象:定义统一的订单操作接口(如
3.2 场景2:金融风控系统
- 需求挑战:
- 实时拦截高风险交易(如盗刷、洗钱)。
- 支持风控规则的动态配置与灰度发布。
- 架构设计:
- 数据抽象:封装风控引擎的决策接口(如
evaluateRisk()
),隔离规则引擎(Drools)、模型推理(TensorFlow)等实现差异。 - 面向对象:
- 使用责任链模式串联规则检查(反欺诈→信用评估→合规审查)。
- 通过工厂模式动态加载不同版本的风控规则。
- 数据抽象:封装风控引擎的决策接口(如
3.3 场景3:物联网设备管理平台
- 需求挑战:
- 支持多协议设备接入(Modbus、MQTT、CoAP)。
- 设备状态的实时监控与指令下发。
- 架构设计:
- 数据抽象:定义统一的设备操作接口(如
connect()
、readData()
),屏蔽协议差异。 - 面向对象:
- 使用桥接模式分离设备类型与通信协议。
- 通过观察者模式实现设备状态变更通知。
- 数据抽象:定义统一的设备操作接口(如
第四章 实际项目中的架构实践
4.1 实践1:领域驱动设计(DDD)与面向对象
- 领域模型设计:
- 将业务概念映射为对象(如“聚合根”“实体”“值对象”)。
- 示例:电商系统中“订单聚合根”管理订单项、地址、支付记录等子对象。
- 战术模式应用:
- 工厂模式创建复杂对象(如订单需校验库存后生成)。
- 仓储模式封装数据持久化逻辑(隔离数据库操作与业务逻辑)。
4.2 实践2:微服务架构中的数据抽象
- 服务接口设计:
- 通过API Gateway暴露粗粒度接口(如
/orders
),隐藏内部服务拆分细节。 - 使用GraphQL聚合多个微服务的数据响应。
- 通过API Gateway暴露粗粒度接口(如
- 抽象泄漏防范:
- 避免在接口中暴露数据库主键、技术框架细节(如JPA注解)。
- 定义DTO(Data Transfer Object)屏蔽领域模型内部结构。
4.3 实践3:模块化与分层架构
- 经典分层模型:
- 表现层(UI/API)→ 应用层(业务流程)→ 领域层(业务规则)→ 基础设施层(数据库、消息队列)。
- 包结构设计:
textCopy Code
com.example.order ├── application(应用服务) ├── domain(领域模型) │ ├── model(聚合根、实体) │ └── service(领域服务) └── infrastructure(持久化、消息实现)
第五章 架构演进与挑战
5.1 从单体到分布式的架构演进
- 数据抽象挑战:
- 跨服务数据一致性(如订单服务与库存服务的数据同步)。
- 分布式事务的接口抽象(使用Saga模式替代本地ACID)。
- 面向对象适配:
- 将本地对象调用改为远程服务调用(需处理网络超时、重试)。
- 使用防腐层(Anti-Corruption Layer)隔离外部服务的模型差异。
5.2 云原生环境下的架构调整
- 数据抽象优化:
- 通过Service Mesh抽象网络通信(如Istio流量管理)。
- 使用Serverless函数封装无状态计算逻辑。
- 对象生命周期管理:
- 容器化环境中的对象池模式(如数据库连接池自动扩缩容)。
- 依赖注入框架(如Spring Cloud)管理分布式对象依赖。
5.3 与函数式编程的融合趋势
- 互补性分析:
范式 面向对象架构 函数式架构 核心单元 对象(状态+行为) 函数(无状态计算) 适用场景 复杂业务建模 数据流水线、并发处理 - 混合架构案例:
- 使用不可变对象(Immutable Object)避免并发冲突。
- 将领域模型的行为拆分为纯函数(如价格计算函数)。
第六章 设计反模式与避坑指南
6.1 常见反模式
- 贫血模型(Anemic Domain Model):
- 问题:领域对象仅包含数据,业务逻辑散落在Service层。
- 解决:将业务规则内聚到领域对象中。
- 过度抽象(Over-Engineering):
- 问题:为不存在的需求预先设计扩展接口。
- 解决:遵循YAGNI原则(You Ain’t Gonna Need It)。
6.2 性能优化权衡
- 抽象代价:
- 间接调用(如接口代理)可能增加CPU开销。
- 深层次的对象嵌套影响缓存局部性。
- 优化策略:
- 在性能关键路径避免过度分层(如直接调用本地函数)。
- 使用值对象(Value Object)替代实体引用以减少内存占用。
6.3 团队协作规范
- 设计一致性:
- 制定统一的建模规范(如命名规则、分层标准)。
- 使用架构决策记录(ADR)文档化关键设计选择。
- 工具支持:
- 通过IDE模板标准化代码结构(如IntelliJ Live Templates)。
- 使用SonarQube检查架构规范违反情况。
结语
数据抽象与面向对象架构风格并非银弹,但其通过封装变化、提高复用性的核心思想,依然是应对软件复杂性的重要手段。架构师需在业务理解、技术选型与团队协作中寻找平衡,避免教条主义。未来,随着云原生、事件驱动等新范式的兴起,面向对象架构需与其他风格融合共生,但其“高内聚低耦合”的设计哲学将始终是构建可持续演进系统的基石。
相关文章:
2025系统架构师---数据抽象(Data Abstraction)与面向对象架构风格
引言 在软件系统复杂度与规模不断攀升的今天,如何设计出可扩展、易维护且能快速响应需求变化的架构,是每一位系统架构师面临的挑战。数据抽象(Data Abstraction)与面向对象架构风格(Object-Oriented Architectu…...
[python] 基于WatchDog库实现文件系统监控
Watchdog库是Python中一个用于监控文件系统变化的第三方库。它能够实时监测文件或目录的创建、修改、删除等操作,并在这些事件发生时触发相应的处理逻辑,因此也被称为文件看门狗。 Watchdog库的官方仓库见:watchdog,Watchdog库的官…...
缺省处理、容错处理
布尔判定 假:false 0 null undefined NaN 可选符.?和?? let obj {name: jim,data: {money: 0,age: 18,fn(a){return a}} }1、如果左侧的值为null或者undefined,则使用右侧值。需要使用"??" obj?.data?.a…...
Taro on Harmony :助力业务高效开发纯血鸿蒙应用
背景 纯血鸿蒙逐渐成为全球第三大操作系统,业界也掀起了适配鸿蒙原生的浪潮,用户迁移趋势明显,京东作为国民应用,为鸿蒙用户提供完整的购物体验至关重要。   去年 9 月,京东 AP…...
Java基础——排序算法
排序算法不管是考试、面试、还是日常开发中都是一个特别高频的点。下面对八种排序算法做简单的介绍。 1. 冒泡排序(Bubble Sort) 原理:相邻元素比较,每一轮将最大元素“冒泡”到末尾。 示例数组:[5, 3, 8, 1, 2] pub…...
【操作系统原理07】输入/输出系统
文章目录 零.大纲一.I/O设备的概念和分类0.大纲1.什么是I/O设备2.I/O分类 二.I/O控制器0.大纲1.I/O设备的电子部件(I/O控制器)2.IO控制器组成3.内存映像I/O VS 寄存器独立编址 三.I/O控制方式0.大纲与总结1.程序直接控制方式(1) 操…...
IM云端搜索全面升级,独家能力拓展更多“社交连接”玩法
在这个数字时代,网络让信息传递前所未有的便捷,但同时,海量数据堆积也让内容检索变得像大海捞针。尤其是在我们日常工作生活中最常用的即时通信软件中,信息的快速查找和精准定位正变得越来越重要。 但传统的本地搜索功能受限于设…...
汽车产业链主表及类别表设计
(提前设计,备用) 一、汽车产业链类别表(industry_chain_category) 设计要点 1、核心字段:定义产业链分类(如零部件、整车制造、销售服务等) 2、主键约束:自增ID作为唯一标…...
有效的字母异位词
recorded:用于统计或抵消字符出现次数。 class Solution { public:bool isAnagram(string s, string t) {int record[26]{0};for(int i0;i<s.size();i){record[s[i]-a];}for(int i0;i<t.size();i){record[t[i]-a]--;}for(int i0;i<26;i){if(record[i]!0){…...
汽车网络安全 -- 理解暴露面、攻击面和攻击向量
1.暴露面是攻击面的子集 举个例子,房子都有门、窗户,这些窗户、门不管是否打开,都可能被小偷利用进入到房内,因此这些门窗可能是潜在的漏洞,所以称之为攻击面(Attack Surface)。 小偷经过长期观察,发现家…...
C++异步利器:全面理解 std::packaged_task
在现代 C(C11及以后)中,并发与异步编程是不可回避的重要技能。我们常常希望把某些计算任务扔给后台线程去处理,同时又能优雅地获取任务结果。 这时候,std::packaged_task 就是一个非常强大的工具。 本文将带你深入理解…...
Animate 中HTMLCanvas 画布下的鼠标事件列表(DOM 鼠标)
在 JavaScript 和 Adobe Animate(CreateJS) 中,常用的鼠标交互事件可分为两大类:基础 DOM 事件 和 CreateJS 扩展事件12。以下是完整分类: 一、基础 DOM 鼠标事件 事件名触发场景冒泡特性click鼠标左键单…...
RagFlow文档切块提升
1.RagFlow切块介绍 2.复现优化 2.1 General 通用分块 def parser_text(self, txt, blockSize512, overlapSize0, delimiter"\n!?;。;!?"):文本分割sentences self.split_text_by_period_qh(txt, delimiter, blockSizeblockSize)…...
音频转base64
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>音频转Base64</title><style>.containe…...
蓝桥杯 11. 打印大X
打印大X 原题目链接 题目描述 小明希望用星号拼凑,打印出一个大 X,他要求能够控制笔画的宽度和整个字的高度。 为了便于比对空格,所有的空白位置都以句点符 . 来代替。 输入描述 输入两个整数 m 和 n,表示笔画的宽度和 X 的高…...
页面需要重加载才能显示的问题修改
1.问题描述:跳转页面后,只有点击重新加载后才会显示内容 经过测试后: / 跳转详情 const goToDetail (bookId) > { router.push({ path: /classic-detail, query: { book_id: bookId } }) } 执行完以上代码后,页面从classics…...
On the Biology of a Large Language Model——Claude团队的模型理解文章【论文阅读笔记】其二——数学计算部分
这篇内容的源博文是 On the Biology of a Large Language Model 这是Anthropic,也就是Claude的团队的一遍技术博客。他的主要内容是用一种改良版的稀疏编码器来解释LLM在inference过程中内部语义特征的激活模式。因为原文太长,我把原文分成了几份来写阅读…...
Python语言基础知识详解:标识符与变量
Python语言基础知识详解:标识符与变量 一、标识符(Identifiers) 定义 标识符是用于命名变量、函数、类、模块或其他对象的名称。它是代码中对实体的唯一标识。 1. 标识符的命名规则 Python的标识符需遵循以下规则: 允许的字符 由…...
google chrome 中 fcitx5 候选框不跟随光标
我的电脑:ubuntu22.04,窗口系统:wayland 2025/4/26 号更新的谷歌浏览器 今天打开浏览器发现输入法的候选框固定在左上角不动了,一番折腾,发现解决办法如下: 在搜索框中输入 about:flags搜索 wayland&#…...
深入浅出提示词工程(结合 DeepSeek)
提示词工程 Prompt 即提示、指令,所以提示工程也叫「指令工程」 用户输入的问题称为 Prompt,本文主要探讨 System Prompt(我将其翻译成「系统预设」) 使用 Prompt 的目的 直接提问 如「我该学 Vue 还是 React?」&…...
OpenVLA:大语言模型用于机器人操控的经典开源作品
TL;DR 2024 年斯坦福大学提出的 OpenVLA,基于大语言模型实现机器人操控,代码完全开源。 Paper Notes Name:OpenVLA: An Open-Source Vision-Language-Action ModelURL:https://openvla.github.io/作者:斯坦福&#…...
数值分析、数值代数之追赶法
数值分析、数值代数之追赶法 MATLAB 中,diag 函数用法追赶法推导过程代码运行过程 MATLAB 中,diag 函数用法 在 MATLAB 中,diag 函数用于处理矩阵的对角线元素或创建对角矩阵。以下是其常见的用法: 1.提取矩阵的对角线元素 2.创…...
深入浅出JVM - Java架构师面试实战
深入浅出JVM - Java架构师面试实战 本文通过模拟一位拥有十年Java研发经验的资深架构师马架构与面试官之间的对话,深入探讨了JVM的核心知识点。涵盖内存结构、垃圾回收算法、垃圾回收器、内存调优工具及参数配置等关键领域。 第一轮提问 面试官: 马架…...
Qt网络数据解析方法总结
在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据。以下是详细步骤和示例: 1. 网络数据接收 使用QTcpSocket或QUdpSocket接收数据,通过readyRead()信号触发读取: // 创建TCP Socket并连接信号 QTcpSo…...
[AHOI2001] 质数和分解
import java.util.*;public class Main {static int[] ss new int[201];public static void main(String[] args) {Scanner sc new Scanner(System.in);while (sc.hasNextInt()) { int n sc.nextInt();int num 0; // 记录质数个数int[] dp new int[201];dp[0] 1;for (in…...
说一下Drop与delete区别
在数据库操作里,DROP与DELETE是两个重要且功能不同的命令,以下为你详细介绍二者的区别: 功能层面 DROP:此命令用于删除数据库、表、视图、索引等数据库对象。一旦执行,数据库对象就会被彻底删除,其定义和…...
基于云原生架构的后端微服务治理实战指南
一、引言:为什么在云原生时代更需要微服务治理? 在单体应用时代,开发和部署虽然简单,但随着系统规模的扩大,单体架构的维护成本急剧上升,部署频率受限,模块之间相互影响,最终导致系…...
后端响应巨量数据,如何优化性能?
WebSocket流式传输 fetch虚拟滚动 (渲染性能提升,一次性记载固定条数)分片滚动 fetch流式传输 async function streamData(url) {unction streamOutput(msg) {// 发送 POST 请求fetch(url, {method:"POST",body:JSON.stringify({ …...
《代码整洁之道》第4章 注释 - 笔记
注释的恰当用法是弥补代码表达意图时遭遇的失败,良好的代码,让读者看代码就能明白含义。 代码在变动,在演化。注释并不总是随之变动。不准确的注释比没有注释要坏的多。注释算的上是一种没办法去除的恶。 注释不能美化代码 与其花时间编写…...
闭包与装饰器(python)
此 Python 代码借助闭包构建了计算对数的函数。闭包指的是一个函数与其所引用的外部变量共同构成的一个整体。借助闭包,我们能够创建具有特定行为的函数,并且这些函数可以记住其创建时的环境。 代码详细分析 导入模块 python import math 导入 math …...
学成在线网页
技术:h5css,静态页面 主页: 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0&quo…...
AI测试工具Testim——告别自动化测试维护难题
随着人工智能技术的快速发展,AI测试工具正在成为提升软件研发效能的关键。每款AI的特性各有差异,今天,我们就给大家介绍一款专注于Web和移动应用的端到端的AI测试工具--Testim。 Testim的简介 官网地址:https://www.testim.io/ 简…...
【C++详解】C++入门(二)引用、内联函数、nullptr宏
文章目录 一、引用引用的概念和定义引用的功能引用的特性const引用const用法回顾权限的放大缩小const引用的功能 指针和引用的关系 二、内联函数三、nullptr补充结构体指针变量类型重定义 一、引用 引用的概念和定义 C祖师爷为了优化在部分场景中使用指针会出现的效率较低和比…...
8、HTTPD服务--CGI机制
目录 1、测试PHP页面 2、安装php软件 一、CGI机制介绍 1、测试PHP页面 [rootlocalhost ~]# cat /mp3/test1.php AAAAAAAAAAAAA <?phpphpinfo(); ?> 2、安装php软件 # yum install -y php # systemctl restart httpd php实际上是作为httpd的功能模块存在的 [r…...
层级时间轮的 Golang 实现原理与实践
一、引言 在高并发服务中,延时任务的管理是一个常见且重要的需求。比如 HTTP 请求超时、心跳检测、订单超时未支付提醒等场景,传统的 Timer 或 Heap 实现会带来 O(log n) 的复杂度,难以支撑百万级别的定时任务。 论文《Hashed and Hierarch…...
人类社会的第四阶段
本书的主旨是探讨一场新的权力革命,它将以20世纪民族国家的毁灭为代价, 解放出个体。创新,以前所未有的方式改变了暴力的逻辑,并且正在革新未来的 边界。如果我们的推论是正确的,你们正站在一场有史以来最宏大的革命的…...
Golang | Builder模式
Builder模式是一种创建型设计模式,用于分步骤构建复杂对象,尤其适用于构造过程复杂或需要多个配置选项的场景。将对象的构造过程与其表示分离,通过分步骤和链式调用的方式灵活创建对象,避免构造函数的参数爆炸,提升代码…...
C#本地使用离线ocr库识别图片中文本,工具包PaddleOCRSharp
C#本地使用离线ocr库识别图片文本,工具包PaddleOCRSharp PaddleOCRSharp介绍 项目地址:https://github.com/raoyutian/PaddleOCRSharp PaddleOCRSharp 是一个.NET版本OCR可离线使用类库。项目核心组件PaddleOCR.dll目前已经支持C\C、.NET、Python、Go…...
Flutter 在 Dart 3.8 开始支持 Null-Aware Elements 语法,自动识别集合里的空元素
近日,在 Dart 3.8 的 changelog 里正式提交了 Null-Aware Elements 语法,该语法糖可以用于在 List、Set、Map 等集合中处理可能为 null 的元素或键值对,简化显式检查 null 的场景: /之前 var listWithoutNullAwareElements [if …...
3、Linux操作系统下,linux的技术手册使用(man)
linux系统内置技术手册,方便开发人员查阅Linux相关指令,提升开发效率 man即是manual的前三个字母,有时候遇事不决,问个人(man) 其在线网址为:man 还有man网站的作者写的书,可以下…...
Python 自动化办公:Excel 数据处理的“秘密武器”
引言 在日常的 IT 办公场景里,Excel 是数据处理与分析的 “常胜将军”。无论是财务人员整理账目、销售团队统计业绩,还是运营人员分析用户数据,Excel 都发挥着关键作用。但面对海量数据,手动操作 Excel 不仅效率低下,还…...
通过数据增强打造抗噪音多模态大模型
下载前面 想象一下,你正在一个嘈杂的咖啡馆里,想让身边的AI助手帮你预定一张电影票。或者,你在熙熙攘攘的街道上,需要语音导航带你找到目的地。在这些真实的场景中,语音交互面临着一个巨大的挑战——噪音。 背景噪音、他人说话声、设备本身的电流声……这些无处不在的干…...
Node.js API 安全的主要策略:最佳实践
了解 Node.js API 安全性 保护 Node.js API 的安全需要了解潜在的漏洞并采取措施来缓解这些漏洞。这类 API 通常遇到的常见威胁包括: SQL 注入**:**操纵用户输入以针对数据库执行恶意 SQL 代码。跨站点脚本**(XSS):**将恶意脚本注入其他用户查看的网页。跨站请求伪造**(CSR…...
如何删除Google Chrome中的所有历史记录【一键清除】
谷歌浏览器记录了用户访问过的网站。这方便了查找,但有时也需要清理。删除所有历史记录很简单,只要按照以下步骤操作。 1. 打开谷歌浏览器 首先要启动谷歌浏览器。点击右上角的三个点,进入主菜单。 2. 进入历史记录界面 在菜单中找到“历史…...
计算机三大主流操作系统的前世今生 - Linux|macOS|Windows
全文目录 1 引言2 起源之路2.1 Linux 起源2.2 macOS 起源2.3 Windows 起源 3 综合解析3.1 Linux系统综合解析3.1.1 系统定义与核心架构3.1.2 发展历程3.1.3 核心特点3.1.4 主流发行版3.1.5 应用场景 3.2 macOS系统综合解析3.2.1 系统定义与核心架构3.2.2 发展历程3.2.3 核心特点…...
大数据学习栈记——Hive4.0.1安装
本文介绍大数据技术中数据仓库Hive的安装配置,版本:Hive4.0.1,Ubuntu24.04。 Hive简介 Hive由 Facebook 开源用于解决海量结构化日志的数据统计工具。 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据…...
8.Excel:数据验证和下拉列表
一 数据验证 1.作用 限制用户输入单元格的值。 补充:数据验证要先设置验证才会起作用,对于已经填写完成的表格来说,可以快速找到不符合的数值。 选中整列,然后设置数据验证。 然后圈释无效数据,不符合的会被圈出来 2.如…...
【机器学习-线性回归-4】线性回归中的最优解:从数学原理到实践应用
在机器学习的世界里,线性回归就像是一把瑞士军刀——简单却功能强大。无论是预测房价、分析销售趋势,还是研究变量间的相关性,线性回归都是数据科学家首选的入门算法。但你是否曾好奇过,这个看似简单的算法背后,是如何…...
《代码整洁之道》全书归纳
如果要把这本书最关键、最核心、被反复提及和强调的重点提炼出来,那就是: 可读性高于一切: 你的代码是给人读的,让它像一篇清晰的文章一样易于理解。表达意图是关键。短小、单一: 函数要短小,类要短小&…...
项目代码生成工具
代码生成工具 文章目录 代码生成工具提取公共类domainbodtoentityvoBean基类 代码生成工厂连接配置模版1、基础类基类Entity添加DTO类分页查询DTO基础查询DTO修改DTO视图VO 2、controller2、service接口3、service实现类4、Mapper接口5、Mapper的xml文件 提取公共类 比方说每个…...