Plain diff raporty różnice pod względem linii tekstu. Oprogramowanie definiowane jest w kategoriach struktur kodu. Niedopasowanie między linią kodu źródłowego a tekstem i źródłem jako strukturą sprawia, że trudno jest zrozumieć wyjście diff.
Można zamiast tego porównać definicje interfejsów z szablonami semantycznymi (moja firma) SmartDifferencer.
Zgłasza minimalne zmiany w strukturach kodu (nie liniach), aby przekonwertować jeden fragment kodu (PHP) na inny. Zmiany nazw funkcji interfejsu, wstawionych lub usuniętych parametrów stają się dość oczywiste. Podziały linii nie są istotne i nie wpływają na wyniki SmartDifferencer; nie są też komentarzami, chyba że ich nalegasz. (SmartDifferencer nie ogranicza się do PHP, istnieją wersje dla wielu języków).
EDYCJA: OP chciał wiedzieć, co zrobił SmartDifferencer na konkretnym przykładzie zmiany interfejsu (przed i po plikach PHP). Poniżej znajdują się jego dwa przykładowe pliki, ich dane wyjściowe SmartDifferencer i dane wyjściowe Unix-diff. Zwracam uwagę, że w tych dość małych przykładowych plikach jest wiele zmian.
pierwszy interfejs:
<?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';
}
}
zmodyfikowany plik interfejs
<?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;
}
}
wyjście
Inteligentne Differencer (M.N oznacza "Line M, kolumna 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.
Należy zauważyć, że SmartDifferencer koncentruje się na delt w strukturze kodu nie delt w linii. Pierwszą rzeczą, którą zauważysz, jest to, że SmartDifferencer całkowicie zignorował komentarze, ponieważ nie mają one wpływu na to, co robi kod.
Jednak najbardziej jaskrawym tego przykładem w poniższym fragmencie unix jest wiele różnic, które łączą deltę na końcu jednej funkcji z deltą na początku innej; żaden programista nie wyjaśnia różnic w kodzie w ten sposób. Taka zagmatwana różnica sprawia, że czytanie jest mylące, gdy próbuje zrozumieć, co naprawdę się zmieniło.
Wyjście z 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
>
Co ani SmartDifferencer ani diff zrobić, to powiedzieć, że zachowanie interfejsu zmianie, ponieważ kod, na którym to zależy zmieniło. Jedynym sposobem na to jest statyczna analiza semantyczna kodu bezpośrednio lub pośrednio wspierająca interfejs, a to o wiele trudniejszy problem.
Chcesz poznać różnicę w oparciu o 1) * tylko * podpis, 2) o zmianach w funkcjonalności API opartych na samym kodzie w module interfejsu, lub 3) po prostu jakiejkolwiek zmianie funkcji interfejsu? Na podstawie twojej wzmianki o diff, wydaje ci się, że chcesz tylko 1 lub 2. –
@IraBaxter, podpisy (najlepiej: z typami phpdocs), zestaw metod publicznych (najlepiej: i metod chronionych dla klas nieukończonych), zestaw klas (to łatwe, mogę to zrobić sam). – sectus
@sectus Dlaczego po prostu nie porównasz dwóch struktur generowanych przez 'phpdoc' i wypiszesz różnicę? Może być generowany xml nie zawiera żądanych danych? – Timur