哈, 上来求个答案,我想了解下大家通常怎么处理

中山野鬼 发布于 2014/06/08 18:42
阅读 2K+
收藏 4

为了简单点,就随便举个例子。一个学校的管理系统。管什么暂且不说,主要关注问题。

如果采用面向对象的分类,我们有学生和老师两个类别。

如果采用面向对象的设计,通常每个学生的主体,则对应学生类别,分别形成不同的对象。那么下面两个情况,我想了解下,各位采用“面向对象”设计语言的朋友们,怎么设计:

1、不同具体学生主体仍然存在属性差异,属于城市户口的和外地借读的,他们个体的属性上存在差异。如果将他们对应不同学生类的子类,那么第二个问题就比较复杂点

2、如果一个学生从外地借读的身份变成了城市户口类别,这个对象对应或所归属的子类发生了变化,此时怎么处理?

简单总结下问题:

我们面对学生和老师,自然形成a,b两个类,a是学生类。学生中细分存在不同类别,如果进行子类细分,则有a1,a2分类,面对具体学生s1,s2,则有s1是a1的对象,s2是a2的对象。而当一个具体学生,客观情况变化,其类别从a2演变成a1,这个用面向对象的分析方法和设计语言,该怎么处理?

上述问题如果装b,说深沉点的名字,就是“面向对象分析方法就客观实体的概念转移下的设计难点”,可以写篇论文了。问题的核心是,客观对象是客观存在的,面向对象的设计,类的设计在程序的实现之前,类及类的关系,是相对固化和静态,外部具体客观对象归属的类发生变化下,对程序结构的影响是存在的,如何规避这种影响,使得程序的结构能够更好的动态适应外部情况变化。

加载中
1
首席搬砖工程师
首席搬砖工程师
怎么规避?, 客观对象变化多多少少都会影响到对应的程序结构,不管是面向对象还是其他设计方法,设计得再好也只能减少这种变化带来的影响,面向对象的方法,无非将有可能变化的封装起来,易于修改拓展,将客观变化带来的影响减到最小而已。
1
redraiment
redraiment

你这个例子举得不是很恰当,更恰当的例子是青蛙的变态生长过程:小时候是蝌蚪,有尾巴,用腮呼吸;长大后变成青蛙,没尾巴,用肺呼吸。同一只青蛙(同一个对象)在不同时期表现出的行为不同。

这个问题我在学Java的时候也考虑过,用Java、C++等这种基于“静态类”的面向对象方法很难描述青蛙变态生长过程,因为对象的“类型”在创建的时候已经固定;但诸如JavaScript这种,基于“原型”的面向对象,就能解决这类问题,例如一个对象处于蝌蚪时期,有“tail”这个尾巴方法,当它变成青蛙时,用delete tail就能删除这个方法,同时动态地添加leg等新方法。

在Java中,为了实现类似的效果,可以用状态模式和组合模式来模拟。

1
bigtiger02
bigtiger02
对于这个问题,我想如下方式就能解决。若讲到如何规避这种影响,我想不外乎具体问题是对相应变化进行包装隔离,若这个类是很多地方共用的,那可能就要采取其他策略如适配器等来进行规避了。
class Student{
    private Document doc;
}

class Document{
    private String household;//户籍
    private String studentType;//学籍类型  
}
0
宇皇
宇皇
虽然不明白你在说什么,但是我知道很牛逼
0
雨翔河
雨翔河
没看懂啥意思,可能我太浮躁了。  我就说我看懂了的吧,学生是学生类,老师是老师类。学生有学生的属性,老师有老师的属性。既然是学生那么就应该一个属性记录他是来自哪里的,额,可能我想的太简单了。
0
玄石
玄石
是不是我被某些模式毒害了,我的想法是,数据库表模型怎么建,就怎么用吧,继承也好,聚合也罢,能用就行。
0
中山野鬼
中山野鬼

引用来自“雨翔河”的评论

没看懂啥意思,可能我太浮躁了。  我就说我看懂了的吧,学生是学生类,老师是老师类。学生有学生的属性,老师有老师的属性。既然是学生那么就应该一个属性记录他是来自哪里的,额,可能我想的太简单了。
我的意思是,存在两种学生,分别属于两个类,而实际程序运行中,发现一个学生从一个类变成了另一个类。这个如何处理。哈
Romen
Romen
回复 @风自云 : 单从这个例子来说,我也觉得没有必要。。。可能是我想得太简单。
风自云
风自云
可能我接触的太少,但是我觉得设计之初就不应该让两种学生分属两种(甚至是毫无继承或其他关系两种)不同的类。去写作业了,逃~~~
0
修改登录密码
修改登录密码

既然已经是两个类了,再写一个类转换函数, 把一个对象的属性赋值到另外一个类

然后搞一个运算符重载

0
hackee
hackee

HR系统比你描述的这个例子复杂的多,比如员工分类、转正等等。系统比较成熟了,并且很多是用OO设计的,没任何问题。

0
纠结名字
说那么多是想说明面向对象编程是多么无力吗?就户籍而言,本身就只是一个属性,为什么要设计成两个类?设计有问题,还看什么解决方案?
返回顶部
顶部