Comment Objective-C se compare-t-il à C #? [fermé]

87

J'ai récemment acheté un Mac et je l'utilise principalement pour le développement C # sous VMWare Fusion. Avec toutes les belles applications Mac, j'ai commencé à penser à Xcode qui se cache à un clic d'installation et à apprendre Objective-C.

La syntaxe entre les deux langages est très différente, probablement parce que Objective-C a ses origines en C et C # a ses origines en Java / C ++. Mais différentes syntaxes peuvent être apprises, ce qui devrait être correct.

Ma principale préoccupation est de travailler avec le langage et de savoir si cela aidera à produire du code bien structuré, lisible et élégant. J'apprécie vraiment les fonctionnalités telles que LINQ et var en C # et je me demande s'il existe des équivalents ou des fonctionnalités meilleures / différentes dans Objective-C.

Quelles fonctionnalités du langage me manqueront-elles en développant avec Objective-C? Quelles fonctionnalités vais-je gagner?

Edit: Les comparaisons de cadres sont utiles et intéressantes, mais une comparaison de langue est ce que cette question pose vraiment (en partie ma faute pour le tag initial avec.net ). On peut supposer que Cocoa et .NET sont des frameworks très riches à part entière et ont tous deux leur objectif, l'un ciblant Mac OS X et l'autre Windows.

Merci pour les points de vue bien pensés et raisonnablement équilibrés jusqu'à présent!

Alex Angas
la source
27
Xcode n'est pas parfait, mais il possède certainement de nombreuses fonctionnalités puissantes et utiles. Dénigrer quelque chose en tant que «mal pur» sans le sauvegarder ou fournir un contexte de comparaison est un FUD qui n'aide personne. En tout cas, cela n'a aucun rapport avec la question.
Quinn Taylor le
11
Xcode 3.2 est probablement le meilleur IDE que j'ai jamais utilisé, avec sa gestion élégante des points d'arrêt, son analyse statique, ses messages d'erreur en ligne et des tonnes d'autres fonctionnalités. Btw, c'est "Xcode" et non "XCode". @Nathan, je ne vois vraiment pas pourquoi vous devez dénigrer Xcode en l'appelant "pur mal" - sans aucune justification - dans une discussion sur les langues.
PlagueHammer le
6
Une grande chose que vous gagnerez en utilisant Objective-C est que vous aurez accès aux frameworks Cocoa. De plus, C, C #, Java et C ++ partagent tous un héritage syntaxique commun. Objective-C tire sa syntaxe de Smalltalk.
Amok le
4
Vous travaillez en C # avec VMWare Fusion? Utilisez simplement mono et monodevelop (qui est une version open-source de .NET et Visual Studio qui fonctionne sur Mac et Linux. En utilisant Mono, vous pouvez également créer des applications Mac et iPhone en utilisant C # tout en utilisant la bibliothèque .NET, ainsi que Cocoa ...
Robin Heggelund Hansen
5
@ user668039 15 ans d'expérience avec C #? Il est sorti en 2001!
Ian Newson

Réponses:

89

Aucun langage n'est parfait pour toutes les tâches, et Objective-C ne fait pas exception, mais il existe des subtilités très spécifiques. Comme utiliserLINQ and var(pour lequel je ne suis pas au courant d'un remplacement direct), certains d'entre eux sont strictement liés au langage, et d'autres sont liés au cadre.

