栗原です。
太郎君が、MemberAuthorization を作成しようとしてふと考えました。
(花子さんは今日は有給を取って休んでます(^_^;)
# 相方が休んでいれば、別の人とペアを組むと思うんですが、細かいと
# ころは気にしないでください:-)
太郎>
認証するということは、MemberList クラスが管理している Member
クラスのメールアドレス値が、ひとつでも一致すればいいってことだか
ら、、、、
べたべたに実装すると、MemberList クラスから Member のリス
ト(もしくは、Iterator)を取得して、ループさせて、、、
っていう感じにつくれますね。
なんか、わざわざ MemberAuthorization をつくる必要もあるのかどう
か疑問だけど、MemberList が認証するのも変だから、良しとしておこ
うかな。
それにしても、YAGNI とはいえ、Member が増えてくると気になるし
、インデックスでのアクセスもあまり必要なさそうに感じる(し、Java
っぽくなくて、、)なぁ。
うーんと、サンプルをつくってみますか、、、カタカタカタ…
/*
* @(#)MemberList.java
*/
package jp.co.esm.wiki.xp;
import java.util.*;
public class MemberList {
public void add(Member aMember) {
members.put(aMember.getMailAddress(), aMember);
}
public Member get(String aMailAddress) {
return (Member)members.get(aMailAddress);
}
public int size() {
return members.size();
}
public Set memberSet() {
return Collections.unmodifiableSet(members.entrySet());
}
public Set mailAddressSet() {
return Collections.unmodifiableSet(members.keySet());
}
private HashMap members = new HashMap();
}
こんな感じだとどうだろう?
MemberList の内部クラスに Iterator をつくるほどのものでもなさそ
うだしこのぐらいで代用できそうだ。
Member を取得するためのキーがメールアドレスのほうが何かと便利
、、、、あ、YAGNI 違反だ:-P
それと、重複したメールアドレスははじくようにしないいけないな。
まぁ、テストだけつくっておいて、実際にこのやり方に変えると決ま
ってからでいいか。
次は、こいつを使う認証クラスのほうだけど、、、、
/*
* @(#)MemberAuthorization.java
*/
package jp.co.esm.wiki.xp;
import java.util.*;
public class MemberAuthorization {
public MemberAuthorization(MemberList aMemberList) {
memberList = aMemberList;
}
public boolean verify(String aMailAddress) {
return memberList.mailAddressSet().contains(aMailAddress);
}
private MemberList memberList;
}
こんな感じかな。結構シンプルに実装できそう。
にしても、MemberList オブジェクトしか使ってないなぁ。
やっぱり MemberList に移したほうがいいかなぁ。
さて、このコードを明日花子さんに見せてみるか。
おっと、もちろんテストケースも作成済みなので、そいつと一緒にね。
/*
* @(#)MemberListTest.java
*/
package jp.co.esm.wiki.xp;
import junit.framework.*;
public class MemberListTest extends TestCase {
public MemberListTest(String name) {
super(name);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(MemberListTest.class);
}
public void testNewMemberList() {
MemberList memberList = new MemberList();
assertEquals(memberList.size(), 0);
}
public void testOneMemberList() {
MemberList memberList = new MemberList();
memberList.add(firstMember);
assertEquals(memberList.size(), 1);
}
public void testDuplicationMember() {
MemberList memberList = new MemberList();
memberList.add(firstMember);
try {
memberList.add(firstMember);
fail("Should raise an IllegalArgumentException");
} catch (IllegalArgumentException e) {
assert(true);
}
}
public void testGetMember() {
MemberList memberList = new MemberList();
memberList.add(firstMember);
memberList.add(secondMember);
assertEquals(
firstMember,
memberList.get(firstMember.getMailAddress())
);
}
public void testUnmodifiableMemberSet() {
MemberList memberList = new MemberList();
memberList.add(firstMember);
memberList.add(secondMember);
try {
memberList.mailAddressSet().add("xxx@....zzz");
fail("Should raise an UnsupportedOperationException");
} catch (UnsupportedOperationException e) {
assert(true);
}
}
public void testUnmodifiableMailAddressSet() {
MemberList memberList = new MemberList();
memberList.add(firstMember);
memberList.add(secondMember);
try {
memberList.memberSet().add(new Member("xxx@....zzz"));
fail("Should raise an UnsupportedOperationException");
} catch (UnsupportedOperationException e) {
assert(true);
}
}
protected void setUp() {
firstMember = new Member("aaa@....ccc");
secondMember = new Member("ddd@....fff");
}
private Member firstMember;
private Member secondMember;
}
/*
* @(#)MemberAuthorizationTest.java
*/
package jp.co.esm.wiki.xp;
import junit.framework.*;
public class MemberAuthorizationTest extends TestCase {
public MemberAuthorizationTest(String name) {
super(name);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(MemberAuthorizationTest.class);
}
public void testValidMember() {
assert(authorization.verify(firstMember.getMailAddress()));
}
public void testInvalidMember() {
assert(!authorization.verify(invalidMember.getMailAddress()));
}
protected void setUp() {
memberList.add(firstMember);
memberList.add(secondMember);
authorization = new MemberAuthorization(memberList);
}
private MemberAuthorization authorization;
private MemberList memberList = new MemberList();
private Member firstMember = new Member("aaa@....ccc");
private Member secondMember = new Member("ddd@....fff");
private Member invalidMember = new Member("xxx@....zzz");
}
---
Tetsuya Kurihara
tetsuya@....jp