Quelle est la meilleure façon de résoudre un Objectif-C de l'espace de noms de collision?

Objective-C n'a pas d'espaces de noms; c'est un peu comme le C, le tout est dans un espace de noms global. La pratique courante est de préfixe des classes avec des initiales, par exemple, si vous travaillez au sein d'IBM, vous pouvez préfixer avec "IBM"; si vous travaillez pour Microsoft, vous pouvez utiliser "MS"; et ainsi de suite. Parfois les initiales reportez-vous à ce projet, par exemple Adium préfixes de classes avec "AI" (comme il n'y a pas d'entreprise derrière elle, ce que l'on pouvait prendre les initiales). Apple préfixes de classes avec NS et dit ce préfixe est réservé pour Apple uniquement.

C'est très bien. Mais en ajoutant 2 à 4 lettres pour un nom de classe à l'avant est un très, très peu d'espace de noms. E. g. MS ou IA pourrait avoir un tout autre sens (IA pourrait être l'Intelligence Artificielle par exemple) et quelques autres développeur peut décider de les utiliser et de créer un même nom de la classe. Bang, de l'espace de noms de collision.

Bon, si c'est une collision entre un de vos propres classes et un de un cadre externe que vous utilisez, vous pouvez facilement changer la dénomination de votre classe, pas une grosse affaire. Mais que faire si vous utilisez deux cadres, deux cadres que vous n'avez pas la source et que vous ne pouvez pas changer? Votre demande de liens avec les deux et vous obtenez des conflits de nom. Comment feriez-vous pour la résolution de ces? Quelle est la meilleure façon de travailler autour d'eux, de telle sorte que vous pouvez toujours utiliser les deux classes?

En C, vous pouvez contourner ces par ne pas relier directement à la bibliothèque, au lieu de charger la bibliothèque au moment de l'exécution, à l'aide de dlopen(), puis de trouver le symbole que vous recherchez à l'aide de dlsym() et de l'affecter à un symbole mondial (que vous pouvez nommer comme vous le souhaitez), puis accès par le biais de ce symbole mondial. E. g. si vous avez un conflit, parce que certains de la bibliothèque C a une fonction nommée open(), vous pouvez définir une variable nommée myOpen et de pointer à la fonction open() de la bibliothèque, ainsi, lorsque vous souhaitez utiliser le système open(), il suffit d'utiliser open() et lorsque vous souhaitez utiliser l'autre, vous y accédez via le myOpen identificateur.

Est quelque chose de semblable possible en Objective-C et si non, est-il un autre intelligent, rusé solution, vous pouvez utiliser de résoudre les conflits d'espace de noms? Des idées?


Mise à jour:

Juste pour clarifier ce: les réponses qui suggèrent comment éviter les collisions d'espace de noms à l'avance ou comment créer un meilleur espace de noms sont certainement les bienvenus; cependant, je ne vais pas l'accepter comme la réponse car ils ne permettent pas de résoudre mon problème. J'ai deux bibliothèques et leurs noms de classe entrent en collision. Je ne peux pas les changer, je n'ai pas la source de l'un des deux. La collision est déjà là et des conseils sur comment cela aurait pu être évité à l'avance ne sert plus à rien. Je peux transmettre les développeurs de ces cadres et de l'espoir qu'ils choisissent un meilleur espace de noms dans le futur, mais pour le moment, je suis à la recherche d'une solution de travail avec les cadres de la droite maintenant dans une seule application. Toutes les solutions pour rendre cela possible?

  • Vous avez une bonne question (que faire si vous avez besoin de deux cadres qui ont une collision de nom), mais il est enterré dans le texte. Réviser pour le rendre plus clair, et vous éviter les réponses simplistes comme celui que vous avez maintenant.
  • C'est mon plus gros reproche à la conception actuelle de l'Objective-C langue. Regardez les réponses ci-dessous; celles qui traitent de la question (NSBundle de déchargement, à l'aide de N', etc) sont hideux hacks qui ne doivent pas être nécessaire pour quelque chose d'aussi banal que d'éviter un conflit de noms.
  • Amen. Je suis en train d'apprendre l'obj-c, et de frapper cette question. Est venu ici à la recherche d'une solution simple.... boiteux.
  • Pour l'enregistrement, techniquement C et Objective-C de fournir un support pour de multiples espaces de nom — pas exactement ce que l'OP est à la recherche d', cependant. Voir objectivistc.tumblr.com/post/3340816080/...
  • Hmm, je ne le savais pas. Une sorte de terrible décision de conception, non?
InformationsquelleAutor Mecki | 2008-10-07