( REMARQUE: tout comme C # est étroitement couplé avec .NET, Objective-C est étroitement couplé avec Cocoa. Par conséquent, certains de mes points peuvent sembler sans rapport avec Objective-C, mais Objective-C sans Cocoa s'apparente à C # sans .NET / WPF / LINQ, fonctionnant sous Mono, etc. Ce n'est tout simplement pas la façon dont les choses se font habituellement.)

Je ne prétendrai pas expliquer complètement les différences, les avantages et les inconvénients, mais en voici quelques-uns qui me viennent à l'esprit.

  • L'une des meilleures parties d'Objective-C est la nature dynamique - plutôt que d'appeler des méthodes, vous envoyez des messages, que le runtime achemine dynamiquement. Combiné (judicieusement) avec le typage dynamique, cela peut rendre de nombreux modèles puissants plus simples ou même triviaux à implémenter.

  • En tant que sur-ensemble strict de C, Objective-C croit que vous savez ce que vous faites. Contrairement à l'approche gérée et / ou sécurisée de langages comme C # et Java, Objective-C vous permet de faire ce que vous voulez et d'en ressentir les conséquences. Évidemment, cela peut parfois être dangereux, mais le fait que la langue ne vous empêche pas activement de faire la plupart des choses est assez puissant. ( EDIT: Je dois préciser que C # a également des fonctionnalités et des fonctionnalités "non sécurisées", mais le comportement par défaut est le code géré, que vous devez explicitement désactiver. Par comparaison, Java uniquement permet, et jamais pour typesafe le code expose des pointeurs premières en comme le font C et d'autres.)

  • Les catégories (ajouter / modifier des méthodes sur une classe sans sous-classer ou avoir accès aux sources) est une épée à double tranchant impressionnante. Cela peut considérablement simplifier les hiérarchies d'héritage et éliminer le code, mais si vous faites quelque chose d'étrange, les résultats peuvent parfois être déconcertants.

  • Cocoa rend la création d'applications GUI beaucoup plus simple à bien des égards, mais vous devez comprendre le paradigme. La conception MVC est omniprésente dans Cocoa et les modèles tels que les délégués, les notifications et les applications d'interface graphique multithread sont bien adaptés à Objective-C.

  • Les liaisons Cocoa et l'observation des valeurs clés peuvent éliminer des tonnes de code glue, et les frameworks Cocoa en tirent largement parti. La répartition dynamique d'Objective-C fonctionne de pair avec cela, de sorte que le type de l'objet n'a pas d'importance tant qu'il est conforme à la valeur clé.

  • Vous manquerez probablement des génériques et des espaces de noms, et ils ont leurs avantages, mais dans l'état d'esprit et le paradigme Objective-C, ce seraient des subtilités plutôt que des nécessités. (Les génériques sont tous une question de sécurité de type et d'éviter la conversion, mais le typage dynamique en Objective-C en fait essentiellement un non-problème. Les espaces de noms seraient bien s'ils étaient bien faits, mais c'est assez simple pour éviter les conflits que le coût dépasse sans doute les avantages, en particulier pour le code hérité.)

  • Pour la concurrence, les blocs (une nouvelle fonctionnalité de langage de Snow Leopard et implémentée dans de nombreuses API Cocoa) sont extrêmement utiles. Quelques lignes (fréquemment couplées à Grand Central Dispatch, qui fait partie de libsystem sur 10.6) peuvent éliminer un passe-partout important de fonctions de rappel, de contexte, etc. (les blocs peuvent également être utilisés en C et C ++, et pourraient certainement être ajoutés à C #, Ce serait génial.) NSOperationQueue est également un moyen très pratique d'ajouter la concurrence à votre propre code, en distribuant soit des sous-classes NSOperation personnalisées, soit des blocs anonymes que GCD exécute automatiquement sur un ou plusieurs threads différents pour vous.

Quinn Taylor
la source
7
Pointeurs premières, l' arithmétique des pointeurs, tableaux liés-incontrôlées, les syndicats,: Techniquement, C # a non-type sécurisé puissance dispose que ObjC fait alloca. Cela ne les rend tout simplement pas aussi facilement accessibles - vous devez les activer explicitement.
Pavel Minaev le
8
Je mentionne simplement Cocoa parce que la plupart de l'attrait de la programmation en Objective-C est dû aux frameworks Cocoa. Le C # serait-il intéressant sans .NET et / ou WPF? Le demandeur a spécifiquement mentionné LINQ, donc il regarde évidemment au-delà de la langue, vers l'expérience.
Quinn Taylor le
7
Ce qui est bien. Je n'essaye pas de me battre avec C #. Si je devais écrire un logiciel Windows, c'est ce que j'utiliserais. J'essaie simplement de souligner les similitudes et les différences entre les langues et les outils associés. Vous êtes évidemment plus expérimenté avec C #, et moi avec Objective-C. J'apprécie vos éclaircissements, mais peut-être que des réponses plus constructives et moins de partage des cheveux seront les plus utiles.
Quinn Taylor le
11
Ce n'est pas époustouflant, Quinn. J'ai simplement souligné que ce qui a commencé comme une comparaison linguistique s'est transformé en discussion générale sur la façon dont Cocoa est bon à un moment donné de votre réponse. Je voudrais quand même souligner que vos points sur Cocoa ne sont pas des comparaisons - ils disent "ça fait X bien" - et c'est peut-être le cas - mais ils ne disent pas "ça fait X mieux / pire que C # + WPF ", sur quoi porte la question au sens large.
Pavel Minaev le
6
+1 excellente réponse Quinn
h4xxr
54

Je programme en C, C ++ et C # maintenant depuis plus de 20 ans, commencé en 1990. Je viens de décider de jeter un œil au développement iPhone et Xcode et Objective-C. Oh mon Dieu ... toutes les plaintes concernant Microsoft que je reprends, je me rends compte maintenant à quel point le code a été mauvais. Objective-C est trop complexe par rapport à ce que fait C #. J'ai été gâté avec C # et maintenant j'apprécie tout le travail acharné de Microsoft. Il est difficile de lire simplement Objective-C avec la méthode invoque. C # est élégant dans ce domaine. C'est juste mon avis, j'espérais que le langage de développement Apple était aussi bon que les produits Apple, mais cher moi, ils ont beaucoup à apprendre de Microsoft. Il n'y a aucune question d'application C # .NET Je peux obtenir une application opérationnelle plusieurs fois plus rapidement que XCode Objective-C. Apple devrait certainement prendre une feuille du livre de Microsoft ici et nous aurions alors l'environnement parfait. :-)

Waz
la source
47
Même si vous avez jeté un coup d'œil à un livre de développement iPhone, vous êtes toujours en mesure de créer une application plus rapidement sur une plate-forme sur laquelle vous avez 20 ans d'expérience? AMAZING
kubi
25
J'ai exactement la même expérience que Waz. Je suis également beaucoup plus reconnaissant pour le travail que Microsoft a mis en C # et les outils de développement tels que Visual Studio, après avoir commencé à apprendre l'Objectif C.
René
4
C'était aussi mon expérience en étudiant l'objectif-c, la surcomplexité par rapport à c #. @ alexy13 Quelle partie du c et du c ++ du message original avez-vous manqué? Avoir des décennies d'expérience dans une famille de langues aide BEAUCOUP à évaluer à quel point il est difficile de faire le même travail avec une autre langue de la même famille.
Anderson Fortaleza
5
comment est cette meilleure réponse? ce n'est pas une réponse concise, juste une opinion clairement biaisée d'une langue qu'il a apprise du jour au lendemain par rapport à une langue qu'il utilise depuis plus de 20 ans ... évidemment, vous ne serez pas aussi compétent sur la nouvelle langue
Heavy_Bullets
3
"Just reading Objective-C with method invokes is difficult to read"- voici juste un argument très subjectif qui est mentionné ici comme contre d'Obj-C. Tout autre n'est que rhétorique contestable.
skywinder
46

Pas de revue technique ici, mais je trouve juste Objective-C beaucoup moins lisible. Compte tenu de l'exemple que Cinder6 vous a donné:

C #

List<string> strings = new List<string>();
strings.Add("xyzzy");                  // takes only strings
strings.Add(15);                       // compiler error
string x = strings[0];                 // guaranteed to be a string
strings.RemoveAt(0);                   // or non-existant (yielding an exception)

Objectif c

NSMutableArray *strings = [NSMutableArray array];
[strings addObject:@"xyzzy"];
[strings addObject:@15];
NSString *x = strings[0];
[strings removeObjectAtIndex:0];

Ça a l'air horrible. J'ai même essayé de lire 2 livres dessus, ils m'ont perdu très tôt, et normalement je ne comprends pas ça avec les livres / langages de programmation.

Je suis content que nous ayons Mono pour Mac OS, car si je devais compter sur Apple pour me donner un bon environnement de développement ...

TimothyP
la source
17
Ignorant le fait que la 1ère ligne doit se terminer par [NSMutableArray array](il perd de la mémoire) et la 4ème ligne doit commencer par NSString* xou id x(erreur de compilation) ... Oui, Objective-C manque de génériques (honnêtement, je ne les manque pas), vous ne 't index des objets avec une syntaxe de tableau, et les API sont généralement plus verbeuses. To-may-to, to-mah-to. Cela dépend vraiment de ce que vous préférez voir. (Vous pourriez écrire le même code en C ++ STL et je pense que c'était hideux.) Pour moi, un code lisible signifie souvent que le texte du code vous dit ce qu'il fait, et donc le code Objective-C est préférable.
Quinn Taylor le
18
Je ne trouve vraiment rien de mal avec la syntaxe en tant que telle - la principale raison pour laquelle elle semble moins lisible est que 1) elle n'est pas familière à tout le monde venant de l'arrière-plan C, et 2) elle est utilisée au milieu de constructions C simples, où elle semble extraterrestre. D'autre part, Smalltalkish named-parameters-as-part-of-method-name rend en fait les appels plus compréhensibles dès le départ. En fait, votre exemple de code C # le démontre bien: il ne se compilera pas, car List<T>.Removeprend une chaîne comme argument et supprime la première occurrence de cette chaîne. Pour supprimer par index, vous avez besoin RemoveAt.
Pavel Minaev le
12
... alors que la version ObjC avec removeObjectAtIndex:, bien que plus verbeuse, est également sans ambiguïté quant à ce qu'elle fait.
Pavel Minaev le
6
Excellents points, Pavel. De plus, l'incohérence entre strings[0]et strings.RemoveAt(0)nuit à la clarté, du moins pour moi. (De plus, cela me dérange toujours lorsque les noms de méthodes commencent par une majuscule ... Je sais que c'est un petit problème, mais c'est juste bizarre.)
Quinn Taylor
4
Dans mon cas, comme pour beaucoup de gens, la lisibilité de «l'outil» affecte ma productivité. Je suis à l'aise et productif avec de nombreux langages Objective-C cependant, n'a jamais été l'un d'eux et ce n'est pas faute d'essayer. Mais encore une fois, en fin de compte, tout est question de préférence personnelle. Contrairement à il y a 20 ans, vous n'êtes pas obligé d'utiliser le langage X pour cibler la plateforme Y. Vous choisissez ce qui vous convient le mieux.
TimothyP
17

La gestion manuelle de la mémoire est quelque chose avec laquelle les débutants d'Objective-C semblent avoir le plus de problèmes, principalement parce qu'ils pensent qu'elle est plus complexe qu'elle ne l'est.

Objective-C et Cocoa par extension s'appuient sur des conventions de mise en application; connaître et suivre un très petit ensemble de règles et vous en obtenez beaucoup gratuitement grâce à l'exécution dynamique en retour.

La règle pas 100% vraie, mais assez bonne pour tous les jours est:

  • Chaque appel à allocdoit être associé à unrelease à la fin de la portée actuelle.
  • Si la valeur de retour de votre méthode a été obtenue d'ici alloclà, elle doit être renvoyée par return [value autorelease];au lieu d'être mise en correspondance par unrelease .
  • Utilisez les propriétés et il n'y a pas de règle trois.

L'explication plus longue suit.

La gestion de la mémoire est basée sur la propriété; seul le propriétaire d'une instance d'objet devrait jamais libérer l'objet, tout le monde ne devrait toujours rien faire. Cela signifie que dans 95% de tout le code, vous traitez Objective-C comme s'il s'agissait d'un ramasse-miettes.

Alors qu'en est-il des 5% restants? Vous avez trois méthodes à rechercher, toute instance d'objet reçue de ces méthodes appartient à la portée de la méthode actuelle :

  • alloc
  • Toute méthode commençant par le mot nouveau , comme newou newService.
  • Toute méthode contenant le mot copie, telle que copyet mutableCopy.

La méthode a trois options possibles quant à ce qu'il faut faire avec ses instances d'objet possédées avant sa fermeture:

  • Relâchez-le en utilisant releases'il n'est plus nécessaire.
  • Donner la propriété du champ a (variable d'instance) ou à une variable globale en l'attribuant simplement.
  • Renoncez à la propriété, mais donnez à quelqu'un d'autre une chance de devenir propriétaire avant que l'instance ne disparaisse en appelant autorelease.

Alors, quand devriez-vous vous approprier pro-activement en appelant retain? Deux cas:

  • Lors de l'affectation de champs dans vos initialiseurs.
  • Lors de la mise en œuvre manuelle de la méthode setter.
PeyloW
la source
2
+1 Excellent résumé. Cela ressemble beaucoup à quand j'ai appris C il y a des années.
Alex Angas
4
Juste pour clarifier, le garbage collection est entièrement pris en charge pour Objective-C sur Mac, et il n'est pas nécessaire de faire une gestion manuelle de la mémoire. La gestion manuelle de la mémoire n'est requise que sous iOS.
PlagueHammer
3
Néanmoins, il est bon d'apprendre les bases de la gestion de la mémoire, ne serait-ce que pour améliorer les performances lorsque vous en avez besoin (pas besoin d'exécuter le garbage collection).
FeifanZ
3
iOS 5 a introduit ARC, supprimant la nécessité de libérer manuellement l'objet alloué. Mais ce n'est toujours pas aussi simple que C #. Vous devez garder à l'esprit qu'Objective-C a plus de 20 ans et qu'il a conservé certaines des exigences des langages à l'époque: savoir quand allouer et quand libérer / libérer de la mémoire. C # a supprimé tout cela pour vous. Cela dit, Cocoa possède de nombreuses API qui ne sont pas encore aussi accessibles dans Windows Phone. Tels que les gestes, beaucoup plus de contrôles en ce qui concerne les événements de l'interface utilisateur, etc.
jyavenard
10

Bien sûr, si tout ce que vous avez vu dans votre vie est l'Objectif C, alors sa syntaxe ressemble à la seule possible. Nous pourrions vous appeler une "vierge de la programmation".

Mais comme beaucoup de code est écrit en C, C ++, Java, JavaScript, Pascal et d'autres langages, vous verrez qu'ObjectiveC est différent de tous, mais pas dans le bon sens. Avaient-ils une raison à cela? Voyons d'autres langues populaires:

C ++ a ajouté de nombreux extras à C, mais il n'a changé la syntaxe d'origine que dans la mesure nécessaire.

C # a ajouté beaucoup d'extras par rapport au C ++, mais il n'a changé que des choses qui étaient laides en C ++ (comme supprimer le "::" de l'interface).

Java a changé beaucoup de choses, mais il a conservé la syntaxe familière sauf dans les parties où le changement était nécessaire.

JavaScript est un langage complètement dynamique qui peut faire beaucoup de choses qu'ObjectiveC ne peut pas faire. Pourtant, ses créateurs n'ont pas inventé une nouvelle façon d'appeler des méthodes et de passer des paramètres juste pour être différents du reste du monde.

Visual Basic peut passer des paramètres dans le désordre, tout comme ObjectiveC. Vous pouvez nommer les paramètres, mais vous pouvez également les transmettre de la manière habituelle. Quoi que vous utilisiez, c'est une manière normale délimitée par des virgules que tout le monde comprend. La virgule est le délimiteur habituel, non seulement dans les langages de programmation, mais dans les livres, les journaux et la langue écrite en général.

Object Pascal a une syntaxe différente de C, mais sa syntaxe est en fait PLUS FACILE à lire pour le programmeur (peut-être pas pour l'ordinateur, mais qui se soucie de ce que pense l'ordinateur). Alors peut-être qu'ils ont digressé, mais au moins leur résultat est meilleur.

Python a une syntaxe différente, qui est encore plus facile à lire (pour les humains) que Pascal. Donc, quand ils l'ont changé, le rendant différent, au moins ils l'ont amélioré pour nous, les programmeurs.

Et puis nous avons ObjectiveC. Ajout de quelques améliorations à C, mais inventant sa propre syntaxe d'interface, appel de méthode, passage de paramètres et autres. Je me demande pourquoi n'ont-ils pas échangé + et - de sorte que plus soustrait deux nombres. Ça aurait été encore plus cool.

Steve Jobs a foiré en soutenant ObjectiveC. Bien sûr, il ne peut pas supporter C #, ce qui est mieux, mais appartient à son pire concurrent. C'est donc une décision politique, pas une décision pratique. La technologie souffre toujours lorsque les décisions technologiques sont prises pour des raisons politiques. Il doit diriger l'entreprise, ce qu'il fait bien, et laisser les questions de programmation à de vrais experts.

Je suis sûr qu'il y aurait encore plus d'applications pour iPhone s'il décidait d'écrire iOS et de prendre en charge les bibliothèques dans un autre langage que ObjectiveC. Pour tout le monde, sauf les fans inconditionnels, les programmeurs vierges et Steve Jobs, ObjectiveC semble ridicule, laid et répugnant.

user561168
la source
3
les 2 derniers paragraphes résument tout
Zakos
Oh ouais, bien sûr, la syntaxe semble ridicule, mais le joyau du langage Objective-C est qu'il a presque le reflet le plus facile à utiliser de tous les langages et des fonctionnalités d'exécution vraiment brillantes qui rendent plusieurs paradigmes presque triviaux à implémenter. Par exemple, lorsque j'utilise Objective-C, je n'ai jamais besoin de me soucier de la table linéaire à utiliser - liste chaînée ou vecteur ou autre - NSArrayet gère la sélection du meilleur algorithme en fonction de la machine et de la nature des données.
Maxthon Chan
Je suis entré dans mon premier travail en tant que programmeur (vierge) implémentant des interfaces utilisateur iOS-App dans Objective-C. Tout ce que je veux pour l'instant (après 3 ans), c'est de sortir de cette «île» solitaire et d'apprendre quelque chose de plus indépendant de la plateforme et donc de plus fondateur. Aussi pour apprendre si d'autres frameworks sont également mis à jour si rapidement - et bogués. Hey! Nouvelle fonctionnalité! - Crash ... J'espère que le centre d'emploi (allemand) dépense de l'argent pour moi sur des tutoriels en Java et / ou C ++ / C # car je ne veux plus développer pour Apple sh * t.
anneblue
5

Une chose que j'aime à propos d'objectif-c est que le système d'objets est basé sur des messages, il vous permet de faire de très belles choses que vous ne pourriez pas faire en C # (du moins pas tant qu'ils ne supportent pas le mot-clé dynamic!).

