2011-12-16 5 views
3

Я разрабатываю приложение, в котором используется класс с именем «Правка». Этот класс содержит информацию о том, что пользователь может/не может сделать, а также содержит другие классы, такие как DocumentFilters.Этап проектирования - много ссылок на один и тот же объект

Проблема в том, что у меня есть много разных частей приложения, которые получают экземпляр этого класса через свой конструктор или метод get, чтобы иметь возможность проверить действие пользователя, прежде чем разрешать его. Похоже, это плохая практика (я могу ошибаться). Есть ли способы улучшить это?

Как это работает, основной класс приложения создает класс прав, а затем создает разные компоненты и передает их этим. Компоненты не имеют экземпляра эфира основного класса.

Пример кода. Это повторяется для нескольких модулей.

public class ModuleA{ 
    private Rights rights; 

    public ModuleA(Rights rights){ 

     this.rights=rights; 
    } 
    private boolean verifyRights(ActionEvent e){ 

     if(e.getSource("copyButton"){ 

      if(rights.allowedToCopy){ 
        return true; 
      } 
     return false; 
    } 
} 
+0

У вас может быть правильный вопрос, но я не знаю, какова ваша точная проблема. Можете ли вы привести примерный код, чтобы проиллюстрировать, в чем ваша проблема? –

+0

У меня есть несколько компонентов (классов), хранящих экземпляр того же класса (Права), чтобы получить доступ к одному из его методов и выполнить проверку. Я прошу, если это плохая практика проектирования, и если есть способ сделать ее лучше. – Giannis

+0

Я бы предложил, чтобы дизайн говорил о том, что (и почему) нужно делать с минимальной ссылкой на то, как это делается. То, что вы предлагаете, может быть хорошо для того, как, но пока у вас нет четкого дизайна (что и почему), это не очевидно для меня, у вас есть дизайн, хороший или плохой. –

ответ

0

Это действительный дизайн и называется Inversion of control и более Specificly Dependency Injection. Вы можете попытаться использовать контейнер IoC для java, если вы не хотите вводить свои зависимости вручную.

Также можно разделить защитный код на аспекты, используя AOP. Это более продвинутый вариант, но при этом вы можете отделить код, который проверяет безопасность от реального бизнес-кода.

Если метод, показанный вами, продублирован точно в ваших классах модулей, вы должны извлечь метод в базовый класс. Этот базовый класс затем должен использоваться для всех ваших классов модулей.

public class ModuleBase 
{  
    private Rights rights;  

    public ModuleA(Rights rights) 
    {   
     this.rights=rights;  
    }  

    public boolean verifyRights(ActionEvent e) 
    {   
     /// implementation 
    }  
} 

public class ModuleA : extends Bicycle 
{ 
    public ModuleA(Rights rights) 
    {   
     super(rights); 
    }   
} 
0

Прежде всего, я бы предложил выделить весь код проверки прав на специальный слой. Как правило, здесь полезен паттенд Facade - он может проверять права, а затем перенаправлять запросы на базовую бизнес-логику.

Но это не всегда возможно. В этом случае вам все равно придется предоставлять классы со ссылкой на экземпляр прав. Здесь несколько моделей:

  • Передайте его конструктору/методу (как и вы) - все еще работает.
  • Ввести контекст, который сохранит экземпляр прав и сделает его доступным для необходимых классов. Но контекст действительно полезен, когда он хранит много повторных экземпляров, а не только один.
  • Используйте любую инфраструктуру инъекции зависимостей.

Надеюсь, что это поможет.

+0

Права - это абстрактный класс с подклассами, которые определяют разные наборы прав (скажем, копирование и вставка, только копирование, просмотр и т. Д.).Поэтому, когда происходит событие, которое должно изменить права пользователя, я бы пошел на цикл и установил новые права на каждый из модулей с помощью сеттеров. Это означает, что нужно использовать второе предложение (ввести контекст)? Если да, вы могли бы предоставить дополнительную информацию о том, что вы имеете в виду? ура – Giannis

Смежные вопросы