Я использую платформу управления качеством кода Sonar в течение некоторого времени, и в большинстве случаев я нахожу ее очень полезной для выявления скрытых недостатков дизайна моей кодовой базы.
Однако есть одно правило, которое меня больше раздражает, чем помогает, и это его проверка на наличие нарушений «циклической ссылки на пакет».
Думаю, я полностью понимаю, где такая зависимость между пакетами - это плохо. Например, в типичном трехуровневом многоуровневом дизайне представления/службы/постоянства почти всегда плохая идея разрешить коду обработки базы данных иметь ссылку на классы, связанные с пользовательским интерфейсом. У меня нет проблем с тем, чтобы назвать это «нарушением».
Но давайте рассмотрим другие случаи, например, разработку приложения, подобного IDE. Скажем, у нас есть основной пакет, который содержит интерфейс Application, который определяет метод List Application.getViews() для ссылки на представления приложения.
Однако, когда в интерфейсе View есть метод Application getApplication() для возврата к родительскому приложению, что, как мне кажется, является довольно распространенным дизайном, он вводит циклическую ссылку , при условии, что каждый из интерфейсов разделен в com.myapp.ui и com.myapp.ui.view соответственно.
Конечно, вы можете просто поместить интерфейс View в com.myapp.ui, чтобы разорвать цикл. Но если в com.myapp.ui.view есть различные другие APIS, связанные с представлением, многие из них являются другими абстрактными API, такими как AbstractView, ContentView, AbstractContentView и т. д. Интересно, не целесообразнее ли хранить их в отдельных пакетах для целей управления.
И учтите, что указанное приложение имеет много других подобных случаев, таких как com.myapp.ui.action, com.myapp.ui.perspective и т. д., что действительно сделало бы Пакет com.myapp.ui переполнен, если мы собираемся поместить их все туда.
Итак, какой подход вы предлагаете, чтобы справиться с такой ситуацией? Действительно ли каждая циклическая ссылка на пакет — это плохо? Или, если мне придется с ними жить, как настроить Sonar для проверки только реальных проблемных циклов?
Спасибо!