Index: [Article Count Order] [Thread]

Date:  Wed, 6 Sep 2000 15:07:36 +0900
From:  tetsuya@....jp
Subject:  [XP-jp:00826] Re: Member, MemberList, MemberAuthorization
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <50158B900247D411B8120090CC01C0EC1E05A5@....jp>
Posted:  Wed, 6 Sep 2000 15:04:12 +0900 
X-Mail-Count: 00826

栗原です。

太郎君が、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