您如何知道两个不同版本之间接口的差异?

时间:2013-03-22 00:36:23

标签: php interface diff versioning

我正在研究一些php库。我想跟踪类库接口的变化。

  • 是的,我正在使用GIT。但差异产生的信息比我需要的多。
  • 我试图用phpDocumentor比较两个版本。

    phpdoc项目:parse -d文件夹

生成具有项目界面结构的xml文件。我可以将此xml文件与另一个文件进行比较。但这些包含的信息比我想要的多。像行号,文件哈希等。

所以,我想比较两个提交,分支甚至分支,找出它们的接口差异。

比较示例:http://pastebin.com/1H61dJBT

知道何时更改主要版本也很重要。

  

当您进行不兼容的API更改时的MAJOR版本...

http://semver.org/spec/v2.0.0.html

2 个答案:

答案 0 :(得分:2)

普通 diff 报告文本行方面的差异。软件是根据代码结构定义的。源代码作为文本行和作为结构的源之间的不匹配使得diff的输出难以理解。

您可以将界面定义与语义设计(我公司的) SmartDifferencer 进行比较。

这会报告对代码结构(而不​​是行)的最小编辑,以将一段(PHP)代码转换为另一段代码。对接口函数名称,插入或删除的参数的更改变得非常明显。换行符不相关,不会影响SmartDifferencer的结果;除非你坚持,否则都不是评论。 (SmartDifferencer不仅限于PHP;还有许多语言的版本)。

编辑:OP想知道SmartDifferencer在接口更改的特定示例(PHP文件之前和之后)上做了什么。接下来是他的两个示例文件,它们的SmartDifferencer输出和Unix-diff输出。我注意到这些非常小的示例文件有很多变化。

第一个界面:

<?php
// ----- first version -----
namespace vendor\package;

class someClass
{
private $c;
public function __construct($a, $b)
    {
    $c = $a + $b;
    }
/**
 * @return string
 */
public function returnC()
    {
    return $this->c;
    }
public function saySomething()
    {
    echo 'something';
    }
}

修改后的界面文件

<?php
// ----- second version -----
namespace vendor\package;

class someClass
{
private $a, $b;

public function __construct($a, $b)
    {
    $this->a = $a;
    $this->b = $b;
    }

public function saySomething($something = 'something')
    {
    echo $something;
    }

/**
 * @return integer
 */
public function returnC()
    {
    return $this->a + $this->b;
    }

}

智能差分输出(M.N表示“行M,列N”):

C:>DMSSmartDifferencer PHP~PHP5 \temp\first_version.php \temp\second_version.php
Copyright (C) 2009-2012 Semantic Designs; All Rights Reserved
PHP~PHP5 SmartDifferencer Version 1.0.14
Copyright (C) 2012 Semantic Designs, Inc; All Rights Reserved; SD Confidential
Powered by DMS (R) Software Reengineering Toolkit
*** Unregistered SmartDifferencer Version 1.0
*** Operating with evaluation limits.

*** Parsing file C:/temp/first_version.php ...
*** Parsing file C:/temp/second_version.php ...
*** Creating suffix tree ...
*** Determining maximal pairs ...
*** Sorting maximal pairs ...
*** Determining differences ...
*** Printing edits ...
Substitute 7.13-7.14 by 7.13-7.18
<            $c
>            $a, $b
Substitute 10.9-10.21 by 11.9-12.22
<        $c = $a + $b;
>        $this->a = $a;
>        $this->b = $b;
At 15.12 insert 15.12-18.9 moving 19.21-19.32 to 15.21-15.32
>           function saySomething($something = 'something')
>        {
>        echo $something;
>        }
Delete 15.12-18.9 at 15.12 moving 15.21-15.27 to 23.21-23.27
<           function returnC()
<        {
<        return $this->c;
<        }
At 19.21 insert 23.21-23.27 moving 15.21-15.27 to 23.21-23.27
>                    returnC
Delete 19.21-19.32 at 23.21 moving 19.21-19.32 to 15.21-15.32
<                    saySomething
Substitute 21.9-21.25 by 25.9-25.35
<        echo 'something';
>        return $this->a + $this->b;
Exiting with final status 1.

您应该看到SmartDifferencer专注于代码结构中的增量中没有 deltas 。您注意到的第一件事是SmartDifferencer完全忽略了注释,因为它们对代码的作用没有影响。

但是下面unix diff中最明显的例子是多个差异,它们在一个函数的末尾加上一个delta,在另一个函数的开头有一个delta;没有程序员通过这种方式解释代码的差异。当试图理解真正改变的东西时,这种混乱的差异会使阅读混乱。

unix-style diff的输出:

C:>diff \temp\first_version.php \temp\second_version.php
2c2
< // ----- first version -----
---
> // ----- second version -----
7c7,8
<     private $c;
---
>     private $a, $b;
>
10c11,17
<         $c = $a + $b;
---
>         $this->a = $a;
>         $this->b = $b;
>         }
>
>     public function saySomething($something = 'something')
>         {
>         echo $something;
11a19
>
13c21
<      * @return string
---
>      * @return integer
17,21c25
<         return $this->c;
<         }
<     public function saySomething()
<         {
<         echo 'something';
---
>         return $this->a + $this->b;
22a27
>

SmartDifferencer和diff都没有做的是告诉你接口的行为发生了变化,因为 it 所依赖的代码发生了变化。唯一的方法是直接或间接支持接口的所有代码的静态语义分析,这是一个更难的问题。

答案 1 :(得分:2)

我估计你想围绕PHP Smart Differencer

建立一个工作流程

可以看到PHP智能差异器结果的示例here。此页面包含SD的PHP Smart Differencer工具生成的输出示例 当应用于原始文件和同一文件的更新版本时。

如果你真的想要自己动手,你可以围绕PHP-Parser构建它,这可能会给你更多的精确度,但你需要生成自己的比较算法,其中SmartDifferencer的工具已经有内置的。

其中任何一个都会为您提供您正在寻找的东西。