2 u014075041 u014075041 于 2014.12.15 09:46 提问

一个查询功能,管理员,教师,专家,查询的结果不同,应该如何设计代码
问题描述如下:
                查询学生的信息。管理员可以查询所有人的信息。教师只能查询自己班级的信息。专家只能查询自己负责班级的信息。
                现在代码结果,我在一个方法中做判断,这样查询也可以得到查询结果。但是我觉得,这样做的话,如果其他的功能中也有相似的权限设置,又要查询一次,也不符合面向对象的设计原则 。请帮忙解答,不盛感激!

3个回答

lowanty
lowanty   2014.12.15 09:59

重新抽象对象设计,从你的描述中,可以这样抽象:被管理对象有:学生、班级(学生分组)。管理对象有:教师、专家。
我们可以这样设计数据结构:班级表:保存基本班级信息
学生表:包含学生基本信息 以及 学生所属班级
教师表:包含教师基本信息 以及 教师管理的班级信息(一个教师一个班级直接存于主表、多个可以根据实际情况考虑字表)
专家表:设计类似教师表。

此时查询时:只需要从教师或者专家对象上获得 管理范围内的班级,然后查询学生表 班级字段是管理范围内的所有 学生,就可以了。

u014075041
u014075041 回复lowanty: 我明白了。我一直想把判断用户这个去掉。其实这个不能去掉。必须有这个判断,才能调用对应的方法。恩。把教师,专家,管理员抽象出一个对象,用简单工厂创建出相对应的对象,得到结果接口相同。就可以直接调用对应的方法。我本来是想着可不可以用面向切面编程的方法实现。我还是没有想到。
接近 3 年之前 回复
lowanty
lowanty 回复u014075041: 你只需要设计两个方法就可以了。一个getStudent(班级数组);一个getAllStudent();这样把判断交给前置服务、甚至页面去处理,你设计的方法就是职能单一的
接近 3 年之前 回复
u014075041
u014075041 谢谢你。我问题可能是表述不清楚。我举一个例子吧。如果我现在是管理员,我查询的时候,要查询所有的,我访问的方法getStudent,我在这个方法中先判断是不是管理员,如果是的话,我就调用这个查询所有的查询语句。如果我是教师的话,我也是查询这个getResult方法,也是先做判断,然后调用对应的查询SQL。但是呢。我现在想把这个判断能不能不放到这个方法中。因为,像查询教师的话,也是做类似的if-else判断。在面向对象中有职责单一的原则。我是在想如果遇到这样的问题,有没有可能使用其他的处理方式。
接近 3 年之前 回复
guwei4037
guwei4037   Ds   Rxr 2014.12.15 10:04

用中间表做个关联,设置不同人员对应的班级人员的对应关系。然后登陆的时候查询加载不同的人员。

u014075041
u014075041   2014.12.15 11:29

我刚才说的不对。两个用的同一个方法getStudent。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!