Tôi đang cố gắng tìm một cách tốt hơn để xử lý một số cấu trúc ngày càng tăng if
để xử lý các lớp khác nhau. Các lớp này, cuối cùng, các trình bao bọc xung quanh các loại giá trị khác nhau (int, DateTime, vv) với một số thông tin trạng thái bổ sung. Vì vậy, sự khác biệt chính giữa các lớp này là loại dữ liệu mà chúng chứa. Trong khi chúng thực hiện các giao diện chung, chúng cũng cần được giữ trong các bộ sưu tập đồng nhất, do đó chúng cũng thực hiện một giao diện không chung chung. Các cá thể lớp được xử lý theo loại dữ liệu mà chúng đại diện và sự thúc đẩy của chúng tiếp tục hoặc không tiếp tục dựa trên đó.Đôi công văn và lựa chọn thay thế
Mặc dù điều này không nhất thiết là vấn đề .NET hoặc C#, mã của tôi nằm trong C#.
lớp Ví dụ:
interface ITimedValue {
TimeSpan TimeStamp { get; }
}
interface ITimedValue<T> : ITimedValue {
T Value { get; }
}
class NumericValue : ITimedValue<float> {
public TimeSpan TimeStamp { get; private set; }
public float Value { get; private set; }
}
class DateTimeValue : ITimedValue<DateTime> {
public TimeSpan TimeStamp { get; private set; }
public DateTime Value { get; private set; }
}
class NumericEvaluator {
public void Evaluate(IEnumerable<ITimedValue> values) ...
}
tôi đã đưa ra hai lựa chọn:
đúp văn
Gần đây tôi đã học được của mô hình khách và sử dụng các công văn đúp để xử lý chỉ Trường hợp như vậy. Điều này hấp dẫn vì nó sẽ cho phép dữ liệu không mong muốn không được đẩy (nếu chúng ta chỉ muốn xử lý một int, chúng ta có thể xử lý nó khác với một DateTime). Ngoài ra, các hành vi về cách xử lý các loại khác nhau sẽ được giới hạn trong một lớp duy nhất đang xử lý công văn. Nhưng có một chút bảo trì công bằng nếu/khi một loại giá trị mới phải được hỗ trợ.
Liên minh Lớp
Một lớp học có chứa một tài sản đối với từng loại giá trị được hỗ trợ có thể là những gì mỗi người trong các cửa hàng các lớp học. Bất kỳ hoạt động nào trên một giá trị sẽ ảnh hưởng đến thành phần thích hợp. Điều này ít phức tạp hơn và ít bảo trì hơn so với chiến lược điều phối kép, nhưng điều đó có nghĩa là mọi phần dữ liệu sẽ truyền đi tất cả các cách không cần thiết vì bạn không thể phân biệt đối xử dọc theo dòng "Tôi không hoạt động theo kiểu dữ liệu đó ". Tuy nhiên, nếu/khi các kiểu mới cần được hỗ trợ, chúng chỉ cần đi vào lớp này (cộng với bất kỳ lớp bổ sung nào cần được tạo để hỗ trợ kiểu dữ liệu mới).
class UnionData {
public int NumericValue;
public DateTime DateTimeValue;
}
Có các tùy chọn nào tốt hơn không? Có một cái gì đó trong một trong hai lựa chọn mà tôi đã không xem xét rằng tôi nên?
Điều gì có thể xảy ra trong phương thức 'Đánh giá' của' NumericEvaluator' sẽ hoạt động trên 'DateTime' * hoặc * một' float'? –
trên thiết bị di động ngay bây giờ, vì vậy tôi không thể viết câu trả lời thích hợp, nhưng hãy thử sử dụng tính năng động cho công văn kép (làm giảm đáng kể bản mẫu yêu cầu của mẫu khách truy cập) hoặc triển khai các loại công đoàn trong C# (Tôi nhớ một thực hiện đẹp bởi @ Juliet một nơi nào đó ở đây trên SO) –
@ Chris Shain: Đó là một phần của lợi ích của giải pháp hai công văn - nó sẽ không phải. Đối với một 'DateTime', một trong hai giải pháp công văn bỏ qua nó hoặc giải pháp biến thể tiêu thụ nó như là một giá trị 0. – redman