提取公用表定义的算法?

时间:2013-10-04 07:48:23

标签: algorithm optimization interface multiple-inheritance

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

由于数据库非常混乱,我得到大约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; }
}

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

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

我甚至不知道在谷歌写什么来获得相关结果。

1 个答案:

答案 0 :(得分:0)

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

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

初​​始化:

  • 首先我们通过包含它的接口数量命令所有适当的项目进入LProperties(因此大多数使用的属性将位于顶部)
  • 从LProperties中选择第一个属性(P1),创建仅具有该属性的新接口ITemp
  • 来自LProperties的pop P1
  • 计算ITemp的表面(可以实现它的现有接口的数量乘以属性数)

迭代:

  • 从LProperties(现在为P2)中选择第一个属性,将其放入ITemp(注意:自从我们弹出P1后P2不是P1)
  • new Surface
  • new Surface>旧的Surface,从LProperties中删除P2,将其保存到ITemp,记住Surface *,从ITemp中删除P2

迭代:

  • 来自LProperties(现为P3)的下一个属性,将其放入ITemp(注意:P2仍在LProperties中,但我们已经处理过了)
  • 如果是新的Surface> old Surface从LProperties中删除P3,将其保存到ITemp,否则从ITemp中删除P3