Interface Builder est un autre avantage de l'écriture d'applications cacao, c'est beaucoup plus agréable que le concepteur de formulaires de Visual Studio.

Les choses à propos d'obj-c qui me gênent (en tant que développeur C #) sont le fait que vous devez gérer votre propre mémoire (il y a le ramasse-miettes, mais cela ne fonctionne pas sur l'iPhone) et que cela peut être très verbeux à cause de la syntaxe du sélecteur et tous les [].

jonnii
la source
2
dynamicvous obtiendrez seulement à mi-chemin - l'implémentation d'un véritable objet dynamique, même avec des choses triviales telles que la délégation de message, est fastidieuse même en C # 4.0. En revanche, le prix de la flexibilité véritable message dynamique passant à la objC est une perte de type sécurité.
Pavel Minaev le
3
Il convient de souligner que Objective-C permet le typage statique opt-in, ce qui offre un degré beaucoup plus élevé de sécurité de type. Certaines personnes préfèrent la vérification à la compilation, d'autres préfèrent la vérification à l'exécution. La bonne chose (dans les deux langues) est que le choix n'est pas nécessairement absolu.
Quinn Taylor le
3
Le concepteur de Windows Forms n'est pas si génial, mais si vous pouvez utiliser WPF (à partir de .NET 3.0), Expression Blend est difficile à battre ...
Nate le
Vous pouvez faire beaucoup de cela avec System.Reflectioncombiné avec des extensions en C # 3.0, vous pouvez appeler n'importe quelle méthode que vous trouvez, mais ce n'est pas un vrai passage de message, cela ressemblera à obj.PassMessage("function_name", params object[] args);un meilleur passage de message intégré au langage, la méthode manquante appelable sur un objet normal serait nécessaire.
Filip Kunc
4

