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時可以編寫為:

  1. module B {
  2. exports B;
  3. requires C;
  4. }
  5. module A {
  6. requires B;
  7. requires C;
  8. }
若使用requires transitive則可以簡化為:
  1. module B {
  2. exports B;
  3. requires transitive C;
  4. }
  5. module A {
  6. requires B;
  7. }

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

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

1. 修改模組zoo.animal.feeding

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

  1. module zoo.animal.feeding {
  2. exports zoo.animal.feeding;
  3. }

2. 修改模組zoo.animal.care

模組zoo.animal.care原本是:

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

3. 修改模組zoo.animal.talks

模組zoo.animal.talks原本是:
  1. module zoo.animal.talks {
  2. exports zoo.animal.talks.content;
  3. exports zoo.animal.talks.media;
  4. exports zoo.animal.talks.schedule;
  5. requires zoo.animal.feeding;
  6. requires zoo.animal.care;
  7. }

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

  1. module zoo.animal.talks {
  2. exports zoo.animal.talks.content to zoo.staff;
  3. exports zoo.animal.talks.media;
  4. exports zoo.animal.talks.schedule;
  5. requires transitive zoo.animal.care;
  6. }

4. 修改模組zoo.staff

模組zoo.staff原本如下:

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

沒有留言:

張貼留言