데코레이터 패턴을 이용한 문자열 검사 Programming

계정이나 암호 입력을 받을때 허용하는 문자열이 있습니다.
일반적으로
계정/암호 : 영소문자, 영대문자, 숫자 허용
닉네임 : 영소문자, 영대문자, 숫자, 한글 허용

보통 특수문자(≠, Δ...)나 기호는 허용하지 않는 경우가 많습니다.
허용하는 문자로만 이루어진 문자열인지 체크하는 코드입니다. (C# 코드)

일단 클래스 코드 입니다.

namespace Common.Utility
{
    public class Range
    {
        private int _min = 0;
        private int _max = 0;

        public Range(int min, int max)
        {
            _min = min;
            _max = max;
        }

        public bool Contain(char ch)
        {
            if (_min <= ch && _max >= ch)
                return true;

            return false;
        }
    };

    public abstract class AbstractValidCheck
    {
        protected Range _check = null;
        private AbstractValidCheck _pObject = null;
        public AbstractValidCheck(AbstractValidCheck obj)
        {
            _pObject = obj;
        }

        public bool ValidCheck(string value)
        {
            foreach(char ch in value)
            {
                if (ValidCheck(ch))
                    continue;

                return false;
            }
            return true;
        }

        public bool ValidCheck(char ch)
        {
            bool checkRet = _check.Contain(ch);
            if (_pObject == null)
                return checkRet;
            else
                return (checkRet || _pObject.ValidCheck(ch));
        }
    };

    // 한글
    public class KorString : AbstractValidCheck
    {
        public KorString(AbstractValidCheck obj) : base(obj)
        {
            _check = new Range(0xAC00, 0xD7A3);
        }
    };

    // 영소문자
    public class EngsmallString : AbstractValidCheck
    {
        public EngsmallString(AbstractValidCheck obj) : base(obj)
        {
            _check = new Range(97, 122);
        }
    };

    // 영대문자
    public class EngbigString : AbstractValidCheck
    {
        public EngbigString(AbstractValidCheck obj) : base(obj)
        {
            _check = new Range(65, 90);
        }
    };

    // 숫자
    public class NumericString : AbstractValidCheck
    {
        public NumericString(AbstractValidCheck obj) : base(obj)
        {
            _check = new Range(48, 58);
        }
    }; 
}


다음은 TestCase 입니다.(NUnit)

KorString korCheck = new KorString(null);
Assert.IsTrue(korCheck.ValidCheck("가나다라마바사"));
Assert.IsFalse(korCheck.ValidCheck("가나다라a마b바사c"));
Assert.IsFalse(korCheck.ValidCheck("가나다≠라"));

EngsmallString engSmallCheck = new EngsmallString(korCheck);
Assert.IsTrue(engSmallCheck.ValidCheck("가나다라a마b바사c"));
Assert.IsFalse(engSmallCheck.ValidCheck("가나다라A마b바사C"));

EngbigString engBigCheck = new EngbigString(engSmallCheck);
Assert.IsTrue(engBigCheck.ValidCheck("가나다라A마b바사C"));
Assert.IsFalse(engBigCheck.ValidCheck("가나2다6라A마b바사C"));

NumericString numericCheck = new NumericString(engBigCheck);
Assert.IsTrue(numericCheck.ValidCheck("가나2다6라A마b바사C"));
Assert.IsFalse(numericCheck.ValidCheck("가≠나2다6Γ라A마b바사C"));


덧글

댓글 입력 영역