栗原です。
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 で管理する必要がなく
なります。