首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在创建通用CRUD组件时,使用聚合而不是继承是不是更好?

在创建通用CRUD(增删改查)组件时,使用聚合而不是继承可以更好地实现灵活性和可扩展性。

聚合(Aggregation)是一种对象关联的方式,通过将多个对象组合在一起形成一个更大的对象,实现了对象之间的关联关系。在创建通用CRUD组件时,可以使用聚合来组合不同的功能模块,每个模块负责不同的操作,从而实现更灵活的组件设计。

使用聚合的优势包括:

  1. 灵活性:聚合允许组件由多个独立的模块组成,每个模块可以独立地进行功能扩展和修改,不会影响到其他模块的功能。这样可以更容易地适应不同的业务需求和变化。
  2. 可扩展性:通过聚合,可以将不同的功能模块组合在一起,形成一个更大的组件。当需要添加新的功能时,只需要添加新的模块并与已有模块进行关联,而不需要修改已有的代码。这样可以降低代码的耦合度,提高系统的可扩展性。
  3. 可维护性:使用聚合可以将不同的功能模块进行解耦,每个模块的代码相对独立,易于理解和维护。当需要修改某个功能时,只需要关注该功能所在的模块,而不需要关注其他模块的代码。

聚合在通用CRUD组件中的应用场景包括:

  1. 数据库操作:可以将数据库连接、查询、更新等操作作为一个独立的模块,与其他模块进行聚合,实现对数据库的CRUD操作。
  2. 接口调用:可以将接口请求、响应处理等操作作为一个独立的模块,与其他模块进行聚合,实现对外部接口的CRUD操作。
  3. 表单处理:可以将表单验证、数据处理等操作作为一个独立的模块,与其他模块进行聚合,实现对表单数据的CRUD操作。

腾讯云相关产品中,适用于通用CRUD组件的是云数据库MySQL和云函数SCF。

  • 云数据库MySQL:腾讯云的云数据库MySQL是一种高性能、可扩展的关系型数据库服务,支持标准的SQL语法和丰富的功能,可以用于存储和管理CRUD操作所需的数据。详情请参考云数据库MySQL
  • 云函数SCF:腾讯云的云函数SCF是一种事件驱动的无服务器计算服务,可以将不同的功能模块作为独立的函数,通过事件触发进行聚合,实现对CRUD操作的处理。详情请参考云函数SCF

综上所述,使用聚合而不是继承在创建通用CRUD组件时更好,可以提供更灵活、可扩展和可维护的组件设计。腾讯云的云数据库MySQL和云函数SCF是适用于通用CRUD组件的相关产品。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【吐血推荐】领域驱动设计学习输出

(当然这也有解决方案) A2:继承关系的尴尬实现 继承是面向对象的一个重要特性,关系数据库却难以复现对象世界中的继承关系。 ? 我们来试着还原一下上面的继承关系吧。...「CRUD工程师」认为自己没有创造任何东西,他们只是数据库表的搬运工。如果不是CRUD」,业务系统后端工程师的价值在哪里?...而使用DDD对业务分析的时候,首先会使用聚合」这个概念把关联性强的业务概念划分在一个边界下,并限定「聚合」和「聚合」之间只能通过「聚合根」来访问,这是第一层边界。...虽然这里面最终产生了聚合根、实体、值对象等,但是我们和业务专家沟通的时候尽量不要说这些词汇,比如我们可以说, 招聘这块儿,职位是不是必须经过公司进行管理,那样我们就知道 Job 是属于公司这个聚合根。...一开始,我们写的过程中,时常回想起数据驱动的好,(每次开始一个新东西的时候,是不是很熟悉的感觉?)

96720

【吐血推荐】领域驱动设计学习输出

(当然这也有解决方案) A2:继承关系的尴尬实现 继承是面向对象的一个重要特性,关系数据库却难以复现对象世界中的继承关系。 我们来试着还原一下上面的继承关系吧。...「CRUD工程师」认为自己没有创造任何东西,他们只是数据库表的搬运工。如果不是CRUD」,业务系统后端工程师的价值在哪里?...而使用DDD对业务分析的时候,首先会使用聚合」这个概念把关联性强的业务概念划分在一个边界下,并限定「聚合」和「聚合」之间只能通过「聚合根」来访问,这是第一层边界。...虽然这里面最终产生了聚合根、实体、值对象等,但是我们和业务专家沟通的时候尽量不要说这些词汇,比如我们可以说, 招聘这块儿,职位是不是必须经过公司进行管理,那样我们就知道 Job 是属于公司这个聚合根。...一开始,我们写的过程中,时常回想起数据驱动的好,(每次开始一个新东西的时候,是不是很熟悉的感觉?)

