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à nó 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.
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. –
@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
@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