Plain diff Berichte Unterschiede in Bezug auf die Textzeilen. Software ist in Code-Strukturen definiert. Die Diskrepanz zwischen Source-Code-as-Text-Zeilen und Source als Strukturen macht die Ausgabe von diff schwer verständlich.
Sie könnten stattdessen die Interface-Definitionen mit Semantic Designs (meiner Firma) SmartDifferencer vergleichen.
Dies meldet die minimalen Änderungen an Code-Strukturen (nicht an Zeilen), um einen Teil von (PHP) Code in einen anderen zu konvertieren. Änderungen an Namen von Schnittstellenfunktionen, eingefügten oder gelöschten Parametern, werden ziemlich offensichtlich. Zeilenumbrüche sind nicht relevant und beeinflussen nicht die Ergebnisse von SmartDiffferencer; es sind auch keine Kommentare, es sei denn, Sie bestehen darauf. (SmartDifferencer ist nicht auf PHP beschränkt; es gibt Versionen für viele Sprachen).
EDIT: OP wollte wissen, was SmartDifferencer an einem bestimmten Beispiel einer Schnittstellenänderung (vor und nach PHP-Dateien) getan hat. Was folgt, sind seine zwei Beispieldateien, ihre SmartDiffferencer-Ausgabe und Unix-diff-Ausgabe. Ich bemerke, dass es in diesen hübschen kleinen Beispieldateien viele Änderungen gibt.
Erste Schnittstelle:
<?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';
}
}
Modified Schnittstellendatei
<?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;
}
}
Smart-Differenzierer Ausgang (M.N bedeutet "Linie M, Spalte 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.
Sie sollten sehen, dass SmartDifferencer auf das Delta in der Codestruktur fokussiert ist, nicht Deltas in den Linien. Das erste, was Sie bemerken, ist, dass SmartDiffferencer die Kommentare vollständig ignoriert, da sie keinen Einfluss auf den Code haben.
Aber das grellste Beispiel dafür im Unix-Diff unten sind die multiplen Diffs, die ein Delta am Ende einer Funktion mit einem Delta am Anfang eines anderen verbinden; Kein Programmierer erklärt Unterschiede im Code auf diese Weise. Ein solcher verwirrter Unterschied sorgt für verwirrendes Lesen, wenn man versucht zu verstehen, was sich wirklich geändert hat.
Ausgabe von UNIX-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
>
Was weder SmartDifferencer noch diff tun, ist Ihnen sagen, dass das Verhalten einer Schnittstelle geändert, weil der Code auf dem es geändert abhängt. Der einzige Weg, dies zu tun ist eine statische semantische Analyse von alle Code direkt oder indirekt unterstützt die Schnittstelle, und das ist ein viel schwierigeres Problem.
Sie möchten den Unterschied basierend auf 1) * nur * der Signatur, 2) auf Änderungen der Funktionalität der APIs basierend auf nur Code im Schnittstellenmodul oder 3) einfach jeder Änderung der Schnittstellenfunktionalität wissen? Basierend auf Ihrer Erwähnung von diff, scheint es, Sie wollen nur 1 oder 2. –
@IraBaxter, Signaturen (am besten: mit phpdocs Typen), Satz von öffentlichen Methoden (am besten: und der geschützten Methoden für nicht endgültig Klassen), Satz von Klassen (es ist einfach, ich kann es selbst machen). – sectus
@sectus Warum vergleichen Sie nicht einfach zwei von 'phpdoc' generierte Strukturen und geben den Unterschied aus? Kann generiert werden xml enthält nicht die gewünschten Daten? – Timur