2009-07-21 48 views
17

Tôi đang tìm một công cụ khác có thể phân tích mã của tôi và cho tôi biết điều gì đã thay đổi trên cấu trúc bằng cách xây dựng cơ sở. Ví dụ: nếu tôi cắt và dán phương thức từ đầu tệp của tôi và đặt nó ở cuối nhưng để nguyên phương pháp đó, tôi không muốn nó bị gắn cờ. Tuy nhiên, nếu tôi chèn một dòng mã hoặc thay đổi một cái gì đó bên trong phương thức đó, nó sẽ gắn cờ nó là đã thay đổi.Có ai biết về một công cụ tìm kiếm nâng cao cho C# không?

Tôi đã sử dụng nhiều công cụ khác nhau, nhưng tất cả chúng dường như không đủ để cho bạn biết rằng các dòng đã được chèn vào, xóa hoặc thay đổi nhưng không thể biết được những thay đổi đó thuộc loại hợp lý nào. Nó sẽ là tốt đẹp nếu tôi định kỳ sắp xếp lại bố trí của tập tin mã của tôi các công cụ khác có thể theo kịp.

Có ai có công cụ như vậy không?

+1

Đó không phải là ý kiến ​​thay đổi kiểm soát nguồn là gì? :) – jrummell

+0

bạn vẫn đang chờ hỗ trợ để lấy lại cho bạn, tôi quan tâm để xem những gì bạn tìm thấy. –

+0

Vẫn đang chờ. Họ liên lạc với tôi để hỏi tôi phương ngữ của C# tôi đã làm sau. Nói với họ rằng tôi đang tìm kiếm 2.0 (.NET 3.5) và được hỏi về một mức giá và nếu họ muốn phát hành một phiên bản dùng thử và chưa được nghe từ họ kể từ đó. – BenAlabaster

Trả lời

22

tôi sử dụng http://winmerge.org/

Tôi không nghĩ rằng bạn có thể làm những gì bạn đang yêu cầu, bởi vì cách làm việc của longest common subsequence thuật toán làm việc cho những công cụ này.

Ngay cả khi chức năng của bạn được sắp xếp lại và chức năng của tệp nguồn vẫn giữ nguyên, nó vẫn sẽ hiển thị dưới dạng sự khác biệt do bản chất của LCS.

EDIT:
Đây là một chút xa vời, nhưng nếu bạn đã cảm thấy thêm nhiều tham vọng, bạn có thể viết riêng bạn mà thợ may đến nhu cầu chính xác của bạn.

bạn có thể sử dụng cụm từ thông dụng để lấy ra từng phương thức trong tệp nguồn và thực hiện khác biệt LCS trên từng phương pháp dựa trên tên của nó. Bạn có thể lưu mã của bạn một từ điển (khóa, giá trị) để khóa là tên của phương thức và giá trị là chuỗi của hàm. Sau đó, bạn chỉ cần diff từ điển của bạn ['phương pháp'] với dictionary_new của bạn ['phương pháp'].

Ngoài ra, tôi không biết bạn sẽ đạt được những gì bạn đang tìm kiếm.

+1

Thực ra, Winmerge có tùy chọn để phát hiện các khối văn bản đã di chuyển. Chúng sẽ được đánh dấu khác với những cái đã thay đổi hoặc thêm/xóa. – VladV

+0

Tôi vẫn sẽ xem xét rằng "gắn cờ" –

+0

Ira Baxter đã đăng một mục có khả năng chính xác là loại lập trình viên cần cho một sự khác biệt, có khả năng nó hỗ trợ nhiều ngôn ngữ. Tôi chỉ đang chờ phản hồi từ nhóm hỗ trợ của họ để tìm hiểu xem đó có thực sự là những gì nó hứa hẹn hay không. – BenAlabaster

-1

DiffMerge từ SourceGear là tuyệt vời và có sẵn miễn phí.

http://www.sourcegear.com/diffmerge/

+1

OP: "Tôi đang tìm một công cụ khác có thể phân tích mã của tôi và cho tôi biết điều gì đã thay đổi trên cấu trúc bằng cách xây dựng cơ sở". DiffMerge có phải không? -1 –

0

tôi sử dụng KDiff và thấy rằng nó hoạt động khá tốt. Và tất nhiên là miễn phí.

+1

OP: "Tôi đang tìm một công cụ khác có thể phân tích mã của tôi và cho tôi biết điều gì đã thay đổi trên cấu trúc bằng cách xây dựng cơ sở". DiffMerge có phải không? -1 –

