0

次のパッケージ構造があると仮定しましょう

some.package
    |-aaa.private
    |-aaa.public
    |-bbb.private
    |-bbb.public

私のアーキテクチャでは、 からの呼び出しのみを行い、その逆も同様であり、some.package.aaa..*からの呼び出しのみを行う必要があります。つまり、「メジャー」パッケージの境界 (たとえば、aaa から bbb まで) を横断する場合、他のメジャー パッケージのルートにあるパブリック パッケージの呼び出しのみを許可したいということです。some.package.bbb.public..*some.package.bbb..*some.package.aaa.public..*

この規則に違反するすべての Joinpoints を選択する AspectJ Pointcut を定義することは可能ですか? つまり、書きたい場合

declare error: inSomeMajorPackage() && callingNonPublicPackageOfOtherMajorPackage() :
    "Please make calls only to public interfaces of other major packages";

このルールを強制するように、これらの 2 つのポイントカットを定義する方法はありますか?

4

2 に答える 2

0

特定のパッケージの依存関係を強制または阻止したい場合は、JDepend を使用した別のアプローチを使用できます。方法についてはこのブログ投稿を参照してください。ただし、基本的には、次のようなテストを作成する必要があることを意味します。

@Test
public void verifyDependencies() {
    thisPackage()
        .dependsOn("my.super.fantastic.package")
    .andOn("my.sortof.ok.package")
    .andItShouldNotDependOn("that.pesky.vendor.package")
    .orOn("my.very.bad.package");

    assertItHasAllAndNoOtherDependencies();
}

別の回答へのコメントで述べたように、これは実際にはスケーリングしませんが、データを CSV、Excel、または同様のファイルに入れ、そのデータを使用して依存関係を適用できます。

商用化したい場合は、Structure 101をご覧ください。ただし、お金を払う価値はないと思います。

また、言い忘れていましたが、パッケージ間に循環的な依存関係 (相互に依存する aaa.public と bbb.public) がある場合は、設計に欠陥があることを意味します。

于 2013-08-12T18:06:43.600 に答える