アナパタ リターンズ その3:Aggregating Attribute


前回の続き、

Aggregating Attribute

組織構造などの階層構造において、特定のオーバーライドが無い限り、子が親の属性を引き継いで使用する。


親の特性を子供が共有することはよくある。例えば、会社の会計通過が米ドルであれば、子供となる営業部の会計通過も同じになる。意図的に特性を無効化しない限り、親の属性を子供が引き継ぐことを表現するのが Aggregating Attribute である。
UML でこれを表現することはできないため、モデル中に<>と書くことで表現することとしている。


実装例

前回の Organization Hierarchy の例に accountingCurrency の取得メソッドを追加する。

class Organization...
  Currency getAccountingCurrency() {
    if (accountingCurrency != null)
      return accountingCurrency;
    else {
      if (parent != null) {
        return parent.getAccountingCurrency();
      } else {
        Assert.unreachable();
        return null;
      }
    }
  }

accountingCurrency が null の場合には親の accountingCurrency を再起的に巡って返却する。


親(getParent())がnullの場合は最上位にあるため、accountingCurrency は null にはできないという制約を加える必要がある。

  void setAccountingCurrency(Currency arg) {
    assertValidAccountingCurrency(arg);
    accountingCurrency = arg;
  }
  void assertValidAccountingCurrency(Currency arg) {
    Assert.isFalse (arg == null && getParent() == null);
  }