2013-04-05 37 views
8

Có cách nào để refactor mã hỗn hợp C++/Objective-C trong Xcode ?? Tôi đang viết một trò chơi bằng cách sử dụng Cocos2D và Box2D, và Box2D được viết trên C++, vì vậy mỗi lớp tôi viết nên có phần mở rộng .mm và do đó khi tôi cố gắng, ví dụ: đổi tên biến, tôi nhận được một thông báo như "Xcode chỉ có thể cấu trúc lại mã C và Mã mục tiêu-C".Tái cấu trúc mã hóa C++ và Objective-C

Cảm ơn trước!

+1

nó "cấu trúc lại" không phải là "khúc xạ" - đó sẽ là một kính viễn vọng;) – LearnCocos2D

+1

cho refactoring i * đôi khi * Sử dụng appcode, refactoring của nó là mạnh hơn. Tuy nhiên nó tải chậm vì vậy đối với tôi nó vẫn còn thực tế hơn để đổi tên trong xcode. – LearnCocos2D

Trả lời

10

Xcode rất hạn chế với việc tái cấu trúc, ngay cả với đồng bằng Obj-C. Nó về cơ bản đổi tên và nó thậm chí không thể đổi tên trong bình luận. Nếu nó nói nó không thể làm điều gì đó, thì có lẽ nó không thể.

Cách duy nhất để đổi tên đang sử dụng find & replace. Lưu ý rằng Xcode có thể xử lý các biểu thức chính quy để nó thường đủ tốt.

Tất nhiên, vấn đề là tìm thấy & thay thế không biết ngôn ngữ lập trình và đôi khi có thể thêm một số thay thế hoặc quên thay thế một cái gì đó, do đó hãy cẩn thận hơn. Xây dựng sạch sẽ là cần thiết sau mỗi lần tái cấu trúc để kiểm tra mọi thứ đã được đổi tên chính xác.

Bạn cũng có thể sử dụng các công cụ dòng lệnh (ví dụ: sed) để đạt được điều tương tự.

+0

Cảm ơn bạn! Tôi chỉ muốn biết cách mọi người thường đối phó với nó khi làm việc trên các dự án lớn. Họ có sử dụng công cụ tìm và thay thế không? – Terko

+1

@Terko Khó nói. Tôi đoán mọi người có chút khác biệt. Cũng lưu ý rằng XCode không phải là IDE duy nhất trên thị trường. Đó là mặc định và hoàn toàn miễn phí nhưng không phải là duy nhất. Tôi nghe nói tài liệu tham khảo rất tốt cho [JetBrains] (http://www.jetbrains.com/objc/), trong đó có "tái cấu trúc đáng tin cậy" là một trong những tính năng chính của nó. Tôi không biết liệu nó có thể tái cấu trúc Obj-C++ hay không nhưng nó có thể là IDE tốt hơn nhiều so với XCode. – Sulthan

+0

@Sulthan - trong nhiều khía cạnh nó là lớn hơn hẳn, ở những người khác không (xem xét Stefen của trên). Bây giờ tôi sử dụng xCode nghiêm ngặt cho các hoạt động thiết lập dự án (hiếm), (luôn luôn) các hoạt động tổ chức và (không bao giờ) mã, kiểm tra và tích hợp. Nếu họ có thể giải quyết các vấn đề hiệu suất và thêm các chức năng còn thiếu, xCode sẽ sớm là ExCode cho tôi. – YvesLeBorg

3

Tôi gặp vấn đề tương tự trong trò chơi cocos2d/box2d mà tôi đang xây dựng.

Sự thật 1: Xcode 4 có thể tái cấu trúc mã C và mục tiêu-C (.m tệp) nhưng không thể tái cấu trúc mã Objective-C++ (tệp .mm).

Sự kiện 2: Nếu bạn muốn tương tác với box2d (được viết bằng C++), bạn cần sử dụng Objective-C++.

Tôi đã (một phần) giải quyết vấn đề theo các bước sau:

  1. Tôi tạo ra một vài wrappers trong Objective-C++ cho các lớp Box2D tôi cần phải tương tác với (ví dụ MyWorld.mm là một wrapper của lớp C++ b2WorldMyBody.mm là trình bao bọc cho lớp C++ b2Body). Ở đây nó là rất quan trọng để tránh bất kỳ tham chiếu đến box2d trong .h của wrappers.
  2. Trong mỗi lớp khác của dự án của tôi, tôi không bao giờ gọi trực tiếp các lớp box2d, tôi gọi thay vào đó là các trình bao bọc liên quan. Tất nhiên tôi cũng đã xóa #import "Box2D.h" khỏi các lớp này.
  3. Tôi chuyển đổi thành đồng bằng Objective-C (.m) mọi lớp khác của dự án của tôi.

Kết quả là bây giờ Xcode có thể cấu trúc lại mọi lớp của dự án của tôi nhưng trình bao bọc tất nhiên.

P.S. Tất nhiên khi bạn cần sử dụng trình bao bọc (ví dụ: MyWorld) trong các lớp Objective-C, bạn phải nhập MyWorld.h và không phải MyWorld.mm.

2

Bạn có thể muốn kiểm tra dự án này trên github - đó là một công việc đang tiến hành, nhưng vẫn:

https://github.com/lukhnos/refactorial

Đó là một công cụ C++ refactoring dựa trên Clang (tức là trình biên dịch Xcode bản thân dựa trên).

+0

trông khá chết bây giờ. : -/ –

+0

Vâng - ** Mã khóa ** sau đó. – cacau

0

tôi đã có một số loại của một giải pháp - để tách Objective-C và Objective-C++. Có một số macro cho phép phát hiện nếu tệp được sử dụng trong Objective-C thuần túy. Ví dụ:

http://philjordan.eu/article/strategies-for-using-c++-in-objective-c-projects

Ý tưởng là bạn vẫn không thể refactor .mm file nhưng bạn có thể cấu trúc lại tất cả các mã khác thậm chí nếu nó bao gồm ++ mã C Mục tiêu.

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