2013-04-05 12 views
8

Czy istnieje sposób na refactor mieszany C++/Objective-C kod w Xcode? Piszę grę przy użyciu Cocos2D i Box2D, a Box2D jest napisany w C++, więc każda klasa, którą napiszę, powinna mieć rozszerzenie .mm, a zatem kiedy próbuję np. zmień nazwę zmiennej, otrzymałem komunikat "Xcode może jedynie refaktoryzować C i kod Objective-C".Xcode C++ i Objective-C refactoring

Z góry dziękuję!

+1

to "refaktor", a nie "refraktor" - to byłby teleskop;) – LearnCocos2D

+1

do refaktoryzacji i * czasami * używać appcode, jego refaktoryzacja jest silniejsza. Jednak ładowanie jest powolne, więc dla mnie zmiana nazwy w xcode jest jeszcze bardziej praktyczna. – LearnCocos2D

Odpowiedz

10

Xcode jest BARDZO ograniczony z refaktoryzacją, nawet przy prostym Obj-C. Zasadniczo zmienia nazwę i nie może nawet zmienić nazwy w komentarzach. Jeśli mówi, że nie może czegoś zrobić, prawdopodobnie nie może.

Jedynym sposobem zmiany nazwy jest użycie find & replace. Zauważ, że Xcode może obsługiwać wyrażenia regularne, więc często jest wystarczająco dobre.

Oczywiście problem polega na tym, że zastąpienie & nie zna języka programowania, a czasami może dodać trochę dodatkowej lub zapomnieć o wymianie, dlatego należy zachować szczególną ostrożność. Czysta kompilacja jest konieczna po każdym refaktoryzacji, aby sprawdzić, czy wszystko zostało poprawnie zmienione.

Można również użyć narzędzi wiersza poleceń (np. sed), aby osiągnąć to samo.

+0

Dziękujemy! Chciałem tylko poznać sposób, w jaki ludzie zwykle sobie z tym radzą podczas pracy nad dużymi projektami. Czy oni też używają narzędzia znajdowania i zamiany? – Terko

+1

@Terko Trudno powiedzieć. Sądzę, że każdy jest trochę inny. Zauważ też, że XCode nie jest jedynym IDE na rynku. Jest to ustawienie domyślne i jest bezpłatne, ale nie jest jedyne. Słyszałem bardzo dobre referencje dla [JetBrains] (http://www.jetbrains.com/objc/), które ma "Niezawodne refaktoryzacje" jako jedną z jego głównych cech. Nie wiem, czy może on refaktoryzować Obj-C++, czy nie, ale jest to prawdopodobnie lepsze IDE niż XCode. – Sulthan

+0

@Sulthan - pod wieloma względami jest znacznie lepszy, w innych nie (patrz uwaga Stefena powyżej). Używam teraz XCode wyłącznie do (rzadkich) działań konfiguracyjnych projektu, (zawsze) działań organizatora i (nigdy) kodu, testu i integracji. Jeśli potrafią rozwiązać problemy z wydajnością i dodać brakujące funkcje, xCode wkrótce będzie dla mnie ExCode. – YvesLeBorg

3

Miałem ten sam problem w grze cocos2d/box2d, którą buduję.

Fakt 1: Xcode 4 może byłaby C i Objective-C (pliki .m) kod, ale nie może ona byłaby Objective-C++ kod (pliki .mm).

Fakt 2: Jeśli chcesz współpracować z Box2D (który jest napisany w języku C++) trzeba użyć Objective-C++.

mam (częściowo) skierowana problem następujące kroki:

  1. stworzyłem kilka opakowań w Objective-C++ dla box2d klas I potrzebnych do interakcji z (np MyWorld.mm jest opakowaniem klasy C++ b2World i MyBody.mm to opakowanie dla klasy C++ b2Body). Tutaj ważne jest, aby unikać jakiegokolwiek odniesienia do box2d w .h owijki.
  2. W każdej innej klasie mojego projektu nigdy nie odniosłem się bezpośrednio do klas box2d, ale odesłałem do nich powiązane opakowania. Oczywiście usunąłem także #import "Box2D.h" z tych klas.
  3. Konwertowałem na zwykły Objective-C (.m) co drugą klasę mojego projektu.

Powoduje to, że teraz Xcode może refaktoryzować każdą klasę mojego projektu, ale opakowania oczywiście.

P.S. Oczywiście, gdy musisz użyć wrappera (np. MyWorld) w twoich klasach Objective-C, musisz zaimportować MyWorld.h, a nie MyWorld.mm.

2

Możesz chcieć sprawdzić ten projekt na github - to praca w toku, ale nadal:

https://github.com/lukhnos/refactorial

To narzędzie C++ refaktoring podstawie Clang (tzn sam Xcode kompilator oparty jest na).

+0

Projekt wygląda teraz całkiem martwy. : -/ –

+0

Cóż - ** AppCode ** to jest wtedy. – cacau

Powiązane problemy