2

Đó là điều tôi đã tự hỏi. Tôi không nghĩ nó tồn tại. Có các công cụ tìm kiếm 'chức năng' (trái ngược với chỉ dựa trên văn bản) có sẵn cho các kịch bản khác. Ví dụ. Microsoft Word tích hợp chức năng khác biệt/hợp nhất của riêng nó (có thể được viết kịch bản, vì vậy nó có thể được tích hợp với TortoiseSVN) và cũng có một số công cụ có sẵn cho XML giải thích các tệp xml và không đơn giản coi chúng như văn bản.

Tôi không chắc giá trị gia tăng của công cụ như vậy trên một công cụ phân biệt/hợp nhất dựa trên văn bản tốt sẽ đủ hấp dẫn để có thể phát triển nó. OTOH này có thể chỉ là liên kết còn thiếu giải quyết 'đau đớn kết hợp' mà tất cả chúng ta đều cảm thấy khi đối mặt với một tình huống hợp nhất khó khăn.

Khó khăn là tất nhiên bạn phải giải thích mã theo cùng một cách trình biên dịch C# thực hiện. Bây giờ công cụ đến gần nhất thực sự là NDepend, tôi nghĩ vậy. This blog post giải thích một số khả năng của nó trong lĩnh vực này.

6

Bạn có sẵn lòng thực hiện so sánh trên các bộ sưu tập được biên dịch không?Nếu vậy, .NET Reflector có một Bổ trợ có sẵn được gọi là Diff sẽ cho phép bạn so sánh 2 cụm. Điều này chắc chắn sẽ không quan tâm ở đâu/làm thế nào các đối tượng của bạn được sắp xếp bên trong của tập tin nguồn.

+0

Tôi định nói vậy. – Ramesh

+0

Đó là một ý tưởng thú vị - và về mặt lý thuyết tôi không cần những tập tin khác không đi vào VCS, và chỉ có các ứng dụng có khả năng tương thích mới có thể làm việc - như tôi đã nói, theo lý thuyết. Tôi sẽ kiểm tra con đường đó. – BenAlabaster

+0

Nó không phải là một giải pháp "hoàn hảo", nhưng nó đưa ra một cách tiếp cận thú vị để xem những gì là khác nhau từ phía bên kia của trình biên dịch. Nếu bạn chưa sử dụng .NET Reflector, hãy chắc chắn kiểm tra các Add-Ins khác vì chúng chắc chắn làm cho một công cụ đã ấn tượng hơn nữa. Và để bất cứ ai từ chối bình chọn phản hồi này, vui lòng giải thích lý do. Nếu bạn tìm thấy một lỗ hổng trong câu trả lời của tôi, bạn nên bước lên và nói những gì bạn thấy sai với nó. –

0

Như nhiều người đã đề xuất, tôi đoán loại so sánh này sẽ không thể thực hiện được với các công cụ tìm kiếm có sẵn khác. Bởi vì mục đích của họ là để nói liệu một cái gì đó thay đổi và nếu bạn di chuyển một phương pháp từ đầu đến cuối, đã có thực sự thay đổi một cái gì đó.

Nhưng điều tôi nghĩ là bạn có thể tự mình làm điều đó. Về cơ bản gọi một số công cụ khác, sau đó sẽ trả về các dòng mới được chèn vào, về cơ bản là phương thức mà bạn đã chuyển đến cuối tệp của bạn. Sau đó, bạn có thể làm một so sánh chính mình, cho dù các dòng thay đổi mà đã có trong tập tin trước đó của bạn.

2

Ngoài so sánh theo số Scooter Software đá cho điều này và nó cũng rẻ ($ 30).

+0

Nó cũng được đề xuất Jeff sử dụng điều này trong khi viết StackOverflow. http://highscalability.com/stack-overflow-architecture –

1

Tôi biết bạn đang tìm kiếm một công cụ. Nhưng kể từ khi tôi biết không, đây là cách tôi sẽ thực hiện điều này:

  1. Đọc một cuốn sách về thiết kế trình biên dịch
  2. Lex/Phân tích mã của bạn
  3. Tạo một cây cú pháp trừu tượng
  4. Invent một thuật toán cho thực hiện các khác biệt trên cây Cú pháp
  5. Lợi nhuận!
+0

Đã xem xét điều này - Tôi nghĩ rằng nó sẽ là một công cụ tuyệt vời cho rằng nó rõ ràng là một trong chưa tồn tại. Vấn đề duy nhất là làm thế nào để bạn lex/phân tích một lớp có phụ thuộc mà không hài lòng bởi các tập tin một mình? Nó sẽ không làm việc ... – BenAlabaster

