gpt4 book ai didi

c# - 在对表格、其布局和记录建模时,如何避免代码重复,所有这些都共享相同的基本结构?

转载 作者:太空狗 更新时间:2023-10-29 23:33:36 26 4
gpt4 key购买 nike

这将是一个有点抽象的问题。

我正在开发一个数据访问层框架,它需要区分表、它的抽象模式/布局和具体的表记录。恐怕因为这个区别,会有很多代码重复。我可能需要一些关于避免这种情况的方法的意见。

+-----------+
| Foo |
+-----------+
| +Id: Guid |
+-----------+

请注意,此图可以描述其中的任何一个:表架构、具体表或具体表记录,具有类型为 Guid 的字段 Id

  • 架构中已知的只是字段的名称和类型。
  • 在具体的(打开的)表中,该字段的“列索引”也是已知的。
  • 有了记录,所有这些东西都是已知的,而且字段具有具体的值。

将其转化为代码,我会得到很多相似的类型(三个一组)。我将使用接口(interface)来保持示例的简洁;我想展示的是类型的相似性:

// 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; }
}

现在我想避免为具体数据模型中的每个实体编写三个非常相似的实现。有哪些可能的方法可以减少代码重复?

  • 我考虑过代码生成(例如 T4),这是一个不错的解决方案,但我更喜欢代码行更少且代码更易读的“手动”编码解决方案(如果有的话) .

  • 我考虑过为每个实体创建一个类,它同时实现架构、表和记录接口(interface)……但这感觉很乱,而且像是违反了关注点分离。

最佳答案

恕我直言,我认为您对表结构的抽象有点过头了。过度使用接口(interface)会使代码难以阅读。我觉得很烦人,例如,你不能按 F12 查看对象的实现,因为它是接口(interface)类型。

一个我已经使用多年并且非常容易维护的成熟模型是保持所有类名与表名相同,然后是与列名匹配的字段名。然后,您可以在编辑器中使用搜索和替换轻松生成方法,代码更改也是如此。这样你就不需要在内存中保留列名和列索引。您只需在数据访问层中对它们进行硬编码(硬编码并不总是坏事!)。例如:

this.Price = reader["Price"] as decimal?;

这种方法的性能非常好,而且代码非常易于维护!

无论采用何种方法,关键是如何保持从表列到类属性的映射。我建议对它们进行硬编码并使用简单的命名约定(列名 = 属性名)。这种方法要求您在添加或更改列时重新编译,但我认为这些更改的发生频率不足以证明将列名放在变量中或从单独的文件中读取它们是合理的。这样做可以避免重新编译,但会使代码更难理解。我认为这不值得。

关于c# - 在对表格、其布局和记录建模时,如何避免代码重复,所有这些都共享相同的基本结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9252250/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com