几天前,我得到了一份任务,为我的大学课程和学生管理系统(只是核心课程,没有gui)制作(业余)模型。我成功地创造了几乎所有东西,除了一部分,许可。我不知道从哪里开始这个。所以课程课程有很多方法,但每种方法应该有不同的工作方式。例如,如果学生想要参加已经过了报名截止日期的课程,他只能在教授手动添加他的情况下报名。我设置了方法,如果学生尝试注册太晚,它会检查日期并返回错误。但是,如果对象教授会调用该方法,他可以“覆盖规则”。我的教授告诉我要考虑使用接口,但是我一直在撞墙一段时间,我仍然不知道如何使用接口来设置权限。
编辑:道歉,我忘了这个问题。 java中创建和控制权限的最佳方式是什么。如果碰巧是接口,我怎么能用接口来做这个呢?
答案 0 :(得分:2)
如果你有一个接口方法
怎么办?public void studentEnroll(Student s);
并且处理器上的另一个接口可以访问
public void professorEnroll(Student s);
有很多方法可以做到这一点。我建议你试着考虑最简单的解决方案。
答案 1 :(得分:2)
您可能需要提供有关系统如何知道谁在执行系统中每个方法的更多信息。我假设您传递了表示谁正在调用方法的User对象(还有其他方法,但这说明了这一点,而没有讨论您可能使用/可能不需要的许多架构。)
public class Course {
public void enroll( User user, Student student ) {
if( user.hasPermission( Permission.OVERRIDE_COURSE_RULES ) ) {
add( student );
} else if( hasEnrollmentDatePassed() ) {
throw new CourseException( "Enrollment date has passed." );
} else if( isClassFull() ) {
throw new CourseException( "Course is full" );
} else {
add( student );
}
}
}
很少有注意事项:用户不依赖于教授,学生等。用户可以是教授,学生等实施的具体课程或界面。您不希望将您的权限系统与教授和学生联系起来,因为如果您这样做,您的权限映射就不会改变。这意味着如果您以后想要允许TA或Grad学生覆盖添加学生的规则,则无法在不修改代码的情况下更改这些权限映射。因此,请始终使用“动词”或操作来获取权限。将一组权限映射到用户,然后不检查用户类型使用这些动词来启用功能。
答案 2 :(得分:1)
您可以拥有如下设计:
class Course
{
public void enroll(Person actionGenerator, Student student)
{
if ( actionGenerator instanceof Professor )
{
//bypass verification
}
else
{
}
}
}
interface Person
{
/*....*/
}
class Student implements Person
{
public void registerStudent(Course c)
{
c.enroll(this,this);
}
}
class Professor implements Person
{
public void registerStudent(Course c, Student s)
{
c.enroll(this,s);
}
}
答案 3 :(得分:0)
我发现人们常常将系统内的班级/演员与系统外的人/演员混淆:他们会说"我们不能信任学生班来抓住学生和#39;现金余额,因为我们不能信任(人类)学生;他们可以撒谎!"记住:您可以控制放在Student类中的代码及其功能。实际的学生不会对代表他们的实例进行编程。教授班同样如此。
因此,一般来说,您会根据您设计的流程强加安全性和权限。 IE:如何定义和使用类的方法。
您的系统需要知道学生是否直接注册课程,或者课程是否教授正在招收他们。这通常意味着系统必须知道当前登录系统的人是学生还是教授。为教授提供不同的屏幕可能是不合理的。
在生产代码中,我可能会使用线程本地存储来跟踪当前用户的权限。但这对学生的任务来说可能有点多了。
老实说,我不知道如何引入Java接口会有所帮助。仔细考虑您使用的接口(方法)以及何时使用它们可能会有所帮助。