onlyliuxin / coding2017

216 stars 641 forks source link

[实体类] 怎么用上 [面向]对象]的原则? #455

Open hiei17 opened 7 years ago

hiei17 commented 7 years ago

实体类就是和数据库对应的那个类,每个field都和数据库同名的表一一对应 里面只有get set方法 构造方法 实际上就是个数据结构而已 根本不像一个对象

我们学的那些面向对象设计原则 怎么用上?

lanyuanxiaoyao commented 7 years ago

关于这个问题我似乎以前也有过类似的想法,所以现在重新理一下思路,我想要分享的观点有以下几点

实体类就不能是对象吗?

事实上,面向对象编程仅仅只是一种思想,面向对象编程并没有规定了我们应该怎么怎么写代码,代码应该是怎么样的形式,也没有规定一个类中必须有什么元素。
一个类是不是一个我们认为的一个对象并不是因为这个代码里面写了哪种形式的代码,而在于我们设计它的时候是不是把它当做一个对象,所以实体类为什么就不能是一个对象呢?有没有物体是只需要属性(getter/setter方法)就已经可以完整表示了呢?当然有,比如“硬币”这个对象,只需要面值(或者还有年份,币种,但这无关紧要)就可以完全表达了这个对象的所有属性,而且也不需要有动作,那它是不是一个对象呢?当然是,如果存进数据库,那显然只需要一个传统的实体类就可以表达

逻辑上的对象只能对应一个类吗?

我们来设想一种情况:我们的数据库在映射实体类的时候,必须是要映射到由数据库生成的特定的实体类,类中只有数据库字段对应的属性,而且我们不能增加或者修改这个实体类的任何代码。好了这个时候,如果我们定义了一个“学生(Student)”的对象,那么就会由数据库自动生成一个Student.java的实体类,里面只有getter/setter方法。
很明显,我们的“学生”对象显然不能只有几个基本属性,还要有动作,比如“吃饭”,“睡觉”之类的,那我们显然只能另外再写一个类来实现这些动作,比如StudentBehavior.java,那么好了,这个时候,学生对象是Student.java吗?我认为,Student.java和StudentBehavior.java合起来算是一个“学生”对象。
这个例子就应该很好得说明了对象的概念并不局限于某一个特定的类。

总结

所以面向对象中的对象,就只是一个抽象的概念,而一个Java中的类是不是一个对象,看的是你对这个Java类的设计和抽象是不是符合一个对象,几个类组合成的抽象概念是一个对象,那么这几个类就是一个对象,而你操作的目标就是这几个类合起来的那个抽象的对象,而不是具体的类。
回到问题,事实上如果要让这些个实体类成为那种“一个类一个对象”的形式的话,只需要在实体类里面写具体方法就可以了,Java主流的这些数据库都是允许这样做的。

以上仅为个人观点,欢迎讨论,如有疏漏或错误请务必@我并指点出来!