2012-01-13 15 views
10

Mã nguồn của ứng dụng của chúng tôi là hàng trăm nghìn dòng, hàng nghìn tệp và ở những nơi rất cũ - ứng dụng được viết lần đầu tiên vào năm 1995 hoặc 1996. Trong vài năm qua, nhóm của tôi đã cải thiện đáng kể chất lượng của nguồn , nhưng một vấn đề vẫn còn đặc biệt là lỗi tôi: rất nhiều lớp học có rất nhiều phương pháp được xác định đầy đủ trong tập tin tiêu đề của họ.Công cụ phân tích nguồn C++ và di chuyển các phương thức nội tuyến trong tiêu đề sang tệp nguồn .cpp?

Tôi không có vấn đề gì với các phương thức được khai báo trong tiêu đề trong một số trường hợp - hàm tạo của cấu trúc, một phương pháp đơn giản trong đó nội tuyến đo được làm cho nó nhanh hơn (chúng tôi có một số hàm toán học như thế này), v.v. các phương pháp inlined không có lý do rõ ràng là:

  • Messy
  • Làm cho nó khó có thể tìm ra thi hành một phương pháp (đặc biệt là tìm kiếm thông qua một cây của các lớp học cho một hàm ảo, chỉ để tìm một lớp có phiên bản của nó được khai báo trong tiêu đề ...)
  • Có thể làm tăng kích thước mã được biên dịch
  • Có thể gây ra sự cố cho trình liên kết của chúng tôi, là notoriously flaky for large codebases. Để công bằng, nó đã tốt hơn nhiều trong vài năm qua, nhưng nó không hoàn hảo.

Lý do cuối cùng có thể gây ra sự cố cho chúng tôi và đó là lý do chính đáng để chuyển qua codebase và di chuyển hầu hết định nghĩa sang tệp nguồn.

Codebase của chúng tôi rất lớn. Có công cụ tự động nào có thể thực hiện được (hầu hết) điều này cho chúng tôi không?

Ghi chú:

  • Chúng tôi sử dụng Embarcadero RAD Studio 2010. Nói cách khác, các phương ngữ C++ bao gồm VCL and other extensions vv
  • Một vài tiêu đề là độc lập, nhưng hầu hết được ghép nối với một tương ứng. tệp cpp, như bạn thường làm. Ngoài phần mở rộng tên tệp là giống nhau, tức là, nếu có các phương thức được xác định trong X.h, chúng có thể được chuyển sang X.cpp. Điều này cũng có nghĩa là công cụ không phải xử lý phân tích cú pháp toàn bộ dự án - nó có thể phân tích cú pháp các cặp .cpp/.h riêng lẻ, bỏ qua bao gồm, v.v., miễn là nó có thể nhận ra một phương thức đáng tin cậy với một thân xác định trong một tuyên bố lớp và di chuyển nó.
+0

http://stackoverflow.com/questions/6362995/c-refactoring-move-method-to-implementation-file sao chép? – Zuljin

+11

Nhận một thực tập để làm điều đó. –

+1

@Zuljin: hmm, có thể ... Nhưng không có câu trả lời áp dụng nào! (VS addins, không có dấu hiệu thay đổi hàng loạt trên trang web của họ và điều bình chọn cao nhất trong số tất cả các nhận xét và câu trả lời là có nội dung 'Ồ, bạn có thể dễ dàng tạo tập lệnh ...' Tôi không nghĩ 'dễ dàng' và 'parse C++' thường đi cùng nhau!) –

Trả lời

6

Bạn có thể thử Lazy C++. Tôi đã không sử dụng nó, nhưng tôi tin rằng nó là một công cụ dòng lệnh để làm những gì bạn muốn.

+0

+1: không biết về công cụ này :) – neuro

+0

1, chưa bao giờ nghe nói về điều đó trước đây. Một trình duyệt nhanh chóng làm cho nó trông giống như một công cụ rất hữu ích cho loại điều này! –

+0

Tôi đã liên hệ với tác giả sau khi đọc Câu hỏi thường gặp. Công cụ này yêu cầu viết mã trong một tệp .lzz, trong đó Lazy C++ phân tích cú pháp và chia tách thành các tệp CPP và H. Tôi nghĩ rằng kết hợp mã của chúng tôi vào các tập tin duy nhất chỉ để có một công cụ chia chúng một lần nữa có thể chỉ là công việc nhiều ... :) Cảm ơn lời đề nghị mặc dù, nó là một công cụ thú vị. –

3

Nếu mã đang hoạt động thì tôi sẽ bỏ phiếu chống lại bất kỳ viết lại tự động chính nào.
Rất nhiều công việc có thể liên quan đến việc sửa chữa nó.

