Cập nhật:Reposted on Programmers Stack Exchange do bị giữ nguyên như chủ yếu dựa trên ý kiến.Ưu điểm & nhược điểm của việc sử dụng cấu trúc để thực thi xác thực loại được tích hợp
Các đối tượng miền thường có các thuộc tính có thể được biểu diễn bằng loại được tích hợp nhưng có giá trị hợp lệ là tập con của các giá trị có thể được biểu thị bằng loại đó.
Trong những trường hợp này, giá trị có thể được lưu trữ bằng cách sử dụng loại được tích hợp nhưng cần đảm bảo giá trị luôn được xác thực tại điểm nhập, nếu không chúng tôi có thể kết thúc với giá trị không hợp lệ.
Một cách để giải quyết điều này là lưu trữ giá trị dưới dạng tùy chỉnh struct
có một trường sao lưu đơn private readonly
của kiểu được cài sẵn và có hàm tạo xác thực giá trị được cung cấp. Sau đó, chúng tôi luôn có thể chắc chắn chỉ sử dụng các giá trị được xác thực bằng cách sử dụng loại struct
này.
Chúng tôi cũng có thể cung cấp toán tử truyền từ và cho loại được tích hợp sẵn để các giá trị có thể nhập và thoát liền mạch làm loại cơ bản.
Ví dụ như một tình huống mà chúng ta cần đại diện cho tên của đối tượng miền và các giá trị hợp lệ là bất kỳ chuỗi nào có độ dài từ 1 đến 255 ký tự. Chúng ta có thể đại diện này bằng cách sử dụng cấu trúc sau:
public struct ValidatedName : IEquatable<ValidatedName>
{
private readonly string _value;
private ValidatedName(string name)
{
_value = name;
}
public static bool IsValid(string name)
{
return !String.IsNullOrEmpty(name) && name.Length <= 255;
}
public bool Equals(ValidatedName other)
{
return _value == other._value;
}
public override bool Equals(object obj)
{
if (obj is ValidatedName)
{
return Equals((ValidatedName)obj);
}
return false;
}
public static implicit operator string(ValidatedName x)
{
return x.ToString();
}
public static explicit operator ValidatedName(string x)
{
if (IsValid(x))
{
return new ValidatedName(x);
}
throw new InvalidCastException();
}
public static bool operator ==(ValidatedName x, ValidatedName y)
{
return x.Equals(y);
}
public static bool operator !=(ValidatedName x, ValidatedName y)
{
return !x.Equals(y);
}
public override int GetHashCode()
{
return _value.GetHashCode();
}
public override string ToString()
{
return _value;
}
}
Ví dụ cho thấy to- string
cast như implicit
như thế này không bao giờ có thể thất bại nhưng từ- string
cast như explicit
vì điều này sẽ ném cho các giá trị không hợp lệ, nhưng tất nhiên cả hai có thể là implicit
hoặc explicit
. Lưu ý rằng người ta chỉ có thể khởi tạo cấu trúc này theo cách của một dàn diễn viên từ string
, nhưng người ta có thể kiểm tra xem liệu một diễn viên như vậy sẽ thất bại trước bằng phương pháp IsValid
static
hay không. Điều này có vẻ là một mô hình tốt để thực thi xác nhận các giá trị tên miền có thể được biểu diễn bằng các loại đơn giản, nhưng tôi không thấy nó được sử dụng thường xuyên hoặc được đề xuất và tôi quan tâm đến lý do tại sao.
Vì vậy, câu hỏi của tôi là: bạn thấy điều gì là lợi thế và bất lợi của việc sử dụng mẫu này và tại sao?
Nếu bạn cảm thấy rằng đây là một mẫu xấu, tôi muốn hiểu tại sao và những gì bạn cảm thấy là lựa chọn tốt nhất.
Đối với tôi trình xác thực là logic miền có thể truy cập thông qua nhà máy hoặc lớp tĩnh trong một không gian tên rất cụ thể. tức là: 'MyApp.Validators' và trình xác thực lớp cụ thể trong không gian tên đó như' ClientValidator' chứa tất cả xác nhận hợp lệ. Tôi thực sự không thấy việc sử dụng cấu trúc ở đây – Franck
Hãy đến với các bạn, Ứng cử viên để chuyển sang các lập trình viên có thể trao đổi, chắc chắn không chỉ đơn thuần là ý kiến mặc dù –
Tôi sẽ cung cấp câu trả lời của tôi, nhưng với 1 phiếu bầu gần nhất để được Q & A đóng lại. .... –