Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 提取公共表定义的算法?_Algorithm_Optimization_Interface_Multiple Inheritance - Fatal编程技术网

Algorithm 提取公共表定义的算法?

Algorithm 提取公共表定义的算法?,algorithm,optimization,interface,multiple-inheritance,Algorithm,Optimization,Interface,Multiple Inheritance,我使用代码生成来生成与特定数据库中的表定义相对应的接口 由于数据库非常混乱,我得到了500个表的500个接口,每个表都有自己的定义 有些接口可以相互继承,有些接口可以提取公共接口以最小化代码定义。 例如: interface One { int FirstField { get; set; } bool SecondField { get; set; } DateTime ThirdField { get; set; } } interface Two {

我使用代码生成来生成与特定数据库中的表定义相对应的接口

由于数据库非常混乱,我得到了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; }
}
算法的哪个分支处理这些问题

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


我甚至不知道在谷歌上写什么才能得到相关的结果。

我想出了一个简单的算法

将接口的表面定义为实现它的其他接口的数量乘以该接口的属性数量 目标是构造一个新的界面,包含所有已使用属性的子集,具有最大可能的曲面 初始化:

首先,我们将所有属性按包含它的接口的数量顺序描述为LProperty,以便大多数使用的属性位于顶部 从LProperty中选择第一个特性P1,然后仅使用该特性创建新的接口项P 从LProperty弹出P1 计算ITemp的表面可以实现它的现有接口数乘以属性数 迭代:

从LProperty now P2中选择第一个属性,将其放入ITemp注意:P2不是P1,因为我们弹出了P1 新表面 新建曲面>旧曲面,从LProperty中删除P2,将其保存到ITemp,记住曲面 *,从ITemp中删除P2 迭代:

lproperty的下一个属性现在是P3,将其放入ITemp注意:P2仍在lproperty中,但我们已经对其进行了处理 如果“新建曲面>旧曲面”从LProperty中删除P3,请将其保存到ITemp,否则从ITemp中删除P3
你为什么要这么做。每次对数据库进行更改时,继承结构可能会更改。因此,您不应该依赖任何未明确定义的自动生成结构。您永远不应该接触生成的代码,因此,如果它有点难看,那也没关系。@MrSmith42我这样做主要是因为这是一个有趣的问题,其次是为了提高编译速度,并最小化程序集大小。关键是要依赖于生成的代码,因此如果数据库中的某些主要内容发生了更改,我们在正确的位置上几乎不会出现编译错误。@MrSmith42此外,我们也不会真正依赖于公共接口,只依赖于公共接口和完整的表。稍后可以对常见的表进行分析,以了解各表之间的相同之处。