`

实体类是个什么东西!答金色海洋同学的疑问

阅读更多

其实不想再啰嗦这个问题,但是要回答的东西很多,所以还是另起贴回复了。之前从很多方面来解释了分层,但是对于实体类这个家伙由于是一个一根棒子捅到底的异类,所以引起金同学的疑问,由于涉及到我的另一篇post,所以不得不作出几点说明。

其一,实体类是什么?

这里我做出一个符合大多数系统的定义:实体类就是只有属性且属性与数据库表的列定义一一对应,用途为在各个层次间传递数据的载体。也即是DTO(Data transfor object,大致这么拼写的)数据传输对象,java里叫pojo。那么我认为这个类的定义就是一个数据结构。

那么我们回过头来说数据结构。程序就是 数据结构+算法,这句话算是经典了,那么面向对象的程序里,类就是数据结构+算法的一个集合体,唯一的不同是面向对象提成封装,数据结构为私有,这样子通过方法作为契约来降低类之间的耦合度。但是,这不能从根本上解决问题。程序的数据不是内部 凭空而来,无论是输入还是输出都需要和外部由一个接口,那么这个时候这个接口就是一个耦合点。之前谈耦合的时候估计金同学没认真看,在接口的契约中,应该考虑采用标记耦合

------------无耻的自我引用----------------

标记耦合 :一组模块通过参数表传递记录信息,就是标记耦合。这个记录是某一数据结构的子结构,而不是简单变量。

------------------------------------------

其实实体类就是这个:某一数据结构的子结构。

我们可以认为,数据库的结构也是一种数据结构(从数据结构的广义定义来说,确实是数据结构,数据存储的结构),那么实体类作为数据库表结构在程序中的映射来说也就是一种数据结构了。那么

CreateUser(UserEntity user)

这样子的“接口定义”(注意引号,此接口非彼接口)就是所谓的标记耦合了。

 

再对比一下公共耦合的定义:

------------无耻的自我引用----------------

公共耦合:若一组模块都访问同一个公共数据环境,则它们之间的耦合就称为公共耦合。公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。

------------------------------------------

数据库作为全局的数据结构,自然也够得上公共耦合了,如果要真这么定义那么也没办法解决,这是个无解的问题,要用数据库就比如和这个公共的数据结构耦合。

 

而且,必须注意的一点是,耦合是模块之间的消息传递、数据传递的途径,耦合是中性的,不可避免的

 

所以在这点上努力是纯粹的在做无用功。也即是即使不用实体类,那么数据库的结构变了,也即是数据结构变了,那么修改代码是必然的,不可改变的结构。正如同操作数组做冒泡排序的算法如果把数组换成了hashtable还能正常工作?

 

DataSet,不管强类型的还是弱类型的,DataReader都是要和数据库耦合的,所以这两个和实体类没什么区别。

 

难道我们什么都不做?  答案是否定的

 

就我现在的观点来说,解决之道就是动态。ORM用实体的定义作为契约,动态化了对数据的访问,所以如果数据库发生了变更我们只需要修改实体类和定义,这就大大的减小了对程序的修改。spring动态化了对业务模块的依赖,我们可以很容易的替换业务模块。那么如果数据库发生了变更,在修改实体类和定义的基础上我们只需要数据库修改的表所涉及的业务模块用新的替换掉就ok了。而界面上,动态的表单和数据控件也能够极大的减小修改的幅度。

 

 

这里有一点是需要对金同学说明的:你的控件就算是用事件把一部分业务逻辑的工作剥离出来,但是业务逻辑是和数据耦合的,那么你用什么来让业务逻辑知道你的数据结构?数组?DataReader?DataSet?

表单所以依赖的数据结构变化了,配置变不变?所谓配置也就是程序的一个延续,我认为配置其实就是一种外置的DSL(见 why xml sucks

修改配置文件和修改程序,很多时候由一个误解认为修改xml文件比修改程序好,殊不知xml文件的修改没有经过编译时的检测,而程序是通过了编译时检测的,修改xml的出错几率比修改程序高100倍(这点我好像在 why xml sucks 里头漏掉了)。

说回来,数据表的结构变化了,其实还是会涉及到对界面的修改,只不过你的控件把这个修 改从页面文件剥离出来,改成了修改配置文件(或者配置数据)。如果没有工具来完成配置的工作,出错的几率比修改页面高得多,且debug也复杂得多。

 

 

还有一点要对回复金同学疑问的一些同学说的:好多同学对spring的理解委实有很大的偏差。spring是一个ioc容器+aop容器+抽象服务的集合体,当然我们用的最多的是前两者。很多同学吧ioc和aop弄混了。ioc是依赖注入的概念,其实也就是对虚拟工厂模式和代理模式的实现,而aop是方法切片,也就是在调用方法的前面和后面动态的植入另外的要执行的代码(其实也就是方法)。



 


分享到:
评论

相关推荐

    C#实体类生成器!!!!!!!!!

    因此,"C#实体类生成器"这样的工具应运而生,以自动化这个过程,提高开发效率。 实体类生成器是开发者用来快速生成与数据库表对应的C#类的工具。这些类通常包含属性,每个属性对应数据库表中的字段,以及可能的方法...

    C#实体类和实体类集合的自动排序

    首先,让我们了解什么是实体类。实体类是代表数据库表或服务API中的一个记录的类。它通常包含与表字段相对应的属性,并可能有一些方法来处理该对象的状态。例如,一个用户实体类可能有ID、用户名、密码等属性。 接...

    自动生成实体类工具!!!!

    呵呵经历了一天时间写完的,呵呵!!希望对大家有帮助!!!

    java实体类字段自定义-数据库字段和程序实体类属性不一致解决方案.docx

    例如,实体类中有一个字段名为 "userName",而数据库表中的字段名为 "USER_NAME"。这种情况下,需要实现实体类字段的自定义,以便与数据库字段保持一致。 二、解决方案 解决 Java 实体类字段自定义问题的思路是...

    GreenDao保存实体类套实体类

    本示例“GreenDao保存实体类套实体类”旨在演示如何在GreenDao中处理嵌套的实体类,即一个实体类包含另一个实体类的情况。 首先,我们需要理解GreenDao的基本工作原理。GreenDao通过生成Java源代码来提供对数据库的...

    C#自动生成实体类

    3. **实体类生成**:有了数据库表的详细信息,工具将生成C#代码,每个表对应一个类,每个列对应类的一个属性。对于主键,可能会添加特殊的标识符;对于外键,可能生成导航属性来表示关系。此外,还可能根据需求生成...

    c#实体类生成源码(winform)!!!

    c# 实体类生成源码c# 实体类生成源码c# 实体类生成源码c# 实体类生成源码c# 实体类生成源码

    实体类&SQL生成工具

    实体类和SQL生成工具是一种高效开发辅助工具,它能够帮助程序员快速地生成各种编程语言(如VB、C#、Java)中的实体类,并自动生成对应的SQL语句,极大地提高了开发效率,减少了手动编写代码的工作量。 实体类是面向...

    C# .net数据库表实体类生成,一键生成数据库所有表的实体类

    为了解决这个问题,开发者需要自定义解决方案,例如创建一个数据库实体类代码生成器。 本文将详细介绍如何利用C#和.NET来创建这样一个工具,以便快速生成数据库表的实体类。首先,我们需要连接到数据库并获取其架构...

    实体类生成器

    这时,弹出一个编辑实体类窗体,在这里可以对即将要生成的实体类信息进行检查并修改信息。 11.修改完毕后,点击生成。完毕后提示生成成功! *备注:程序中每一步都有相对应的必要检测,当用户选择不符合必须选择或...

    自动创建实体类

    在软件开发过程中,尤其是涉及到与数据库交互的应用程序,实体类(Entity Class)是常见的概念,它们代表了数据库中的表,并提供了对象-关系映射(ORM)的基础。实体类允许开发者用面向对象的方式来操作数据,而无需...

    XML文件与实体类的互相转换

    "XML文件与实体类的互相转换" XML文件与实体类的互相转换是软件开发中的一种常见需求,特别是在调用别的平台接口时,通常都是返回XML数据,然后需要将这些数据转换成实体,以便于更方便的操作。下面将详细介绍XML...

    java项目实体类转换实例

    在Java项目中,实体类转换是指将一个实体类对象转换为另一个实体类对象的过程。在这种情况下,我们可以使用Dozer库来实现实体类转换。Dozer是一个开源的Java类库,用于将一个Java对象转换为另一个Java对象。下面我们...

    C#数据实体类中如何给属性赋值

    在这个例子中,我们定义了一个名为`Class1`的实体类,它包含两个属性:`IntTemp`和`StrTemp`。 ```csharp public class Class1 { private int intTemp; public int IntTemp { get { return intTemp; } set { ...

    Java实体类字段生成工具类-将数据库表列字段转为Java实体类驼峰字段

    为了解决这个问题,开发了这个Java实体类字段生成工具类。 2、该工具类可以将数据库表列字段转化为对应的Java实体类字段。生成的实体类字段格式清晰易读,且符合Java命名规范。通过使用该工具类,可以大大提高开发...

    mysql自动生成实体类

    "mysql自动生成实体类"就是这样一个工具,它能够帮助开发者快速地根据MySQL中的表结构生成对应的Java实体类,极大地减少了手动编写代码的工作量。 生成实体类的主要目的是实现对象关系映射(Object-Relational ...

    SqlSugar生成实体类Demo

    本示例“SqlSugar生成实体类Demo”将重点介绍如何利用SqlSugar的T4模板生成实体类,以及进行基本的CRUD(创建、读取、更新、删除)操作。 首先,我们要理解什么是T4模板。T4是Visual Studio提供的一种文本模板技术...

    实体类生成器,用于C#实体类生成

    在C#编程中,实体类(Entity Class)是表示...总的来说,实体类生成器是C#开发中的一个重要工具,它帮助开发者快速创建和维护实体类,提高开发效率。正确选择和使用实体类生成器,能有效提升项目的开发质量和速度。

    C#数据库实体类生成工具

    实体类是面向对象编程中的一种设计模式,它代表数据库中的一个表,每个属性对应表的列,使得开发者可以更方便地进行CRUD(创建、读取、更新、删除)操作。通过自动化的实体类生成工具,开发者无需手动编写这些类,极...

    .net实体类自动生成工具

    首先,我们要理解什么是实体类。在面向对象编程中,实体类是对现实世界中具有独立存在意义的对象的抽象。在数据库应用中,这些对象通常对应于数据库表的记录,每个类的实例代表一条记录,类的属性则对应表的字段。...

Global site tag (gtag.js) - Google Analytics