En tant que programmeur débutant avec Objective-C pour iPhone, issu de C # 4.0, il me manque des expressions lambda, et en particulier Linq-to-XML. Les expressions lambda sont spécifiques à C #, tandis que Linq-to-XML est vraiment plus un contraste .NET vs Cocoa. Dans un exemple d'application que j'écrivais, j'avais du XML dans une chaîne. Je voulais analyser les éléments de ce XML dans une collection d'objets.

Pour accomplir cela dans Objective-C / Cocoa, j'ai dû utiliser la classe NSXmlParser . Cette classe s'appuie sur un autre objet qui implémente le protocole NSXMLParserDelegate avec des méthodes qui sont appelées (read: messages envoyés) lorsqu'une balise ouverte d'élément est lue, lorsque certaines données sont lues (généralement à l'intérieur de l'élément), et lorsqu'une balise de fin d'élément est lue . Vous devez suivre l'état et l'état de l'analyse. Et honnêtement, je n'ai aucune idée de ce qui se passe si le XML est invalide. C'est génial pour aller dans les détails et optimiser les performances, mais oh mec, c'est beaucoup de code.

En revanche, voici le code en C #:

using System.Linq.Xml;
XDocument doc = XDocument.Load(xmlString);
IEnumerable<MyCustomObject> objects = doc.Descendants().Select(
         d => new MyCustomObject{ Name = d.Value});

