Je travaille sur le portage d'une base de code Java à Cocoa / Objective-C pour une utilisation sur Desktop Mac OS X. Le code Java a lots em> et lots em> de méthodes avec vérification Des exceptions comme: Quelle est la meilleure façon de les représenter dans l'objectif-C? Exceptions ou erreurs hors paramètres? P> ou p> J'ai le sentiment que les erreurs d'erreur sont généralement meilleures Solution pour Objective-C, mais comme vous pouvez le voir ... Beaucoup de méthodes telles que celle ci-dessus seront assez maladroites. Et encore une fois, il y a lots em> de ceux-ci. P> Bien sûr, gardez à l'esprit que, depuis ce sont des vérifiés em> exceptions à Java, je devrai ajouter soit Je me souviens d'entendre que lors de la saisie de @try code> blocs ou
si (* outerror) {...} code> vérifie où ces méthodes sont appelées ( lots em> de lieux). P >
@try code> Les blocs étaient une fois coûteux dans l'objectif-c, il est bon marché en 64 bits ou SL ou d'autres nouveaux env (ne vous rappelez pas exactement). Je ne suis pas du tout préoccupé par la compatibilité en arrière, donc je suis définitivement em> disposé à concevoir uniquement pour la nouvelle hotness. P> p>
6 Réponses :
Les exceptions sont probablement la meilleure approche, car l'Obj-C ABI 64 bits (Runtime) utilise des exceptions de coûts zéro, vous recevez donc un code de nettoyeur sans frais réel. Bien sûr, les anciennes exceptions SetJMP / LongJMP sont toujours utilisées et elles n'interagissent pas avec C ++, donc si c'est un objectif, vous avez un problème. P>
Thx pour la grande rétroaction Oliver. Et pour l'enregistrement, non. Je ne vais pas mélanger cette basebase avec C ++ de quelque manière que ce soit.
-1 Désolé, mais c'est des conseils terribles pour l'objectif-c. Toutes les exceptions ne sont pas "coût zéro", seules celles qui ne se produisent jamais réellement sont (beaucoup comme des serrures non compromises lors de la programmation avec une concurrence). Le moment où vous soulevez ("lancer") une exception, vous payez le prix. Réclamer des résultats dans "Codener Code" est un hareng rouge, car bien que le code de la bibliothèque puisse simplement soulever une exception, chaque client doit faire face à l'exception à l'aide de @try et @catch. La "voie de cacao" est d'utiliser des erreurs et des codes de retour pour de telles situations. Si vous souhaitez que le port soit bon code-C, n'utilisez pas d'exceptions.
@Quinn: Les exceptions "zéro coût" sont un terme bien compris qui signifie spécifiquement un coût zéro si l'exception n'est pas lancée. L'OBJ-C ABI 32 bits utilise SETJMP et LONDJMP pour mettre en œuvre des exceptions, ce qui signifie que @ TRY / @ CATCH ont un coût important, que l'exception soit lancée ou non.
Je comprends que, mais aux débutants de l'objectif - C, cela rend son sonner comme jetant une exception est "Coût zéro", ce qui n'est bien sûr pas. (Vous pouvez affirmer que l'utilisation de NSError est «encore plus zéro coût» que d'exceptions.) Mis à côté de cette question mineure, le plus grand boeuf est que les exceptions ne sont pas la bonne approche pour cette situation particulière. Il peut être correct en Java ou C ++, mais pas dans l'objectif-c. Je m'excuse si cela semblait être une attaque personnelle, je voulais juste que cela soit clairement clair aux lecteurs de la question qu'ils devraient considérer vivement à d'autres approches.
Vous avez raison que "les erreurs OUT sont généralement la meilleure solution pour l'OBJC". Très rarement, vous trouverez une API dans le cacao qui jette une exception (sauf si vous n'avez pas satisfait les conditions préalables à l'API, mais dans ce cas, le comportement n'est pas défini par défaut). P>
Si vous vous attendez à ce que ce code vivait au-delà de vous et qu'il soit adopté par d'autres développeurs de cacao, je vous recommanderais d'utiliser des erreurs. Je travaille sur le code construit par des personnes inconnues avec le cacao et qui a utilisé des exceptions libéralement, et ce sont des douleurs royales pour travailler. P>
Vous devriez éviter définitivement des exceptions forte> pour des choses comme des chiffres d'analyse des chaînes. Dans l'objectif-C, les exceptions représentent une erreur de programmeur, pas une erreur d'entrée utilisateur, ni même des fichiers indisponibles. (Une partie de la raison est que la manipulation des exceptions est toujours plus coûteuse et complexe que la manipulation des erreurs «conventionnelle». Quel que soit le fait que Saisie de de Documents d'Apple : P >
"Dans de nombreux environnements, l'utilisation d'exceptions est assez banale. Par exemple, vous pouvez lancer une exception pour signaler qu'une routine ne pouvait pas exécuter normalement, comme lorsqu'un fichier est manquant ou que des données n'ont pas pu être analysées correctement. . Les exceptions sont intensives de ressources dans l'objectif-c. Vous ne devez pas utiliser d'exceptions pour la commande de flux général ou simplement pour signifier des erreurs. Au lieu de cela, vous devez utiliser la valeur de retour d'une méthode ou une fonction pour indiquer qu'une erreur s'est produite et fournissez informations sur le problème dans un objet d'erreur. " em> p>
blockQuote>
Regardez à quel point les classes de cacao intégrées gèrent des erreurs comme celle-ci. Par exemple, Nstring a des méthodes telles que Outre la convention OBEJCTCtive-C et les meilleures pratiques, NSError est beaucoup plus robuste et flexible que Nsexception et permet à l'appelant d'ignorer efficacement le problème si elles le souhaitent. Je suggère de lire via le Guide de programmation des erreurs pour le cacao . Bien que le code porté puisse finir de manière totalement différente du code Java, reconnaissez qu'il sera utilisé par le code de l'objectif-C et non les mêmes clients de l'équivalent Java. Correspondre certainement aux idiomes de la langue. Le port ne sera pas une image miroir du code Java, mais ce sera beaucoup plus correct (pour l'objectif-c) en conséquence. P> @> Les blocs sont" zéro coût "en 64 bits
, c'est toujours Lent quand une exception est effectivement surélevée.) Bien sûr, vous êtes autorisé à utiliser des exceptions comme vous le souhaitez, mais ce n'est pas la manière de cacao, et vous vous retrouverez en attente avec un autre code de l'objectif-C. Les personnes qui utilisent votre code seront incroyablement énervées que vous lancez des exceptions dans des cas qui devraient simplement entraîner une erreur. P>
-floatvalue code> qui retourne 0 s'il échoue. Une meilleure solution pour votre situation particulière pourrait être la façon dont Nsscanner fait il, telle que dans
-Scanfloat: code> - accepte un pointeur sur le champ où le résultat doit être stocké et renvoyer
oui code> ou
non code> basé sur si l'analyse a réussi. P>
nserror ** code> param, je vous suggère fortement de concevoir pour permettre au client de passer
null code> si elles ne le font pas vouloir recevoir des informations d'erreur. Chaque classe de cacao est au courant de cela pour les erreurs, y compris Nstring. P>
J'aime particulièrement le conseil code> nsscanner code> qui aidera à nettoyer ces noms de méthodes un peu et à les rendre plus naturels à Objc.
en cacao, des exceptions ne sont vraiment censées être utilisées pour "erreurs de programmation;" La philosophie est de laisser l'application les attraper, donnez à l'utilisateur la possibilité d'enregistrer ce qu'ils font et cesser de fumer. Pour une chose, tous les cadres ni les chemins de codes ne peuvent pas être à 100% à l'exception d'exception, il peut donc être le seul plan d'action sûr. Pour les erreurs qui peuvent être anticipées et récupérées, vous devez utiliser NSError, généralement via un paramètre Out-Paramètre. P>
Ainsi, les exceptions de l'objectif-C sont similaires à la manière dont l'erreur est définie dans Java: vous n'êtes pas censé les gérer, mais plutôt fermée gracieusement.
Je suis un grand fan de l'approche d'erreur Out que Objective-C utilise. Vous devez gérer des exceptions, mais vous pouvez choisir d'ignorer des erreurs si vous le souhaitez. Tout correspond à l'attitude de l'objectif-C que "le programmeur sait ce qu'ils font". Cela rend également l'objectif - C une langue très propre, car votre code n'est pas encombré de blocs d'essais. P>
Cela dit - vous voudrez peut-être envisager: y a-t-il des scénarios où des exceptions sont ignorées? Les exceptions que vous lancez vraiment critiques em>? Vous retrouvez-vous écrire des blocs de capture simples qui nettoient des variables et continuent-ils? Je me pencherais vers les erreurs parce que j'aime les réserves de la syntaxe et de l'objectif-c exceptions pour les erreurs les plus critiques. P>
HRM, bien dans la source Java, ce sont des exceptions i> cochées i>, donc avec la conception actuelle, oui, ils doivent absolument être traités. Quant à Weher, ils sont vraiment critiques, je suppose que c'est une question plus difficile. Peut-être qu'ils ne sont pas vraiment critiques et que l'auteur original profitait simplement d'une belle caractéristique de la langue originale (Java). Je dirai ... J'ai le respect le plus élevé de l'auteur d'origine. Il connaît certainement ses affaires (au moins en Java).
+1 Pour être sûr, aucun manque de respect n'est destiné à l'auteur d'origine. Lorsque j'écris à Java, je suis des conventions (la langue et de mon équipe) et jetez souvent des exceptions vérifiées dans des cas similaires. C'est plus une considération de contexte et ce qui convient au mieux avec un contexte donné. Il est également agréable de laisser le client décider quand il est vraiment essentiel de gérer une erreur, plutôt que de toujours avoir à défendre contre une exception numérique, NullpointException, etc.
Son ressemble à ces exceptions vérifiées de manière plus proprement la carte des erreurs. Des exceptions pourraient toujours être utilisées, mais devraient être réservées à des circonstances exceptionnelles. P>
Pour ceux qui suivent à la maison, j'ai décidé d'aller sans faute et de suivre les conseils NSScanner de Quinn. Donc, cette méthode particulière serait quelque chose comme:
- (bool) GetNumber: (CGFLOAT *) Erreur Outnum: (NSERROR **) OUTERR; CODE>
@olliej indique correctement que les blocs de départ sont «Coût zéro» dans le runtime moderne (64 bits et iPhone), mais des exceptions encore coûtent lorsque vous les jetez réellement. De plus, vous pouvez utiliser
double code> à la place de
cgfloat code> si vous le souhaitez. Allez avec tout ce qui est la meilleure pratique pour l'environnement et le code que vous intégrez.