+0

Có lẽ nó sẽ là một toàn bộ "dự án" hoặc "giải pháp" khác .. Trình biên dịch của bạn đã chăm sóc này vì vậy nó không phải là quá khó để tìm ra. Nó cũng sẽ gọn gàng để làm cho ngôn ngữ bất khả tri nếu có thể .. Vì vậy, các ngôn ngữ khác có thể được thêm dễ dàng. Tôi chắc rằng một vài người sẽ trả tiền cho nó như một sản phẩm. –

+0

Xem câu trả lời của tôi bên dưới. –

9

Kiểm tra công cụ Smart Differencer của chúng tôi, trong đó so sánh cây cú pháp trừu tượng, và các báo cáo khác nhau về mặt không thuộc đầu cuối ("các cấu trúc ngôn ngữ") rằng ASTs đại diện và hành động chỉnh sửa plauible (chèn, xóa, di chuyển) , cũng như khám phá đổi tên nhất quán.

Hiện tại, nó chỉ xử lý Java và COBOL, nhưng dựa trên DMS, trong đó có trình phân tích cú pháp cho nhiều biến thể ngôn ngữ, bao gồm C#.

EDIT 9/8/2009: C# SmartDifferencer hiện khả dụng cho người thử nghiệm beta.

Công cụ này đã xử lý một đổi tên nhất quán trên toàn bộ tập tin như là ngữ nghĩa tầm thường (trên giả định rằng các file khác tham khảo biểu tượng đổi tên cho phù hợp), cũng như đổi tên trong một phạm vi. Chúng tôi dự định tính đến các thay đổi nhỏ gọn về mặt ngữ nghĩa, chẳng hạn như khi di chuyển một khai báo phương thức xung quanh trong một lớp cho Java và C#.

EDIT tháng 10 năm 2010: Phiên bản sản xuất có sẵn.Eval downloads accessible at the website.

EDIT tháng năm 2012: Bạn có thể see a C# example at this page.

Một trong những điều đó hiện nay không làm được bỏ qua chỉnh sửa ngữ nghĩa null. Một trường hợp cụ thể tại điểm là xáo trộn các phương pháp về trong một thân thể lớp; chúng ta đều biết điều này không ảnh hưởng đến ngữ nghĩa cho C#. Công cụ của chúng tôi so sánh cú pháp (thông qua AST), không phải ngữ nghĩa, do đó, nó không hiểu sắc thái cụ thể này, và do đó sẽ cho người dùng biết rằng "điều này đã được di chuyển" thay vì im lặng.Chúng ta có kế hoạch xử lý các trường hợp như thế này trong tương lai, nhưng hey, mỗi sản phẩm phải có phiên bản 1: -} [Như một điểm tinh tế, các phương thức xáo trộn trong một lớp Java cũng là vô nghĩa, nhưng các trường shuffling là không phải do thứ tự đánh giá của initializers. Tôi không biết điều này có đúng với C# hay không nhưng nó sẽ không làm tôi ngạc nhiên.]

+0

Cảm ơn bạn đã chia sẻ –

+0

Chưa kiểm tra điều này, nhưng sẽ làm gì khi tôi đến văn phòng. Nghe có vẻ rất hứa hẹn - tôi rất vui khi thấy nó có khả năng gì! – BenAlabaster

+0

Được rồi, vì vậy tôi không thể tìm ra nơi để tìm một tải về của công cụ này để thử nó cho C# - chỉ cần chờ đợi một phản ứng từ phi hành đoàn hỗ trợ của họ. Tôi đã có những ngón tay của tôi vượt qua rằng đó là tất cả tôi hy vọng nó sẽ được. – BenAlabaster

3

Tên của công cụ này là CodeCompare. Hãy dùng thử - CodeCompare. Tính năng bắt buộc được gọi là structure comparison.

+0

Điều này có vẻ tuyệt vời ! Tôi nghĩ rằng đây sẽ là câu trả lời được đánh dấu. –

0

Tôi nghĩ rằng để so sánh tệp trực tuyến, bạn nên sử dụng http://www.diffnow.com. Tôi đang sử dụng tùy chọn này để chọn ngôn ngữ trong khi so sánh, rất đẹp của nó

2

Tôi tìm thấy SemanticMerge rất hữu ích. Nó hiển thị sự khác biệt theo cách trực quan đẹp mắt và dễ dàng so sánh mã C# phức tạp.

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