Et c'est tout, vous avez une collection d'objets personnalisés tirés de XML. Si vous vouliez filtrer ces éléments par valeur, ou uniquement ceux qui contiennent un attribut spécifique, ou si vous vouliez simplement les 5 premiers, ou sauter le premier 1 et obtenir les 3 suivants, ou simplement savoir si des éléments ont été renvoyés ... BAM, tout est là dans la même ligne de code.

Il existe de nombreuses classes open-source qui rendent ce traitement beaucoup plus facile en Objective-C, ce qui fait une grande partie du gros du travail. Ce n'est tout simplement pas intégré.

* REMARQUE: je n'ai pas compilé le code ci-dessus, il est simplement destiné à illustrer le manque relatif de verbosité requis par C #.

Brentlightsey
la source
Il est important de ne pas ici, cependant, qu'il n'y ait pas tellement de "manque de verbosité" de la part de C # dans cette comparaison, seulement que la verbosité est contenue dans les classes de framework .net que vous utilisez pour analyser votre XML. Si vous examinez le code dans ceux-ci, vous trouverez probablement beaucoup plus de code C #, peut-être même plus détaillé.
XIVSolutions
3

La différence la plus importante est probablement la gestion de la mémoire. Avec C #, vous obtenez un garbage collection, car il s'agit d'un langage basé sur CLR. Avec Objective-C, vous devez gérer vous-même la mémoire.

