Jaki jest najlepszy sposób na rozwiązanie kolizji przestrzeni nazw Objective-C?

Objective-C nie ma przestrzeni nazw; jest bardzo podobny do C, wszystko jest w jednej globalnej przestrzeni nazw. Powszechną praktyką jest prefiksowanie klas inicjałami, np. jeśli pracujesz w IBM, możesz poprzedzić je „IBM”; jeśli pracujesz dla Microsoft, możesz użyć „MS”; i tak dalej. Czasami inicjały odnoszą się do projektu, np. Przedrostki klas Adium z „AI” (ponieważ nie ma za nimi firmy, której można by użyć inicjałów). Klasy prefiksów Apple z NS i mówi, że ten prefiks jest zarezerwowany tylko dla Apple.

Do tej pory tak dobrze. Ale dołączenie od 2 do 4 liter do nazwy klasy z przodu jest bardzo, bardzo ograniczoną przestrzenią nazw. Na przykład. MS lub AI mogą mieć zupełnie inne znaczenia (np. Sztuczna inteligencja może być sztuczną inteligencją), a jakiś inny programista może zdecydować się na ich użycie i stworzyć klasę o takiej samej nazwie.Huk, kolizja przestrzeni nazw.

Dobra, jeśli jest to kolizja między jedną z twoich własnych klas a jedną z zewnętrznych, z której korzystasz, możesz łatwo zmienić nazewnictwo swojej klasy, nic wielkiego.Ale co, jeśli używasz dwóch zewnętrznych struktur, do których nie masz źródła, i których nie możesz zmienić? Twoja aplikacja łączy się z obydwoma z nich i pojawia się konflikt nazw. Jak poszedłbyś rozwiązać te problemy? Jaki jest najlepszy sposób na obejście ich w taki sposób, że nadal możesz korzystać z obu klas?

W C możesz obejść je, nie łącząc się bezpośrednio z biblioteką, zamiast tego ładujesz bibliotekę w czasie wykonywania, używając dlopen (), a następnie odnajdziesz symbol, którego szukasz, używając dlsym () i przypisz go do symbolu globalnego (że można nazwać w dowolny sposób, a następnie uzyskać do niego dostęp za pomocą tego globalnego symbolu. Na przykład. jeśli masz konflikt, ponieważ niektóre biblioteki C mają funkcję o nazwie open (), możesz zdefiniować zmienną o nazwie myOpen i wskazać na funkcję open () biblioteki, a zatem, gdy chcesz użyć systemu open (), po prostu używasz open () i kiedy chcesz użyć drugiego, uzyskasz do niego dostęp za pomocą identyfikatora myOpen.

Czy jest coś podobnego w Objective-C, a jeśli nie, to czy jest jakieś inne sprytne i skomplikowane rozwiązanie, które można wykorzystać do rozwiązywania konfliktów przestrzeni nazw? Jakieś pomysły?

Aktualizacja:

Aby to wyjaśnić: odpowiedzi sugerujące, jak uniknąć kolizji przestrzeni nazw z wyprzedzeniem lub jak stworzyć lepszą przestrzeń nazw, są z pewnością mile widziane; jednak nie zaakceptuję ich jakoodpowiedź ponieważ nie rozwiązują mojego problemu. Mam dwie biblioteki i ich nazwy klas się kolidują. Nie mogę ich zmienić; Nie mam źródła żadnego z nich. Kolizja już istnieje, a wskazówki na temat tego, jak można było jej uniknąć, już nie pomogą. Mogę przekazać je twórcom tych ram i mam nadzieję, że w przyszłości wybiorą lepszą przestrzeń nazw, ale na razie szukam rozwiązania do pracy z ramami teraz w ramach jednej aplikacji. Jakieś rozwiązania, aby to umożliwić?

questionAnswers(13)

yourAnswerToTheQuestion