2011-11-07 2 views
0

며칠 전에 나는 내 대학 과정과 학생 관리 시스템 (핵심 프로그램, GUI는 없음)의 (아마추어) 모델을 만드는 과제를 얻었다. 나는 한 부분을 제외한 거의 모든 것을 만드는 데 성공했다. 나는 이것을 어디에서 시작할지 전혀 모른다. 수업 강좌에는 다양한 방법이 있지만 각각의 방법이 다르게 작동해야합니다. 예를 들어 학생이 등록 마감일이 지났던 코스에 등록하고 싶다면 교수가 수동으로 추가하면 등록 할 수 있습니다. 학생이 너무 늦게 등록하려고 시도하면 날짜를 확인하고 오류를 반환하는 메서드를 설정합니다. 그러나 객원 교수가 그 방법을 부르면, 그는 '규칙을 무시'할 수 있습니다. 교수님은 인터페이스 사용에 대해 생각해 보라고 말씀 하셨지만 잠시 벽에 머리를 두드 리면서 인터페이스를 사용하여 권한을 설정하는 방법을 모릅니다.
EDIT : 나의 사과, 나는 질문을 잊었다. 무슨 권한을 생성하고 제어하는 ​​자바에서 가장 좋은 방법입니다. 인터페이스가 될 경우 인터페이스를 사용하여이를 정확히 수행 할 수 있습니까?자바, 객체 다루기 권한

답변

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 Student가 학생 추가 규칙을 무시하도록 허용하려는 경우 코드를 수정하지 않고는 해당 권한 매핑을 변경할 수 없습니다. 그래서 항상 '동사'또는 사용 권한을 사용하십시오. 사용 권한 집합을 사용자에게 매핑 한 다음 확인하지 않음 사용자 형식은 해당 동사를 사용하여 기능을 사용하도록 설정합니다.

2

당신은 인터페이스에게 당신이 할 수있는 많은 방법이 있습니다

public void professorEnroll(Student s); 

인 액세스 할 수있는 프로세서의 방법

public void studentEnroll(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 인터페이스를 도입하는 것이 도움이되는지 알 수 없습니다. 당신이 사용하는 인터페이스 (방법)에 대해 신중히 생각하면 아마도 도움이 될 것입니다.