Si vous venez d'un arrière-plan C # (ou de tout autre langage moderne d'ailleurs), passer à un langage sans gestion automatique de la mémoire sera vraiment douloureux, car vous passerez beaucoup de temps à coder à bien gérer la mémoire (et à déboguer en tant que bien).

DSO
la source
6
ObjC a tracé la collecte des ordures ces jours-ci. D'autre part, C # vous permet de gérer vous-même la mémoire si vous le souhaitez (grâce aux pointeurs bruts).
Pavel Minaev le
3
Je ne trouve pas que la gestion manuelle de la mémoire en Objective-C (dans le contexte des frameworks d'Apple) soit un lourd fardeau: le cycle de conservation / libération / autorelease est beaucoup moins lourd que la gestion de mémoire "traditionnelle" en C et C ++.
mipadi le
5
Ce n'est tout simplement pas vrai DSO - même dans un environnement sans ramasse-miettes comme l'iPhone, la conservation / libération et la libération automatique prennent environ 10 minutes à apprendre, puis ce n'est pas un problème. J'ai trouvé beaucoup de C # qui aiment exagérer les défis de la gestion de la mémoire. C'est presque comme s'ils craignaient de commencer à aimer trop obj-c sinon ...;)
h4xxr
4
Les bases de la gestion manuelle de la mémoire ne sont pas difficiles. Mais cela peut devenir très vite compliqué lorsque vous commencez à passer des objets alloués et que vous devez gérer des graphiques d'objets complexes, car vous devez suivre attentivement les règles pour déterminer qui est responsable de la libération et quand. Les implémentations de comptage de références facilitent un peu les choses, sauf que vous devez gérer les cycles dans les graphiques d'objets ... par rapport à C #, tout cela IMO est une grande différence.
DSO
1

Voici un très bon article comparant les deux langues: http://www.coderetard.com/2008/03/16/c-vs-objective-c/

Cinder6
la source
C'est dommage que la page prétende être en UTF-8 mais a toutes sortes de remplacements désagréables pour les apostrophes et les guillemets. Je pense que son texte utilise des guillemets "curvy", mais ils déforment certainement le code ...
Quinn Taylor le
ils semblent avoir volé leur intro tout entier, mais même l'article source a son code mélangé. ni l'un ni l'autre n'est un article particulièrement intéressant.
dnord le
-2

Hormis la différence de paradigme entre les 2 langues, il n'y a pas beaucoup de différence. Autant que je déteste le dire, vous pouvez faire le même genre de choses (probablement pas aussi facilement) avec .NET et C # que vous pouvez le faire avec Objective-C et Cocoa. A partir de Leopard, Objective-C 2.0 a la collecte des ordures, de sorte que vous ne devez gérer vous - même la mémoire sauf si vous voulez ( la compatibilité du code avec les anciens Mac et les applications iPhone sont 2 raisons de vouloir).

En ce qui concerne le code structuré et lisible, une grande partie du fardeau incombe au programmeur, comme à tout autre langage. Cependant, je trouve que le paradigme de passage de message se prête bien au code lisible à condition que vous nommez vos fonctions / méthodes de manière appropriée (encore une fois, comme n'importe quel autre langage).

Je serai le premier à admettre que je ne suis pas très familier avec C # ou .NET. Mais les raisons que Quinn a énumérées ci-dessus sont plusieurs raisons pour lesquelles je ne veux pas le devenir.

alespline
la source
-3

Les appels de méthode utilisés dans obj-c facilitent la lecture du code, à mon avis beaucoup plus élégant que c # et obj-c est construit au-dessus de c donc tout le code c devrait fonctionner correctement dans obj-c. Le gros vendeur pour moi est que obj-c est un standard ouvert, vous pouvez donc trouver des compilateurs pour n'importe quel système.

kubi
la source
2
ISO C # est également une norme ouverte. Aussi, pour autant que je sache, le seul compilateur ObjC existant est gcc.
Pavel Minaev le
@Pavel: Il y a aussi le compilateur d'objets portables ( users.telenet.be/stes/compiler.html ) et clang.
mipadi le
1
En fait, GCC n'est plus le seul compilateur - Clang et LLVM sont une paire de technologies conçues et développées pour remplacer GCC et faire des choses qu'il n'aurait jamais pu, y compris la compilation JIT. C'est au cœur d'OpenCL dans Snow Leopard. Ils sont également extensibles à d'autres langues et valent la peine d'être vérifiés.
Quinn Taylor le
2
Honnêtement, je ne considérerais pas la portabilité comme un pro d'Objective-C. Au contraire, les atouts sont davantage liés au développement rapide et à la réduction du volume de code pour accomplir la même tâche.
Quinn Taylor le
Merci d'avoir corrigé mon erreur sur la disponibilité du compilateur. Eh bien, la portabilité est techniquement là de toute façon - je peux utiliser MinGW / ObjC sur Win32 très bien, par exemple - en ce sens, il est tout aussi portable que gcc lui-même. Bien sûr, les bibliothèques ne seront pas là (bien que ... y a-t-il GnuStep / Win32?), Mais cette situation n'est pas vraiment bien pire que ce que nous avons avec Mono; donc dans l'ensemble, je dirais que la portabilité n'est pas un point fort pour les deux côtés.
Pavel Minaev le