48720
  • CQRS被称为邪教?

    因为DDD提倡富模型,但从资源库查找所有需要显示的数据是困难的,特别是需要显示来自不同聚合类型与实例的数据。领域越复杂,这种困难程度越大。...From CRUD to CQRS[1]文章中,作者比对了CRUD模式与CQRS模式 CRUD 我们传统使用CRUD风格: 这就是经典的CRUD应用模式。...: 2、应用有一个通用的web api层,但业务层分割成两部分: 3、webapi与business都是通用,command和query通用服务中创建 DDD实践指南[2]中也引入了CQRS的元素...即使没有,读写也可以使用不同的优化策略。 总结 可以联想到在数据库架构,也常使用主写从读架构。那是不是也称为CQRS呢? 我们一个应用中,真的同时使用了这两种模型吗?...流行的CQRS不过是为了查询绕开domain的做法,不过是因为domain提炼不到位。 正常的程序,都有读写功能,不需要分成皆然不同的两套模型,就无所谓是不是CQRS了。

    76510

    是谁说MybatisPlus不高级的?

    通过上述代码,我们可以看到,通过继承 MybatisPlus 的接口,我们可以轻松地拥有许多基础的 CRUD 操作和自定义的查询方法,而无需编写繁琐的 SQL 语句。4....6.2 自动填充字段在数据库表中,有些字段的值是自动填充的,例如创建时间、更新时间等。MybatisPlus提供了自动填充字段的功能,可以插入或更新操作自动填充这些字段的值。...执行删除操作,MybatisPlus会将该字段的值设置为逻辑删除的标记值(通常为非零值),不是直接从数据库中删除记录。7....GROUP BY用于分组聚合,它将相同的值归为一组,并对每组进行聚合操作(如计数、求和等)。使用GROUP BY会返回每组的聚合结果,不会对组内的重复值进行去重。...DISTINCT用于去除查询结果中的重复值,它会返回唯一的值,不管这些值属于哪个分组。使用DISTINCT会对所有结果进行去重,不仅仅是某个字段上去重。

    40930

    MyBatis-Plus 对于Mapper和Service的使用

    使用 insert,IService使用 save ;IService 提供了批处理操作的方法, BaseMapper 没有提供相应的批处理操作;IService 依赖于 Spring 容器, BaseMapper...Mapper 层避免混淆泛型 T 为任意实体对象建议如果存在自定义通用 Service 方法的可能,就创建自己的 IBaseService 继承 Mybatis-Plus 提供的基类对象 Wrapper...IService 接口是 MyBatis-Plus 的一部分,提供了一组通用的服务方法,包括常见的 CRUD创建、读取、更新、删除)操作。...Mapper CRUD 接口通用 CRUD 封装BaseMapper接口,为 Mybatis-Plus 启动自动解析实体表关系映射转换为 Mybatis 内部对象注入容器泛型 T 为任意实体对象参数...这种组合使用的方式能够更好地利用 MyBatis-Plus 提供的功能,使代码结构更清晰,同时也便于单元测试和维护。

    3.5K10

    太火了!MyBatis Plus 为啥这么牛?

    特色 无侵入:只做增强不做改变,约会它不会对现有工程产生影响,如丝般顺滑 损耗小:启动即会自动注入基本CURD,性能基本无损耗,直接面向对象操作 强大的CRUD操作:内置通用Mapper,通用服务,仅通过少量配置即可实现单表大部分...CRUD操作,足以强大的条件构造器,满足各种使用需求 支持Lambda形式调用:通过Lambda表达式,方便的编写分类查询条件,无需再担心替换写错 支持主键自动生成:支持多达4种主键策略(内部含分布式唯一...ID生成器-序列),可自由配置,完美解决主键问题 支持ActiveRecord模式:支持ActiveRecord形式调用,实体类只需继承Model类即可进行强大的CRUD操作 支持自定义通用通用操作:支持通用通用方法注入...组件依赖 首先我们要通过Maven♡mybatis-plus开源组件pom.xml文件中加入以下代码: <!...复杂的SQL是不是还是感觉手写好?

    41510

    没错,这就是面向对象编程(设计模式)需要遵循的 6 个基本原则

    换言之,要针对接口编程,不是针对实现编程。...合成复用原则(Composite Reuse Principle[CRP]) ★★★★ 合成复用原则:尽量使用对象组合,不是继承来达到复用的目的。...简言之:复用时要尽量使用组合/聚合关系(关联关系) ,少用继承。 何时使用继承,何时使用组合(或聚合)?...当两个类之间的关系属于 IS-A 关系,如 dog is animal,使用 继承如果两个类之间属于 HAS-A 关系,如 engineer has a computer,则优先选择组合(或聚合)...比如继承 SimpleLogger,然后实现写入文件日志的方法;嗯,没办法 PHP 是单继承的语言; 使用组合模式,将 SimpleLogger 和 FileLogger 聚合起来使用

    79720

    面向对象编程(设计模式)需要遵循的 6 个基本原则

    换言之,要针对接口编程,不是针对实现编程。...合成复用原则(Composite Reuse Principle[CRP]) ★★★★ 合成复用原则:尽量使用对象组合,不是继承来达到复用的目的。...简言之:复用时要尽量使用组合/聚合关系(关联关系) ,少用继承。 何时使用继承,何时使用组合(或聚合)?...当两个类之间的关系属于 IS-A 关系,如 dog is animal,使用 继承如果两个类之间属于 HAS-A 关系,如 engineer has a computer,则优先选择组合(或聚合)...比如继承 SimpleLogger,然后实现写入文件日志的方法;嗯,没办法 PHP 是单继承的语言; 使用组合模式,将 SimpleLogger 和 FileLogger 聚合起来使用

    84140

    设计面向DDD的微服务

    不要为了实施实施,最重要的是使用通用语言编写与业务问题一致的领域代码。 此外仅当您要实现具有复杂业务规则的微服务,才应使用DDD方法,诸如CRUD服务之类的简单职责可以通过更简单的方法进行管理。...直到在下次分解感到服务通信迅速增加。...一个示例是使用Entity Framework Core代码实现存储库模式类: 该存储库模式类使用DBContext将数据持久存储关系数据库中。...总结 DDD中,应用层依赖于领域和基础设施层,基础设施依赖于领域层,但是领域层不依赖于任何层。 只领域层编写业务规则和通用的领域知识,而应用层负责针对软件的目标来组合、协调领域层的业务规则。...领域层的领域实体、值类型、聚合根反映了真实业务的核心,需要用一种通用的语言来定义,这样不管应用层多么复杂,核心领域层自岿然不动。

    65050

    基于ThinkPHP5和Bootstrap的极速后台开发框架

    特性 基于Auth验证的权限管理系统 支持无限级父子级权限继承,父级的管理员可任意增删改子级管理员及权限设置 支持单管理员多角色 支持管理子级数据或个人数据 强大的一键生成功能 一键生成CRUD,包括控制器...前台模块(index)的结构和后台功能类似,具体请参考后台模块的章节 公共模块(common)是一个特殊的模块,默认是禁止直接访问的,一般用于放置一些公共的类或其它模块的继承基类等。...Less主要是用于我们编写LESS和编译成CSS代码 阅读接下来的文档之前最好先简单的了解下RequireJS和Bower,jQuery是我们必须要掌握的工具库 FastAdmin中前端的最常用的第三方插件有...数据库 这里提供的是数据库表字段规则在你创建使用,当按如下的规则进行字段命名、类型设置和备注 使用php think crud -t 表名生成CRUD时会自动生成对应的HTML元素和组件 源码下载...【免责申明】本公众平台不是广告商,也没有为其他三方网站或者个人做广告宣传。此分享的源代码和文章是小编在项目中、学习中整理的一些认为不错的项目。用户产生的一些自愿下载或者付费行为。与平台没有直接关系

    2.8K50

    2022年了有哪些值得推荐的.NET ORM框架?

    这个库的目标是通过不需要任何属性或基类继承来保持你的 POCO 纯净。 Dapper-FluentMap - Dapper的扩展。 Dommel - Dapper的CRUD操作。...您可以使用 Chloe.ORM 通过 lambda 查询 LINQ 之类的数据并执行任何操作(加入查询 | 组查询 | 聚合查询 | 插入 | 批量更新 | 批量删除)。...架构上,它比 Dapper、Massive 或 PetaPoco 等微 ORM 高出一步,因为您使用 LINQ 表达式,不是魔术字符串,同时代码和数据库之间维护一个薄抽象层。...它极大地帮助开发人员开发过程中进行上下文切换简化体验。 开源软件——它是一个开源软件,并且永远是免费的。它旨在进一步改进 .NET 数据访问体验和解决方案,以及社区的集体思想。...用于安全执行 CRUD 操作和查询(使用参数)并以强类型方式检索这些查询结果的非常简单的方法。 与您的数据模型一起工作,不会强迫您更改您的类。(包含一个小的反射驱动 ORM 层。)

    5.9K11

    编码最佳实践——接口分离原则

    更好的办法是尽早采用防御方式进行编程,以此阻止其他开发人员(包括将来的自己)无意中使用你的接口做出一些不该做的事情。...,看上去也许有些反常(接口的分离的目的不是再次把它们统一单个实现中)。...常用于接口的叶子实现类,也就是说,既不是修饰器也不是适配器的实现类,而是完成工作的实现类。叶子实现类上应用这种方式,是因为叶子类中所有实现的上下文是一致的。...= new CreateReadUpdateDelete(); return new OrderController(crud,crud,crud); } 超级接口反模式 把所有接口分离得来的接口又聚合在同一个接口下是一个常见的错误...我们都应该在创建任何接口牢记接口分离这个技术原则,而且最好是从一开始就应用接口分离原则。 参考 《C#敏捷开发实践》 -----END-----

    78040

    推荐超好用的 6 款 Laravel Admin 管理模版

    码匠为大家介绍一些受欢迎选项的具体功能前,让我们先了解 Laravel Admin 模板五个不同的种类,以便结合自身需求更好地做出判断: 脚手架 脚手架主要是通过程序,自动化地创建启动和运行所需的文件和配置来生成...当您的团队有非开发人员,一个可视化的编程平台会是一个不错的选择,但这些软件包通常局限通用功能上。这种类型的后台模板的例子是 Voyager 和 Backpack DevTools。...图片 主要特征 Nova 中向模型添加 CRUD 操作的机制被称为资源,这些是您可以命令行上创建的类似控制器的类,例如要创建一个 Post 资源:php artisan nova:resource...优点 适合编程经验有限的开发者 提供免费视频培训课程,让您快速学习 可以轻松扩展和覆盖默认的控制器 缺点 Laravel 的细粒度配置视觉构建器中是很难实现的 与 Laravel 作为框架不是 CMS...InfyOm Laravel Generator 是由印度开发公司 InfyOm 创建的工具,它是为创建 Laravel 管理网站制作的,可以几分钟内将您所有的模板代码构建起来。

    7.7K41

    DDD领域驱动设计实战(三)- 理解实体

    传统开发人员总将关注点放在数据,不是领域。因为软件开发中,DB占据主导地位。首先考虑的是数据的属性(即数据库的列)和关联关系(外键关联),不是富有行为的领域概念。...由于只从数据出发,CRUD系统是不能创建出好的业务模型的。 可以使用DDD,我们会将数据模型转变为实体模型。 通过标识区分对象,而非属性,此时应将标识作为主要的模型定义。...设计实体,首先考虑实体的本质特征,特别是实体的唯一标识和对实体的查找,不是一开始便关注实体的属性和行为。只有在对实体的本质特征有用的情况下,才加入相应的属性和行为[Evans, p.93]。...那时正值他们将安全处理机制从核心域中分离之际,他们学到了如何使用通用语言来更好地辅助建模。 但如果我们认为对象就是一组命名的类和在类上定义的操作,除此之外并不包含其他内容,那就错了。...领域模型中还可包含很多其他内容。团队讨论和规范文档可以帮助我们创建更有意义的通用语言。到最后,团队可以直接使用通用语言来进行对话,此时的模型也能够非常准确地反映通用语言。

    1.4K32

    鱼和熊掌兼得:同时使用 JPA 和 Mybatis

    本文不是为了告诉你 JPA 和 Mybatis 到底谁更好,而是尝试求同存异,甚至是项目中同时使用 JPA 和 Mybatis。什么?要同时使用两个 ORM 框架,有这个必要吗?...所以,使用 JPA 的项目,人们很少会提到”数据库设计“,人们更关心的是领域建模,不是数据建模。...,领域边界的划分,不是首先着眼于数据库表结构的设计。...大多数场景下,我习惯使用 JPA,例如设计领域对象,得益于 JPA 的正向模型,我会优先考虑实体和值对象的关联性以及领域上下文的边界,不用过多关注如何去设计表结构;增删改和简单查询场景下,JPA...复杂查询场景下,例如 包含不存在领域关联的 join 查询 包含多个聚合函数的复杂查询 其他 JPA 较难实现的查询 我会选择使用 Mybatis,有点将 Mybatis 当做数据库视图生成器的意味。

    2.6K11

    2022年了有哪些值得推荐的.NET ORM框架?

    这个库的目标是通过不需要任何属性或基类继承来保持你的 POCO 纯净。 Dapper-FluentMap - Dapper的扩展。 Dommel - Dapper的CRUD操作。...您可以使用 Chloe.ORM 通过 lambda 查询 LINQ 之类的数据并执行任何操作(加入查询 | 组查询 | 聚合查询 | 插入 | 批量更新 | 批量删除)。...架构上,它比 Dapper、Massive 或 PetaPoco 等微 ORM 高出一步,因为您使用 LINQ 表达式,不是魔术字符串,同时代码和数据库之间维护一个薄抽象层。...它极大地帮助开发人员开发过程中进行上下文切换简化体验。 开源软件——它是一个开源软件,并且永远是免费的。它旨在进一步改进 .NET 数据访问体验和解决方案,以及社区的集体思想。...用于安全执行 CRUD 操作和查询(使用参数)并以强类型方式检索这些查询结果的非常简单的方法。 与您的数据模型一起工作,不会强迫您更改您的类。(包含一个小的反射驱动 ORM 层。)

    3.8K20

    经过实践的一款能够提效 2000% 的低代码(前端中后台)开发工具设计与功能介绍

    由此可见,其逻辑结构是不是都相同的呢,是不是可以抽象出来呢?...,那么就需要在创建页面的时候才能定下来,比如和创建页面的某个属性(页面文件名如 user)有关,那么我们定义接口就可以 ${fileName}/search,那么使用此母版创建页面是即会将 ${fileName...项目母版事前准备好后我们就可以创建一个项目了,从正常开发者角度来看是不是先选一个合适的脚手架然后在此基础上进行开发呢?...为什么不创建项目直接配置呢?因为多个项目这些配置很多都是共通的,提取出项目母版是方便我们进行复制后创建另一个项目直接修改后使用。...自动生成有一种是以大量通用CRUD 为主的项目,那么这类标准功能我们自然不能还要手动每个页面去添加组件又要配置属性,所以自然而然是应该去自动生成,可以节约大量配置时间。

    61320

    使用DDD来构建你的REST API,不是CRUD

    资源被定义为一系列的属性,使用类似JSON Schema或某个具体语言的数据对象来定义,然后生成方法存根,然后来创建,读取,更新和删除该资源。...让我们来谈谈U.通用更新方法允许客户端更新资源的任何字段,然后使用新版本覆盖现有版本。但是,如果允许客户端执行这样的操作,您的服务API在其使用的任何底层数据存储之上,所能提供的价值其实是很小的。...它创建了一种用于描述软件的语言,这种语言是基于被称为实体或聚合的关键的业务对象来描述软件的。...当然,并不是说你必须使用DDD来设计你的REST,但是,由于REST资源可以很好地映射到DDD实体,因此我发现设计REST API特别适合使用DDD。 那么这是什么意思?...这看起来和基本的CRUD API有很大的不同,但关键是允许的操作是特定的和明确的。这为服务实现者以及客户端带来了更好的体验。服务实现不再需要基于哪些属性更新来猜测什么业务操作是隐含的。

    2.1K50

    微信移动端数据库组件 WCDB 系列:iOS 基础篇(一)

    Realm 因其各平台封装、优化的优势,比较受移动开发者的欢迎。对于iOS开发者,key-value的实现直接易懂,可以像使用NSDictionary一样使用Realm。...但其对代码侵入性很强,Realm要求类继承RLMObject的基类。这对于单继承的ObjC,意味着不能再继承其他自定义的子类。同时,key-value数据库对较为复杂的查询场景也比较无力。...SQLite本不是一个易用的组件:为了完成一个查询,往往我们需要写很多拼接字符串、组装Object的胶水代码。这些代码冗长繁杂,而且容易出错,我们希望组件能统一完成这些任务。...这三个宏名称和使用习惯上,也都和定义一个ObjC类相似,以此便于记忆。...链式调用 链式调用是指对象的接口返回一个对象,从而允许单个语句中将调用链接在一起,不需要变量来存储中间结果。

    6.1K31

    Java Spring 框架重要概念整理

    它可以包含业务逻辑或持久化逻辑,但不担当任何特殊角色且不继承或不实现任何其它 Java 框架的类或接口。...比如安全,日志记录,这些都是通用的功能,我们可以把它们提取出来,然后程序执行的合适地方植入这些代码并执行它们,从而完成需要的功能并复用了这些功能。...此层由一系列的 DAO 组件组成,这些 DAO 实现了对数据库的创建、查询、更新和删除(CRUD)等原子操作。...只是 EAO 层主要完成对实体(Entity)的 CRUD 操作,因此简称为 EAO 层。DAO 层 MyBatis 中也被称为 Mapper 层,其通过 SQL 语句的映射完成CRUD操作。...Controller 是 Model 和 View 之间双向传递数据的中间协调者。 视图(View)层主要是由一系列视图模板页面组成,用于展示数据,通常视图依据模型数据创建

    25320
    领券