аргумент слишком много конструкторов, используя тот же интерфейс с квалификаторами - PullRequest
0 голосов
/ 01 апреля 2020

Это больше похоже на вопрос "хорошей практики".

Допустим, у меня есть интерфейс "MyInterface" и около 15 его реализаций. У меня есть объект с именем «MyProcess», и код выглядит так:

private final List<MyInterface> myInterfaces;

public MyProcess(@Qualifier("impl1") MyInterface impl1,
                 @Qualifier("impl2") MyInterface impl2,
                 @Qualifier("impl3") MyInterface impl3,
                 @Qualifier("impl4") MyInterface impl4,
                 @Qualifier("impl5") MyInterface impl5,
                 @Qualifier("impl6") MyInterface impl6,
                 @Qualifier("impl7") MyInterface impl7,
                 @Qualifier("impl8") MyInterface impl8) {

this.myInterfaces = Stream
            .of(impl1,
                impl2,
                impl3,
                impl4,
                impl5,
                impl6,
                impl7,
                impl8)
            .collect(toList());
    }

Цель - определить различные процессы, используя некоторые реализации MyInterface в определенном порядке c. Проблема в том, что отображается правило сонара S107 (конструктор имеет 8 параметров, которые больше 7 авторизованных). Мне было интересно, если это была проблема структуры кода или я просто должен был игнорировать сонар по этому вопросу. Мне не хочется нарушать SRP, поскольку единственная цель MyProcess - определить список MyInterface, который ему нужен. Кто-нибудь знает, как я могу улучшить этот код? Может быть, другой шаблон для использования?

Заранее благодарим за ваше время

1 Ответ

1 голос
/ 01 апреля 2020

Одной из альтернатив является добавление метода name () в MyInterface, который реализуется в каждом подклассе как возвращающий константу String.

public MyProcess(List<MyInterface> impls) {

  this.myInterfaces = new ArrayList<MyInterface>();
  for(String name: Arrays.asList("impl1", "impl2"...) {
     for(MyInterface impl: impls) {
       if(name.equals(impl.name())) {
         myInterfaces.add(impl); 
       }
     }
  }
}

Мне кажется, что жесткое кодирование имен реализации в процесс может быть не идеальным. Если у вас уже есть 15 реализаций, есть вероятность, что в будущем вам, возможно, придется добавить одну. И тогда вам также потребуется обновить процесс.

Вы позволяете MyInterface возвращать что-то, кроме имени, например, «цель» и «приоритет», чтобы процесс мог автоматически связывать новые реализации в правильное место, но это зависит от вашего варианта использования.

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