Objective-C nie ma przestrzeni nazw; jest podobny do C, wszystko znajduje się w jednej globalnej przestrzeni nazw. Powszechną praktyką jest poprzedzanie klas inicjałami, np. Jeśli pracujesz w IBM, możesz poprzedzić je „IBM”; jeśli pracujesz dla firmy Microsoft, możesz użyć „MS”; i tak dalej. Czasami inicjały odnoszą się do projektu, np. Adium poprzedzone jest klasami „AI” (bo nie ma za tym firmy, która mogłaby wziąć inicjały). Apple poprzedza klasy z NS i mówi, że ten prefiks jest zarezerwowany tylko dla Apple.
Jak dotąd tak dobrze. Jednak dołączanie 2 do 4 liter do nazwy klasy z przodu to bardzo, bardzo ograniczona przestrzeń nazw. Na przykład MS lub AI mogą mieć zupełnie inne znaczenia (AI może być na przykład sztuczną inteligencją), a inny programista może zdecydować się na ich użycie i stworzyć równie nazwaną klasę. Bang , kolizja przestrzeni nazw.
Okay, jeśli jest to kolizja między jedną z twoich własnych klas a jedną z używanych przez ciebie zewnętrznych frameworków, możesz łatwo zmienić nazewnictwo swojej klasy, nic wielkiego. Ale co, jeśli używasz dwóch zewnętrznych frameworków, obu, których nie masz źródła i których nie możesz zmienić? Twoja aplikacja łączy się z nimi oboma i pojawiają się konflikty nazw. Jak byś sobie z tym poradził? Jaki jest najlepszy sposób na obejście ich, aby nadal można było korzystać z obu klas?
W C możesz obejść te problemy, nie łącząc się bezpośrednio z biblioteką, zamiast tego ładujesz bibliotekę w czasie wykonywania, używając dlopen (), a następnie znajdź symbol, którego szukasz, używając dlsym () i przypisujesz go do symbolu globalnego (który możesz dowolnie nazwać), a następnie uzyskać do niego dostęp za pośrednictwem tego globalnego symbolu. Np. Jeśli masz konflikt, ponieważ jakaś biblioteka C ma funkcję o nazwie open (), możesz zdefiniować zmienną o nazwie myOpen i wskazać na funkcję open () biblioteki, a więc kiedy chcesz użyć systemowej open () , po prostu używasz open (), a kiedy chcesz użyć drugiej, uzyskujesz do niej dostęp za pośrednictwem identyfikatora myOpen.
Czy coś podobnego jest możliwe w Objective-C, a jeśli nie, to czy jest jakieś inne sprytne, trudne rozwiązanie, którego możesz użyć do rozwiązania konfliktów przestrzeni nazw? Jakieś pomysły?
Aktualizacja:
Aby to wyjaśnić: odpowiedzi, które sugerują, jak z wyprzedzeniem uniknąć kolizji przestrzeni nazw lub jak stworzyć lepszą przestrzeń nazw, są z pewnością mile widziane; jednak nie przyjmuję ich jako odpowiedzi, ponieważ nie rozwiązują one mojego problemu. Mam dwie biblioteki i ich nazwy klas kolidują. Nie mogę ich zmienić; Nie mam źródła żadnego z nich. Kolizja już tam jest, a wskazówki, jak można było go uniknąć, już nie pomogą. Mogę przekazać je twórcom tych frameworków i mam nadzieję, że wybiorą lepszą przestrzeń nazw w przyszłości, ale na razie szukam rozwiązania do pracy z tymi frameworkami w ramach jednej aplikacji. Jakieś rozwiązania, które to umożliwią?