2011-11-07 75 views
0

前几天我得到了一个任务,使我的大学课程和学生管理系统(只是核心程序,没有GUI)的(业余)模型。我成功创造了几乎所有的东西,除了一部分,许可。我不知道从哪里开始。所以班级课程有很多方法,但他们每个人都应该以不同的方式工作。例如,如果学生想要报名参加截止日期已过的课程,他只能在教授手动添加他的情况下才能报名。我设置了方法,该方法检查日期并返回错误,如果学生尝试注册太迟。但是,如果对象教授会调用这种方法,他可以“重写规则”。我的教授告诉我要考虑使用接口,但是现在我一直在撞墙,并且我仍然不知道如何使用接口来设置权限。
编辑:我的道歉,我忘了这个问题。 java中创建和控制权限的最佳方式是什么?如果它恰好是界面,我怎么能使用界面来做到这一点?Java中,处理对象的权限

回答

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); 
     } 
    } 
} 

几点需要注意:用户不依赖于教授,学生等用户可能是一个具体的类或教授,学生等实现一个接口。您不希望将您的权限系统与Professor和Student绑定,因为如果您这样做,您的权限映射无法更改。这意味着,如果您以后想要允许TA或Grad Student说重写添加学生的规则,则无需修改代码即可更改这些权限映射。所以总是使用'​​动词'或动作来获得权限。将一组权限映射到用户,然后不检查用户类型使用这些动词来启用功能。

2

如果你有一个接口的处理器的方法

public void studentEnroll(Student s); 

和另一个接口可以访问哪些是

public void professorEnroll(Student s); 

有很多方法可以做到这一点。我建议你试着想想最简单的解决方案是什么。

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); 
    } 
} 
0

我发现人们经常混淆的类/与人民代表大会制度中的演员/系统外的行动者:他们会说,“我们不能相信学生类来保存学生的现金余额,因为我们可以”不要相信(人类)的学生;他们可以说谎!“记住:您可以控制您在Student类中放置的代码,以及它的功能。实际的学生不编程代表他们的实例。教授课程也一样。

所以,一般来说,您可以根据您设计的过程中施加安全性和权限。 IE:你如何定义和使用你的类的方法。

你的系统需要知道,如果一个学生在一个班招收直接,或者类教授被招收他们。这通常意味着系统必须知道当前登录系统的人员是学生还是教授。为不同的屏幕提供不同的方法,教授可能是有意义的。

在生产代码中,我可能会使用线程本地存储来跟踪当前用户的权限。但是这对于学生作业可能有点多。

老实说,我不明白如何引入Java接口会有所帮助。仔细思考你使用的界面(方法)以及你何时使用它们可能会有所帮助。