2013-03-22 15 views
6

Ich arbeite über einige PHP-Bibliothek. Ich möchte die Änderungen in den Schnittstellen der Klassenbibliothek verfolgen.Woher kennen Sie die Unterschiede in den Schnittstellen zwischen zwei verschiedenen Versionen?

  • Ja, ich benutze GIT. Aber diff erzeugt mehr Informationen als ich brauche.
  • Ich habe versucht, zwei Versionen mit phpDocumentor zu vergleichen.

    phpdoc Projekt: parsen -d Ordner

produzieren XML-Datei mit der Struktur der Projekt Schnittstelle. Ich kann diese XML-Datei mit einer anderen vergleichen. Aber diese enthalten mehr Informationen als ich möchte. Wie Zeilennummern, Datei-Hash und so weiter.

Also, ich möchte zwei Commits, Zweige oder sogar Gabeln vergleichen und Unterschiede ihrer Schnittstellen herausfinden.

Beispiel zum Vergleich: http://pastebin.com/1H61dJBT

Es ist wichtig, auch zu wissen, wann Hauptversion zu ändern.

MAJOR Version, wenn Sie nicht kompatibel API Änderungen vornehmen ...

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

+0

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

+0

@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

+0

@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

Antwort

2

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.

+0

Was ist mit PHPdoc? "Leerzeichen und Kommentare (ignoriert)" - von der Betreuerseite. Ich denke PHPdoc ist Teil der Schnittstelle. Kannst du Beispiele für mich produzieren? – sectus

+0

Es gibt Beispiel PHP Smartdifferences auf unserer Website. Sie können darum bitten, Kommentare zu speichern und zu vergleichen. –

+0

Ich habe das verrückt gesehen [Beispiel] (http://www.semdesigns.com/Products/SmartDiffferener/PHPSmartDifferencerExample.html#PHPSmartDifferencerOutput). Ich denke, dass 'get_interest_factor' ihr Interface nicht geändert hat. – sectus

2

Ich rechne damit Sie rund um PHP Smart Differencer einen Workflow aufbauen wollen

Ein Beispiel für die PHP-Smart-Differenzierer der Ergebnisse werden kann here gesehen. Diese Seite enthält ein Beispiel für die Ausgabe, die vom SD Smart Difference Tool von SD generiert wird, wenn es auf eine Originaldatei und eine aktualisierte Version der gleichen Datei angewendet wird.

Wenn Sie wirklich Ihre eigene Rolle möchten, können Sie es um PHP-Parser bauen, werden Sie wahrscheinlich etwas mehr Präzision geben, aber Sie müssten Ihre eigene Vergleichsalgorithmen erzeugen, wo SmartDifferencer des Tools bereits, dass in gebaut hat.

Von diesen beiden wird Ihnen das geben, wonach Sie zu suchen scheinen.

+0

Smart Difference kann nicht akzeptiert werden (Kommentar der vorherigen Antwort). – sectus

+0

Aber PHP-Parser ist ein Werkzeug, das interessant sein könnte ... aber PHPDocs ... Thaks – sectus

Verwandte Themen