2021年12月25日 星期六

4.2. 使用requires和requires transitive

使用requires some-module表示當前模組依賴於指定的some-module。若使用 requires transitive some-module表示任何需要當前模組的模組也將依賴於some-module。單字transitive可以解釋為「可傳遞的」,意思大概就是把這層依賴關係也傳遞出去。

這樣的現象在開源的程式設計裡其實相當常見。若模組B在開發過程中引用了模組C;當模組A要引用模組B時,自然也會需要模組C。因此B依賴C的關係,傳遞給A後變成A除了依賴B之外也要依賴C。原本的模組資訊檔使用requires時可以編寫為:

module B {
    exports B;
    requires C;
}
module A {
    requires B;
    requires C;
}
若使用requires transitive則可以簡化為:
module B {
    exports B;
    requires transitive C;
}
module A {
    requires B;
}

以上假設模組和套件同名。另外,只是模組資訊檔可以簡化,模組A依然需要模組B與模組C的函式庫。

相似的概念,我們可以將zoo專案的4個模組全部重新檢視。

1. 修改模組zoo.animal.feeding

模組zoo.animal.feeding是最基本的,沒有變動:

module zoo.animal.feeding {
    exports zoo.animal.feeding;
}

2. 修改模組zoo.animal.care

模組zoo.animal.care原本是:

module zoo.animal.care {
    exports zoo.animal.care.medical;
    requires zoo.animal.feeding;
}
將行3修改如下。以後任何模組使用到模組zoo.animal.care都不需要在模組資訊檔內參照模組zoo.animal.feeding,我們將在下個模組驗證這個結果:
module zoo.animal.care {
    exports zoo.animal.care.medical;
    requires transitive zoo.animal.feeding;
}

3. 修改模組zoo.animal.talks

模組zoo.animal.talks原本是:
module zoo.animal.talks {
    exports zoo.animal.talks.content;
    exports zoo.animal.talks.media;
    exports zoo.animal.talks.schedule;
    requires zoo.animal.feeding;
    requires zoo.animal.care;
}

簡化時可以直接移除原本行5,並把行6requires也改為requires transitive,以後任何模組使用到模組zoo.animal.talks都不需要在模組資訊檔內參照模組zoo.animal.care

module zoo.animal.talks {
    exports zoo.animal.talks.content to zoo.staff;
    exports zoo.animal.talks.media;
    exports zoo.animal.talks.schedule;
    requires transitive zoo.animal.care;
}

4. 修改模組zoo.staff

模組zoo.staff原本如下:

module zoo.staff {
    requires zoo.animal.feeding;
    requires zoo.animal.care;
    requires zoo.animal.talks;
}
簡化後可以去除兩個requires敘述:
module zoo.staff {
    requires zoo.animal.talks;
}

沒有留言:

張貼留言