Index: [Article Count Order] [Thread]

Date:  Mon, 11 Sep 2000 20:01:47 +0900
From:  tetsuya@....jp
Subject:  [XP-jp:00867] Re: Member, MemberList, MemberAuthorization
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <97BA340C0480D411BDA800062939A18906079D@....jp>
Posted:  Mon, 11 Sep 2000 15:57:01 +0900
X-Mail-Count: 00867

栗原です。

Kaoru Hosokawa [mailto:khosokawa@....com] wrote:

> Test-First Programming を実践しようと思っていますので、テストからコメン
> トします。
> 
> testValidMember() を、書き直して見ました
> 
>     private MemberAuthorizer authorizer;
> 
>     public void testValidMember() {
>         assert(authorizer.isValid(firstMember));
>     }
> 
> MemberAuthorization は、データを意味する名前ですので、
> MemberAuthorizer にかえました。Authorizer という言葉はないと思いますが、
> 許可を出す人と言うイメージです。この人に firstMember は、正会員かどうか訪
> ねるというコードにしました。

了解しました。>MemberAuthorizer

> メールアドレスをgetして渡すよりはシンプルだと思います。
> 
> MemberAuthorizer の isValid() は、
> 
> public boolean isValid(Member member) {
>     return memberList.contains(member);
> }
> 
> // public class MemberList
>     
> public boolean contains(Member member) {
>     return 
> memberList.mailAddressSet().contains(member.getMailAddress());
> }
> 
> のように考えました。mailAddressSet() などはあまり外に出したくないとい
> う意図があります。
> 
> #このコードもコンパイル、実行していません。

いつまでも、Member クラスにこだわっていてもしょうがないのですが、メール
アドレスのキーで Member を引っ掛けるというのが美しくないと感じていたの
でこんなのも考えてみました。
# XP を実践するためのサンプルなのに、コーディングの詳細に踏み込んでいて
# 的を外している感がぬぐえませんが、、、これで最後にします。

Member の同一性をチェックするときに、メーリングリストというシステム上
メールアドレスが一致するものは同じ Member といえるのではないか?
と考えました。

Member のテストケースを作るとこんな感じです。

public void testEquals() {
    assert(firstMember.equals(thirdMember));
}
public void testNotEquals() {
    assert(!firstMember.equals(secondMember));
}
public void testHashCode() {
    java.util.HashMap map = new java.util.HashMap();
    map.put(firstMember, secondMember);
    assertEquals(map.get(firstMember), secondMember);
}
public void setUp() {
    firstMember = new Member("aaa@....ccc");
    secondMember = new Member("ddd@....fff");
    thirdMember = new Member("aaa@....ccc");
}
private Member firstMember;
private Member secondMember;
private Member thirdMember;

で Member の実装はこんな感じ。

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    } else if (anObject == null) {
        return false;
    } else if (getClass() != anObject.getClass()) {
        return false;
    }

    Member otherMember = (Member)anObject;
    return mailAddress.equals(otherMember.getMailAddress());
}
public int hashCode() {
    return mailAddress.hashCode();
}
private String mailAddress;

これを利用すれば、MemberList にて Member を Map で管理する必要がなく
なります。