1

我正在使用代码生成来生成与某个数据库中的表定义相对应的接口。

由于数据库非常混乱,我得到了大约 500 个接口(用于 500 个表),每个接口都有自己的定义。

一些接口可以相互继承,而对于一些通用接口可以提取出来以最小化代码定义。例如:

interface One
{
    int FirstField { get; set; }
    bool SecondField { get; set; }
    DateTime ThirdField { get; set; }   
}

interface Two
{
    int FirstField { get; set; }
    DateTime ThirdField { get; set; }
    double FourthField { get; set; }
}

我想对代码进行某种最小化以生成最少的代码(通过多重继承和公共代码提取)。从上面的例子中,我需要得到类似的东西:

interface OneTwoCommon
{
    int FirstField { get; set; }
    DateTime ThirdField { get; set; }   

}

interface One : OneTwoCommon
{
    bool SecondField { get; set; }
}

interface Two : OneTwoCommon
{
    double FourthField { get; set; }
}

哪个算法分支处理这些问题?

我从哪里开始查找这些算法?

我什至不知道在 Google 中写什么来获得相关结果。

4

1 回答 1

0

我想出了一个简单的算法。

  • 将接口的表面定义为实现它的其他接口的数量,乘以该接口的属性数量
  • 目标是构建一个新界面,其中包含所有使用属性的子集,并具有最大可能的表面

初始化:

  • 首先,我们将所有属性按包含它的接口数量排序到 LProperties 中(因此最常用的属性将位于顶部)
  • 从 LProperties 中选择第一个属性 (P1),创建仅具有该属性的新接口 ITemp
  • 从 LProperties 弹出 P1
  • 计算 ITemp 的 Surface(可以实现它的现有接口数乘以属性数)

迭代:

  • 从 LProperties(现在是 P2)中选择第一个属性,将其放入 ITemp(注意:P2 不是 P1,因为我们弹出了 P1)
  • 新表面
  • new Surface > old Surface,从 LProperties 中移除 P2,将其保存到 ITemp,记住 Surface *,从 ITemp 中移除 P2

迭代:

  • 来自 LProperties(现为 P3)的下一个属性,将其放入 ITemp 中(注意:P2 仍在 LProperties 中,但我们已经对其进行了处理)
  • 如果 new Surface > old Surface 从 LProperties 中删除 P3,将其保存到 ITemp,否则从 ITemp 中删除 P3
于 2013-10-22T15:00:39.267 回答