私はしばらくの間、Sonar コード品質管理プラットフォームを使用してきましたが、ほとんどの場合、コード ベースの隠れた設計上の欠陥を明らかにするのに非常に役立ちます。
しかし、ヘルプよりも厄介なルールが 1 つあります。それは、「循環パッケージ参照」違反のチェックです。
パッケージ間のこのような依存関係がどこで悪いのかを完全に理解していると思います。たとえば、典型的な 3 層のプレゼンテーション/サービス/パーシステンス レイヤー設計では、ほとんどの場合、データベース処理コードに UI 関連クラスへの参照を持たせることはお勧めできません。「違反」と呼んでも問題ありません。
しかし、IDE ライクなアプリケーションの設計など、他のケースを考えてみましょう。たとえば、アプリケーションのビューを参照するメソッドをApplication
定義するインターフェイスを含むメイン パッケージがあるとします。List<View> Application.getViews()
ただし、View
インターフェイスにApplication getApplication()
親アプリケーションを参照するメソッドがある場合 (これは非常に一般的な設計だと思います)、各インターフェイスがそれぞれ 、com.myapp.ui
、および で区切られていれば、循環参照が導入されcom.myapp.ui.view
ます。
もちろん、View
インターフェイスを に挿入しcom.myapp.ui
てサイクルを断ち切ることもできます。しかし、ビューに関連するさまざまな API が にある場合、それらの多くは、、などcom.myapp.ui.view
の別の抽象 APIです。管理目的でそれらを別のパッケージに保持する方が賢明ではないかと思います。AbstractView
ContentView
AbstractContentView
com.myapp.ui.action
そして、上記のアプリケーションには、 、 などのような他の多くの同様のケースがあると考えてください。それらをすべてそこに入れると、パッケージcom.myapp.ui.perspective
が本当に混雑します。com.myapp.ui
では、このような状況に対処するためにどのようなアプローチをお勧めしますか? 本当にすべての循環パッケージ参照は悪いことですか? または、彼らと一緒に暮らす必要がある場合、問題のある実際のサイクルのみをチェックするように Sonar をどのように設定しますか?