Cải tiến lặp đi lặp lại nhỏ theo thời gian là kỹ thuật tốt hơn vì bạn có thể kiểm tra từng thay đổi riêng biệt (và thêm các kiểm tra đơn vị). Dù sao khiếu nại chính của bạn về việc không thể tìm thấy mã không phải là một vấn đề thực sự và đã được giải quyết. Đã có các công cụ sẽ lập chỉ mục cơ sở mã của bạn để trình soạn thảo của bạn sẽ chuyển sang định nghĩa hàm chính xác mà không cần phải tìm kiếm nó. Hãy xem ctags hoặc tương đương với trình soạn thảo của bạn.

  • Messy

    chủ quan

  • Làm cho nó khó có thể tìm ra thi hành một phương pháp (đặc biệt là tìm kiếm thông qua một cây của các lớp học cho một hàm ảo, chỉ để tìm một lớp đã có phiên bản được khai báo trong tiêu đề ...)

    Hiện chưa có ools có sẵn cho việc tìm kiếm các chức năng. ctags sẽ tạo một tệp cho phép bạn chuyển trực tiếp đến hàm từ bất kỳ trình soạn thảo phong nha nào (vim/emacs). Tôi chắc chắn biên tập viên của bạn nếu một trong số này có công cụ tương đương.

  • lẽ tăng mã kích thước biên soạn

    Không chắc đâu. Trình biên dịch sẽ chọn nội tuyến hoặc không dựa trên các số liệu nội bộ không phải thời tiết nó được đánh dấu nội tuyến trong nguồn.

  • Có thể gây ra sự cố cho trình liên kết của chúng tôi, điều này nổi tiếng là không ổn định đối với các mã lớn. Để công bằng, nó đã tốt hơn nhiều trong vài năm qua, nhưng nó không hoàn hảo.

    Không chắc chắn. Nếu liên kết của bạn là flakey thì nó là flakey nó sẽ không tạo ra nhiều sự khác biệt trong đó các hàm được định nghĩa vì điều này không mang về nếu chúng được inlined anyway.

+0

+1 cho "Rất nhiều công việc có thể liên quan đến việc sửa chữa nó." Tôi thậm chí sẽ nói "Rất nhiều công việc ** sẽ ** được tham gia sửa chữa nó lên." – Sjoerd

+0

Cảm ơn Loki. Tôi không muốn làm một 'viết lại' - tôi muốn giữ mã logic giống nhau, chỉ cần di chuyển vị trí của nó. Tôi biết nó không hoàn toàn đơn giản như vậy, nhưng ... :) Tôi đoán có lẽ đang chạy một công cụ và xem xét lại các thay đổi của nó, và tôi biết codebase rất tốt mặc dù kích thước của nó, vì vậy tôi cảm thấy khá tự tin về phía đó nó. Re một số điểm khác, [câu hỏi SO này] (http://stackoverflow.com/questions/6895408/to-inline-or-not-to-inline) có thể bạn quan tâm. –

1

Bạn có một số vấn đề để giải quyết:

  • Làm thế nào để tập hợp các file nguồn và tiêu đề lý tưởng
  • Làm thế nào để tự động thay đổi mã để tiến hành việc này

Trong cả hai trường hợp, bạn cần một trình phân tích cú pháp C++ mạnh mẽ với độ phân giải tên đầy đủ để xác định chính xác các phụ thuộc.

Sau đó, bạn cần máy móc có thể sửa đổi mã nguồn C++ một cách đáng tin cậy.

DMS Software Reengineering Toolkit với C++ Front End có thể được sử dụng cho việc này. DMS đã được sử dụng để tái cấu trúc mã C++ quy mô lớn; xem http://www.semdesigns.com/Company/Publications/ và theo dõi bài báo đầu tiên "Nghiên cứu điển hình: Mô hình thành phần tái cơ cấu C++ Thông qua chuyển đổi chương trình tự động". (Có một phiên bản cũ hơn của bài báo này bạn có thể tải xuống từ đó, nhưng phiên bản đã xuất bản thì tốt hơn). AFAIK, DMS là công cụ duy nhất được áp dụng để chuyển đổi C++ trên quy mô lớn.

SO discussion on reorganizing code giải quyết vấn đề nhóm trực tiếp.

1

XE2 bao gồm một máy phân tích tĩnh mới. Nó có thể là đáng giá để cung cấp cho phiên bản mới của thử nghiệm C++ Builer một spin.

+0

Cảm ơn David! Tôi thực sự có một bản sao của C + + Builder XE2 Pro, vì vậy tôi sẽ thử nó với điều đó. (Mặc dù công việc đã bị mắc kẹt với năm 2010 - chúng tôi đang chờ 64-bit để nâng cấp lại - tôi cố gắng luôn cập nhật, do đó bản sao của riêng mình). Tôi chỉ thử các phép tái cấu trúc có sẵn trong năm 2010 trước đây và chúng đã bị rất đáng tin cậy. –