2013-03-22 30 views
6

Tôi đang làm việc trên một số thư viện php. Tôi muốn theo dõi những thay đổi trong giao diện của thư viện lớp học.Làm thế nào để bạn biết sự khác biệt trong giao diện giữa hai phiên bản khác nhau?

  • Có, tôi đang sử dụng GIT. Nhưng diff tạo ra nhiều thông tin hơn tôi cần.
  • Tôi đã cố gắng so sánh hai phiên bản với phpDocumentor.

    dự án PHPDoc: phân tích thư mục -d

tập tin xml sản phẩm với cấu trúc của giao diện dự án. Tôi có thể so sánh tệp xml này với tệp khác. Nhưng chúng chứa nhiều thông tin hơn tôi muốn. Giống như số dòng, băm tệp và v.v.

Vì vậy, tôi muốn so sánh hai cam kết, nhánh hoặc thậm chí cả nhánh và tìm ra sự khác biệt về giao diện của chúng.

Ví dụ để so sánh: http://pastebin.com/1H61dJBT

Nó cũng quan trọng để biết khi nào cần thay đổi phiên bản chính.

phiên bản YẾU khi bạn thực hiện thay đổi API không tương thích ...

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

+0

Bạn muốn biết sự khác biệt dựa trên 1) * chỉ * chữ ký, 2) về các thay đổi đối với chức năng của API dựa trên chỉ mã trong mô-đun giao diện hoặc 3) đơn giản là bất kỳ thay đổi nào đối với chức năng giao diện? Dựa trên đề cập của bạn về diff, có vẻ như bạn muốn chỉ 1 hoặc 2. –

+0

@IraBaxter, chữ ký (tốt nhất: với các loại phpdocs), tập hợp các phương pháp công cộng (tốt nhất: và các phương pháp được bảo vệ cho các lớp không cuối cùng), tập hợp các lớp (thật dễ dàng, tôi có thể tự làm được). – sectus

+0

@sectus Tại sao bạn không chỉ so sánh hai cấu trúc được tạo bởi 'phpdoc' và tạo ra sự khác biệt? Có thể tạo xml không chứa dữ liệu bạn muốn? – Timur

Trả lời

2

Plain diff báo cáo khác nhau về dòng văn bản. Phần mềm được định nghĩa về cấu trúc mã. Sự không phù hợp giữa nguồn-mã-as-text-line và nguồn như cấu trúc là những gì làm cho đầu ra của diff khó hiểu.

Thay vào đó, bạn có thể so sánh các định nghĩa giao diện với Thiết kế ngữ nghĩa (công ty của tôi) SmartDifferencer.

Điều này báo cáo các chỉnh sửa tối thiểu về cấu trúc mã (không phải dòng) để chuyển đổi một đoạn mã (PHP) thành mã khác. Thay đổi tên của các chức năng giao diện, các tham số chèn vào hoặc xóa, trở nên khá rõ ràng. Ngắt dòng không liên quan và không ảnh hưởng đến kết quả của SmartDifferencer; không phải là bình luận trừ khi bạn nhấn mạnh chúng. (SmartDifferencer không giới hạn trong PHP, có các phiên bản cho nhiều ngôn ngữ).

EDIT: OP muốn biết SmartDifferencer đã làm gì trên một ví dụ cụ thể về thay đổi giao diện (trước và sau tệp PHP). Sau đây là hai tệp mẫu của ông, đầu ra SmartDifferencer của họ và đầu ra Unix-diff. Tôi nhận xét có rất nhiều thay đổi trong các tệp ví dụ nhỏ này.

giao diện đầu tiên:

<?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 tập tin giao diện

<?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; 
    } 

} 

thông minh Differencer đầu ra (M.N có nghĩa là "dòng M, N cột"):

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. 

Bạn sẽ thấy rằng SmartDifferencer là tập trung vào các đồng bằng châu thổ trong cấu trúc mã, không đồng bằng châu thổ trong dòng. Điều đầu tiên bạn nhận thấy là SmartDifferencer hoàn toàn bỏ qua các ý kiến, vì chúng không có tác động đến mã.

Nhưng ví dụ rõ ràng nhất về điều này trong khác biệt unix dưới đây là nhiều khác biệt mà gộp một đồng bằng ở cuối một hàm với một delta ở đầu của một hàm khác; không có lập trình viên giải thích sự khác biệt trong mã theo cách đó. Một sự khác biệt gây nhầm lẫn làm cho việc đọc khó hiểu khi cố gắng hiểu những gì thực sự thay đổi.

Output từ 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 
> 

gì không SmartDifferencer cũng không khác làm, là cho bạn biết rằng hành vi của một giao diện thay đổi, bởi vì các mã trên mà phụ thuộc thay đổi. Cách duy nhất để làm điều đó là phân tích ngữ nghĩa tĩnh của tất cả mã trực tiếp hoặc gián tiếp hỗ trợ giao diện và đó là vấn đề khó khăn hơn rất nhiều.

+0

Còn PHPdoc thì sao? "Khoảng trắng và nhận xét (bỏ qua)" - từ trang web của người duy trì. Tôi nghĩ rằng PHPdoc là một phần của giao diện. Bạn có thể tạo ra những ví dụ cho tôi không? – sectus

+0

Có các tệp thông minh PHP mẫu tại trang web của chúng tôi. Bạn có thể yêu cầu giữ lại và so sánh nhận xét. –

+0

Tôi đã thấy điều này [ví dụ] điên rồ (http://www.semdesigns.com/Products/SmartDifferencer/PHPSmartDifferencerExample.html#PHPSmartDifferencerOutput). Tôi nghĩ rằng 'get_interest_factor' không thay đổi giao diện của cô ấy. – sectus

2

Tôi nghĩ bạn muốn xây dựng một quy trình làm việc xung quanh PHP Smart Differencer

Một ví dụ về kết quả Differencer của PHP thông minh có thể được nhìn thấy here. Trang này chứa một ví dụ về đầu ra được tạo bởi công cụ PHP Smart Differencer của SD khi được áp dụng cho tệp gốc và phiên bản cập nhật của cùng một tệp.

Nếu bạn thực sự muốn cuộn của riêng bạn, bạn có thể xây dựng nó xung quanh PHP-Parser mà có thể sẽ cung cấp cho bạn chính xác hơn một chút, nhưng bạn sẽ cần phải tạo ra các thuật toán so sánh riêng của bạn nơi công cụ SmartDifferencer của đã có mà được xây dựng trong.

Một trong hai cách này sẽ cung cấp cho bạn những gì có vẻ như bạn đang tìm kiếm.

+0

Không thể chấp nhận Smart Differencer (bình luận về câu trả lời trước). – sectus

+0

Nhưng PHP-Parser là một công cụ có thể thú vị ... nhưng PHPDocs ... Thaks – sectus

Các vấn đề liên quan