Đây sẽ là một câu hỏi hơi trừu tượng.Làm cách nào để tránh trùng lặp mã khi lập mô hình bảng, bố cục và bản ghi của bảng, tất cả đều chia sẻ cấu trúc cơ bản giống nhau?
Tôi đang làm việc trên khuôn khổ Lớp truy cập dữ liệu cần phân biệt giữa bảng, lược đồ/bố cục trừu tượng và bản ghi bảng bê tông. Tôi sợ rằng vì sự khác biệt này, sẽ có nhiều sự sao chép mã. Tôi có thể cần một số đầu vào về cách để tránh điều này.
+-----------+
| Foo |
+-----------+
| +Id: Guid |
+-----------+
Lưu ý rằng sơ đồ này có thể mô tả bất kỳ trong số này: a schema bảng, một bảng cụ thể, hoặc một kỷ lục bảng bê tông, có một lĩnh vực Id
với loại Guid
.
- Tất cả những gì được biết trong lược đồ là tên và loại của trường.
- Trong bảng bê tông (mở), "chỉ mục cột" của trường được biết thêm.
- Với hồ sơ, tất cả những điều này được biết, cộng với trường có giá trị cụ thể.
Dịch mã này thành mã, tôi sẽ nhận được nhiều loại tương tự (theo cặp ba). Tôi sẽ sử dụng các giao diện để giữ cho ví dụ ngắn gọn; những gì tôi muốn thể hiện là sự giống nhau của các loại:
// these interfaces only need to be implemented once:
interface ISchemaField<T> { string Name { get; } }
interface ITableField<T> { string Name { get; }
int Index { get; } }
interface IRecordField<T> { string Name { get; }
int Index { get; }
T Value { get; set; } }
// these three interfaces are an example for one entity; there would be
// three additional types for each additional entity.
interface IFooSchema
{
ISchemaField<Guid> Id { get; }
IFooTable Open(IDbConnection dbConnection, string tableName);
}
interface IFooTable
{
ITableField<Guid> Id { get; }
ICollection<IFooRecord> ExecuteSomeQuery();
}
interface IFooRecord
{
IRecordField<Guid> Id { get; }
}
Bây giờ tôi muốn tránh phải viết ba triển khai rất giống nhau cho tất cả các thực thể trong một mô hình dữ liệu cụ thể. Một số cách có thể để giảm trùng lặp mã là gì?
Tôi đã nghĩ đến việc sinh mã (ví dụ T4), đó sẽ là một giải pháp OK, nhưng tôi muốn một giải pháp "thủ công" mã hóa (nếu có) với ít dòng mã & dễ đọc hơn mã.
Tôi đã nghĩ về việc tạo một lớp cho mỗi thực thể thực hiện lược đồ, bảng và giao diện bản ghi cùng một lúc ... nhưng điều đó cảm thấy lộn xộn và giống như vi phạm Tách mối quan tâm.
Bạn có đang sử dụng Khung thực thể không? – TheBoyan
@Bojan, no. Tôi đang xây dựng một khung tùy chỉnh DAL trên đầu trang của một API (ESRI ArcObjects) mà không được hỗ trợ bởi Entity Framework, cũng như NHibernate, cũng như bất kỳ OR/M khác mà tôi biết. – stakx
Chỉ cần một cái nhìn ngắn gọn về lược đồ của bạn làm cho tôi tự hỏi tại sao không có kế thừa giữa ba giao diện lược đồ? Bạn dường như chỉ sao chép siêu dữ liệu thay vì kế thừa chúng. –