2016-01-20 3 views
1

Циклы существуют между пакетами, когда существуют зависимости использования или импорта вида между классами в этих пакетах.Что это значит и как исправить проблему сонара Java? «Циклы между пакетами должны быть удалены» (squid: CycleBetweenPackages)

Рассмотрим следующий пример. Пусть есть 4 класса: Truck и интерфейс Car в org.example.car пакет и Navigation и CPU в пакете org.example.part. В пакетах org.example.car и org.example.part мы используем отношения между классами Truck --> Car и классами Navigation --> CPU. Предположим, что класс Truck использует класс Navigation, поэтому у нас есть связь между пакетами org.example.car --> org.example.part. Тогда предположим, что класс CPU также использует интерфейс Car, который дает нам соотношение между пакетами org.example.part --> org.example.car. Хотя класс Navigation не использует класс пакетов org.example.car, у нас есть цикл соседних классов в пакетах (CPU класс).

Этот пример представлен на рисунке ниже:

dependency-cycles-in-packages

Когда несколько пакетов участвуют в цикле, это означает, что эти пакеты высоко в сочетании, и не существует никакого способа повторного использования/извлечения одного из тех, пакетов без импорта всех других пакетов. Такой цикл может быстро увеличить усилия, необходимые для поддержания приложения и принятия изменений в бизнесе.

+0

И в чем ваш вопрос? Я имею в виду, что вы одновременно отправили «вопрос» и «ответ». – SubOptimal

+0

@SubOptimal Я думаю, что главный вопрос: «как исправить»; «что это значит», кажется, очень хорошо охвачено. –

+0

Возможно, это сообщение объясняет, по крайней мере, «что это значит» http://www.sonarqube.org/fight-back-design-erosion-by-breaking-cycles-with-sonar/ – SubOptimal

ответ

2

Чтобы исправить цикл зависимостей в ваших пакетах, вы должны ввести дополнительный пакет и переместить пару зависимых классов/интерфейсов в этот вновь созданный пакет.

Это представлено на рисунке ниже:

dependency-cycles-fixed

В нашем примере, давайте решили переместить интерфейс Car вновь созданного пакета org.example.api. Это нарушает цикл зависимостей и снижает технический уровень в нашем приложении. Теперь все пакеты имеют зависимости только одним способом, и при необходимости их можно разбить на разные артефакты.

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

  • Нет связанных вопросов^_^