Java, имея дело с разрешениями Objects - PullRequest
0 голосов
/ 07 ноября 2011

Несколько дней назад я получил задание на создание (любительской) модели моего курса в университете и системы управления студентами (только основная программа, без графического интерфейса).Мне удалось создать почти все, кроме одной части, разрешения.Я понятия не имею, с чего начать.Так что в классе Course есть множество методов, но каждый из них должен работать по-своему.Например, если студент хочет записаться на курс, срок подачи которого истек, он может зарегистрироваться только в том случае, если профессор добавит его вручную.Я настроил метод, который проверяет даты и возвращает ошибку, если студент пытается зарегистрироваться слишком поздно.Но, если объектный профессор назвал бы этот метод, он мог бы «переопределить правила».Мой профессор сказал мне подумать об использовании интерфейсов, но я уже некоторое время бьюсь головой о стену, и я до сих пор не знаю, как использовать интерфейсы для установки разрешений.вопрос.Каков наилучший способ в Java для создания и контроля разрешений.Если это интерфейс, как именно я могу использовать интерфейс для этого?

Ответы [ 4 ]

2 голосов
/ 07 ноября 2011

Возможно, вам потребуется предоставить дополнительную информацию о том, как система знает, кто выполняет каждый метод в вашей системе.Я предполагаю, что вы передаете объект User, который представляет, кто вызывает метод (есть и другие способы, но это иллюстрирует суть, не говоря о большой архитектуре, которую вы могли бы или не могли использовать / нуждаться).

Несколько замечаний: пользователь не зависит от профессора, студента и т. Д. Пользователем может быть конкретный класс или интерфейс, который реализуют профессор, студент и т. Д.Вы не хотите связывать свою систему разрешений с Профессором и Студентом, потому что ваши сопоставления разрешений не могут измениться, если вы это сделаете.Это означает, что если позднее вы захотите разрешить, например, TA или аспиранту переопределять правила добавления учащихся, вы не сможете изменить эти сопоставления разрешений без изменения кода.Поэтому всегда используйте «глаголы» или действия для разрешений.Отобразите набор разрешений для пользователя, затем не проверяйте, чтобы типы пользователей использовали эти глаголы для включения функциональности.

2 голосов
/ 07 ноября 2011

Что если бы у вас был интерфейс, метод

public void studentEnroll(Student s);

и другой интерфейс на процессорах, доступ к которому был бы

public void professorEnroll(Student s);

Существует так много способов сделать это.Я предлагаю вам подумать о том, каким было бы самое простое решение.

1 голос
/ 07 ноября 2011

У вас может быть такой дизайн:

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 голосов
/ 07 ноября 2011

Я нахожу, что люди часто путают классы / актеров внутри системы с людьми / актерами вне системы: они скажут, что «Мы не можем доверять классу ученика, чтобы он держал денежный баланс студента, посколькудоверяйте (человеческим) студентам этим; они могут лгать!Помните: вы контролируете код, который вы вводите в класс ученика, и что он делает.Фактические студенты не программируют экземпляры, которые представляют их.То же самое для класса «Профессор».

Итак, в общем, вы навязываете безопасность и разрешения на основе процесса, который вы разрабатываете.IE: Как вы определяете и используете методы ваших классов.

Ваша система должна знать, записывается ли ученик в класс напрямую или же его зачисляет профессор класса.Как правило, это подразумевает, что система должна знать, является ли человек, вошедший в систему в данный момент, студентом или профессором.Возможно, имеет смысл предоставлять профессорам разные экраны, которые вызывают разные методы.

В рабочем коде я, вероятно, использовал бы локальное хранилище потоков для отслеживания разрешений текущего пользователя.Но это, вероятно, немного для студенческого задания.

Честно говоря, я не понимаю, как могло бы помочь введение интерфейсов Java.Тщательное размышление об используемых вами интерфейсах (методах) и о том, когда вы их используете, вероятно, поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...