为了摆脱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();
}
}
是否有一个众所周知的模式来处理域对象必须能够接受的场景?