2010-11-18 32 views
5

Tôi phải thực hiện thay đổi lớn đối với một codebase bao gồm một số loại thay đổi khác nhau cần được áp dụng ở hàng trăm địa điểm khác nhau, trải rộng trên hàng trăm nghìn các dòng.Công cụ xem xét mã để chuẩn bị cho thay đổi lớn đối với mã số

Tôi có ý tưởng về một công cụ có thể giúp tôi với điều này, nhưng tôi chắc rằng tôi không phải là người duy nhất có ý tưởng này, tôi tự hỏi liệu nó đã được viết chưa.

Hãy để tôi phác thảo làm thế nào nó sẽ làm việc:

  • Thứ nhất, một chút như grep với bối cảnh, nó sẽ thu thập một tập hợp các khối "thú vị" của mã dựa trên một biểu thức chính quy; có thể có hàng ngàn địa điểm này.
  • Sau đó, hãy để tôi lặp lại từng phần, đánh dấu từng mục là Thú vị hoặc Không thú vị. Đây là cơ bản tự động hóa càng nhiều càng tốt của công việc thủ công của whittling xuống vị trí thay đổi tiềm năng đến địa điểm thay đổi thực tế.
  • Cuối cùng, hãy để tôi áp dụng một phép biến đổi (ví dụ: thay thế kiểu sed) cho tất cả các vị trí Thú vị đã chọn.

Công cụ này đã tồn tại chưa?

Tôi đang tự mình viết công cụ này nếu tôi không thể tìm thấy một công cụ đã tồn tại từ trước.

+2

Nếu bạn không thể tìm thấy một công cụ phù hợp và phải tự xây dựng một công cụ. Thật tuyệt vời nếu bạn mở nguồn. Đã có rất nhiều nơi tôi đã yêu thích để có một công cụ tương tự như những gì bạn đang đề xuất. – sdolan

Trả lời

1

này nghe có vẻ giống như những gì Coccinelle được viết để làm gì, mặc dù nó chỉ làm việc với C.

+0

Điều đó thật thú vị, nhưng tôi nghĩ cách tiếp cận của Coccinelle có lẽ quá cấu trúc để thực tế; nói cách khác, nó cố gắng tự động hóa quá nhiều, nhưng sự phức tạp xuất hiện ở phía bên kia bằng cách viết các bản vá lỗi ngữ nghĩa. Do tập hợp thay đổi không cần phải sử dụng lại được, tôi nghĩ tốt hơn là nên thực hiện các lựa chọn thủ công một lần thực dụng ở nơi có ý nghĩa. –

1

Tôi không biết về bất kỳ công cụ như thế. Nó có vẻ như một công việc khá chuyên môn chỉ được thực hiện một lần trong một thời gian dài, vì vậy thật khó để kiếm tiền bằng cách phát triển và phân phối một công cụ như vậy.

Trong quá khứ, nếu tôi có một công việc như thế, tôi sẽ viết một kịch bản trong phiên bản Lisp của Emacs. Lợi thế là Lisp là một ngôn ngữ mạnh mẽ, và trình soạn thảo Emacs có nhiều hàm dựng sẵn thuận tiện (ví dụ: truy vấn-thay thế-biểu thức chính quy) và các khái niệm. Tuy nhiên, trừ khi bạn đã quen thuộc với Emacs và Lisp, tôi sẽ không giới thiệu nó; đường cong học tập quá dốc.

+0

Công cụ mà tôi có trong đầu sẽ là một công việc hack 200 dòng để giảm thiểu tổng thời gian làm việc (tạo công cụ + tái cấu trúc), thay vì một số sản phẩm được đánh bóng. truy vấn-thay thế-biểu thức chính quy không nhiều hơn lệnh của sed; như một pass đầu tiên, công cụ của tôi có khả năng sẽ giải nén các khối được sửa đổi thành một tập tin văn bản lớn, được cắt xuống bằng tay, sau đó sửa đổi với sed, awk, vv, sau đó tái hòa nhập với bản gốc. –

1

Nghe có vẻ thú vị. Tôi cũng đã chơi xung quanh với ý tưởng như vậy nhưng đã không đi xa từ kịch bản dòng lệnh. Biện pháp của tôi để chuẩn bị refactoring là:

  1. Tìm một chunc mã để được refactored
  2. Tạo reg-exp/script cho việc tìm kiếm tương tự như mã/mô hình và tạo ra một danh sách các vị trí cho loại mẫu

sản lượng file chứa dòng trong định dạng đầu ra GNU hoặc MS (ví dụ: FILE: LINE ĐIỆP) Vì vậy, nó có thể được nạp vào bất kỳ IDE (của vim -q) và mã khối có thể được tìm thấy dễ dàng bằng cách double-klicking trên "Thông báo lỗi S".

Bằng cách này, sẽ dễ dàng hơn để grep, nếu mã được hợp nhất trước thụt lề trước đó.

1

Có vẻ như bạn dự định thực hiện việc này bằng cách sử dụng hueristics ("grep") để tìm mã của bạn và phỏng đoán ("sed") để sửa đổi mã của bạn. Nếu những điều này sẽ làm các trick, và bạn thực sự có thể làm điều đó trong 200 dòng như bạn nói, tôi ngạc nhiên bạn thậm chí hỏi ở đây trên SO.

Theo nguyên tắc chung, việc thực hiện hàng trăm thay đổi bằng cách sử dụng chẩn đoán là khá nguy hiểm. Nếu một người tham gia vào mỗi người trong số họ, anh ta có thể sửa lỗi trong phạm vi mà anh ta thông báo cho họ và điều đó có thể đủ tốt; trong trường hợp đó, bạn đang xây dựng một trình soạn thảo văn bản trông rất thú vị. Nếu bạn đi theo lộ trình đó, EMACS có thể là một lựa chọn rất tốt, vì tất cả các hành động bạn muốn (tìm kiếm chuỗi, trích xuất thành bộ đệm cho hiển thị, thay thế chuỗi, tạo cấu trúc dữ liệu đánh dấu ở bên cạnh) hoàn toàn có thể đọc được trong Elisp và nó đã có giao diện người dùng tốt đẹp.

Nếu bạn muốn tự động hóa điều này trên cơ sở đáng tin cậy hơn, bạn cần tìm kiếm và thay thế chính xác. DMS Software Reengineering Toolkit là một công cụ chuyển đổi chương trình có thể làm điều này cho nhiều ngôn ngữ được sử dụng rộng rãi (bạn không nói bạn đang làm gì) bao gồm Java, C++, C, C#, COBOL, ... DMS tương tự có thể được viết đầy đủ cho tập hợp các hành động tùy chỉnh.

+0

Vâng, tôi có thể làm điều đó trong ít hơn 200 dòng, nhưng nó sẽ dần dần khó hơn để viết ngắn gọn, và liên quan đến các bước thủ công hơn :) - xem xét đầu ra của grep -n -C 10 chuyển hướng đến một tập tin văn bản, sau đó xử lý vào một khác biệt, và cuối cùng áp dụng với bản vá. Nhưng một giao diện trực quan được thiết kế xung quanh loại công việc này - và nó là một vấn đề dòng công việc của tự nhiên - sẽ làm cho cuộc sống dễ dàng hơn nhiều. Tự động hóa nó không phải là vấn đề; toàn bộ vấn đề với nó là sự lặp lại của việc kiểm tra từng trường hợp riêng biệt. –

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