将类型替换为可以是字符串或int的对象

时间:2016-05-25 15:32:45

标签: c# .net

为了摆脱primitive obsession,我正在为我的“序列号”域对象实施一个模型。

我的班级认为序列号只是一个字符串;但是,我正在与之交互的其他系统可能会返回整数

序列号将始终为#######模式,或其他字符7 ascii字符始终为数字。

简单地添加另一个构造函数是否会被视为标准做法,以考虑序列号为整数的可能性,例如:

public SerialNumber(int value) //this constructor will accept only integers, rather than strings
{
    if (value == null)
        throw new ArgumentNullException(nameof(value));
    if (!SerialNumber.IsValid(value))
        throw new ArgumentException("Invalid serial number value.", nameof(value));

    this._value = value;
}

我使用以下模式:

public class SerialNumber
    {
        private readonly string _value;

        public SerialNumber(string value)
        {
            if (value == null)
                throw new ArgumentNullException(nameof(value));
            if (!SerialNumber.IsValid(value))
                throw new ArgumentException("Invalid serial number value.", nameof(value));

            this._value = value;
        }

        public static bool IsValid(string candidate)
        {
            if (string.IsNullOrEmpty(candidate))
                return false;

            return candidate.Trim().ToUpper() == candidate;
        }

        public static bool TryParse(string candidate, out SerialNumber serialNumber)
        {
            serialNumber = null;
            if (string.IsNullOrWhiteSpace(candidate))
                return false;

            serialNumber = new SerialNumber(candidate.Trim().ToUpper());
            return true;
        }

        public static implicit operator string(SerialNumber serialNumber)
        {
            return serialNumber._value;
        }

        public override string ToString()
        {
            return this._value.ToString();
        }

        public override bool Equals(object obj)
        {
            var other = obj as SerialNumber;
            if (other == null)
                return base.Equals(obj);

            return object.Equals(this._value, other._value);
        }

        public override int GetHashCode()
        {
            return this._value.GetHashCode();
        }
    }

是否有一个众所周知的模式来处理域对象必须能够接受的场景?

0 个答案:

没有答案