2013-03-22 11 views
6

Pracuję nad biblioteką php. Chcę śledzić zmiany w bibliotece interfejsów klas.Skąd znasz różnice w interfejsach między dwiema różnymi wersjami?

  • Tak, używam GIT. Ale diff generuje więcej informacji niż potrzebuję.
  • Próbowałem porównać dwie wersje z phpDocumentor.

    projekt PHPDoc: analizowania -d folderu

produce plik xml z konstrukcji interfejsu projektu. Mogę porównać ten plik xml z innym. Ale zawierają one więcej informacji, niż ja chcę. Podobnie jak numery linii, hash pliku i tak dalej.

Chcę więc porównać dwa zatwierdzenia, gałęzie, a nawet widelce i dowiedzieć się o różnicach w ich interfejsach.

Przykład porównać: http://pastebin.com/1H61dJBT

Jest również ważne, aby wiedzieć, kiedy należy zmienić wersji forum.

wersja MAJOR podczas dokonywania zmian niezgodnych API ...

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

+0

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. –

+0

@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

+0

@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

Odpowiedz

2

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.

+0

Co z PHPdoc? "Biała spacja i komentarze (ignorowane)" - od strony opiekuna. Myślę, że PHPdoc jest częścią interfejsu. Czy możesz przygotować dla mnie przykłady? – sectus

+0

Istnieją przykładowe Smartdifferences PHP na naszej stronie internetowej. Możesz poprosić go o zachowanie i porównanie komentarzy. –

+0

Widziałem ten szalony [przykład] (http://www.semdesigns.com/Products/SmartDifferencer/PHPSmartDifferencerExample.html#PHPSmartDifferencerOutput). Myślę, że 'get_interest_factor' nie zmienił jej interfejsu. – sectus

2

Sądzę chcesz zbudować obieg wokół PHP Smart Differencer

Przykładem wyników PHP inteligentnej Differencer można zobaczyć here. Ta strona zawiera przykład danych wyjściowych wygenerowanych przez narzędzie SD Smart Smartferencing SD po zastosowaniu do oryginalnego pliku i zaktualizowanej wersji tego samego pliku.

Jeśli naprawdę chcesz się toczyć własną rękę, można go zbudować wokół PHP-Parser który będzie prawdopodobnie daje nieco więcej precyzji, ale trzeba by generować własnych algorytmów porównywania gdzie narzędzie SmartDifferencer już jest, że zbudowany w.

Każdy z nich da ci to, czego szukasz.

+0

Nie można zaakceptować Smart Differencer (komentarz z poprzedniej odpowiedzi). – sectus

+0

Ale PHP-Parser to narzędzie, które może być interesujące ... ale PHPDocs ... Thaks – sectus

Powiązane problemy