Apprenez d'abord C avant d'apprendre Objective-C [fermé]


107

En tant que développeur Apple en herbe, je souhaite avoir l'avis de la communauté s'il est préférable d'apprendre le C avant de passer à Objective-C et finalement au Cocoa Framework?

Mon instinct dit d'apprendre C, ce qui me donnera une bonne base.

Réponses:


163

J'apprendrais d'abord le C. J'ai appris le C (et j'ai beaucoup fait en C) avant de passer à Obj-C. J'ai beaucoup de collègues qui n'ont jamais été de vrais programmeurs en C, ils ont commencé avec Obj-C et n'ont appris que le C que nécessaire.

De temps en temps, je vois comment ils résolvent un problème entièrement en Obj-C, aboutissant parfois à des solutions très maladroites. Habituellement, je remplace ensuite du code Obj-C par du code C pur (après tout, vous pouvez les mélanger autant que vous le souhaitez, le contenu d'une méthode Obj-C peut être entièrement du code C pur). Sans aucune intention d'insulter un programmeur Obj-C, il existe des solutions très élégantes dans Obj-C, ce sont des solutions qui fonctionnent (et ont l'air) beaucoup mieux grâce aux objets(La programmation POO peut rendre les programmes complexes beaucoup plus beaux que la programmation fonctionnelle; le polymorphisme par exemple est une fonctionnalité brillante) ... et j'aime vraiment Obj-C (beaucoup plus que C ++! Je déteste la syntaxe C ++ et certaines fonctionnalités du langage sont tout simplement excessives et conduire à de mauvais modèles de développement à mon humble avis); cependant, quand je réécris parfois le code Obj-C de mes collègues (et je ne le fais vraiment que si je pense que c'est absolument nécessaire), le code résultant est généralement 50% plus petit, ne nécessite que 25% de la mémoire utilisée avant et est environ 400% plus rapide à l'exécution.

Ce que j'essaie de dire ici: chaque langue a ses avantages et ses inconvénients. C a des avantages et des inconvénients, tout comme Obj-C. Cependant, la très grande fonctionnalité d'Obj-C (c'est pourquoi je l'aime même plus que Java) est que vous pouvez passer à C brut à volonté et inversement. Pourquoi est-ce une si grande fonctionnalité? Parce que tout comme Obj-C corrige de nombreux inconvénients du C pur, le C pur peut corriger certains des inconvénients d'Obj-C. Si vous les mélangez, vous recevrez une équipe très puissante.

Si vous apprenez seulement Obj-C et que vous n'avez aucune idée de C ou que vous n'en connaissez que les bases et que vous n'avez jamais essayé avec quelle élégance il peut résoudre certains problèmes courants, vous n'avez en fait appris que la moitié d'Obj-C. C est une partie fondamentale d'Obj-C. La possibilité d'utiliser C à tout moment et partout en est une caractéristique fondamentale.

Un exemple typique était un code que nous avons utilisé qui devait encoder des données en base64, mais nous ne pouvions pas utiliser une bibliothèque externe pour cela (pas de bibliothèque OpenSSL). Nous avons utilisé un encodeur base64, entièrement écrit en utilisant des classes Cocoa. Cela fonctionnait bien, mais lorsque nous l'avons fait encoder 200 Mo de données binaires, cela a pris une éternité et la surcharge de mémoire était inacceptable. Je l'ai remplacé par un minuscule encodeur base64 ultra compact écrit entièrement comme une fonction C (j'ai copié le corps de la fonction dans le corps de la méthode, la méthode a pris NSData en entrée et renvoyé NSString en sortie, mais à l'intérieur de la fonction, tout était C). L'encodeur C était tellement plus compact qu'il battait l'encodeur Cocoa pur par le facteur 8 en vitesse et la surcharge de mémoire était également beaucoup moins. Encoder / décoder des données, jouer avec des bits et des tâches similaires de bas niveau ne sont que les points forts de C.

Un autre exemple était un code d'interface utilisateur qui a dessiné beaucoup de graphiques. Pour stocker les données nécessaires pour peindre les graphiques, nous avons utilisé NSArray. En fait, NSMutableArray, puisque le graphique était animé. Résultat: animation graphique très lente. Nous avons remplacé tous les NSArray par des tableaux C normaux, des objets avec des structures (après toutes les informations de coordonnées du graphe ne sont rien que vous devez avoir dans les objets), l'accès à l'énumérateur par de simples boucles for et avons commencé à déplacer des données entre les tableaux avec Memcopy au lieu de prendre des données d'un tableau à l'autre, index pour index. Le résultat: une accélération du facteur 4. Le graphique s'animait en douceur, même sur les anciens systèmes PPC.

La faiblesse de C est que tout programme plus complexe devient laid à long terme. Garder les applications C lisibles, extensibles et gérables exige beaucoup de discipline de la part d'un programmeur. De nombreux projets échouent car cette discipline fait défaut. Obj-C vous permet de structurer facilement votre application à l'aide de classes, d'héritage, de protocoles, etc. Cela dit, je n'utiliserais pas la fonctionnalité C pure à travers les frontières d'une méthode à moins que cela ne soit nécessaire. Je préfère conserver tout le code d'une application Objective-C dans la méthode d'un objet; tout le reste va à l'encontre du but d'une application OO. Cependant, dans la méthode, j'utilise parfois exclusivement du C pur.


et si je connais déjà le C ++ et que je veux apprendre Objective-C pour le développement iPhone / iTouch, est-il nécessaire d'apprendre le C quoi que ce soit?
chester89

11
@ chester89: si vous connaissez déjà C ++, vous en savez suffisamment sur C pour démarrer avec Objective-C.
Sven

Sven a raison, le C ++ est si complexe et utilise déjà tellement de C pur, si vous connaissez vraiment bien le C ++, vous devez également le connaître suffisamment.
Mecki

C'est ma réflexion préférée sur le sujet encore, merci.
Morkrom

1
@FrederikWitte Oubliez C ++, cela ne fera que vous confondre en tant que débutant (et ce n'est pas un langage dont vous auriez besoin pour le développement mobile). Commencez par Java, c'est un bon langage d'enseignement et il suffit de savoir que Java est suffisant pour se développer pour Android (peut-être à moins que vous ne souhaitiez écrire des jeux ou des lecteurs vidéo ou plus). Ensuite, apprenez C et enfin Obj-C, à moins que vous ne souhaitiez ignorer tout cela et apprendre Swift à la place. Votre choix.
Mecki

25

Vous pouvez facilement apprendre C et Objective-C en même temps - il n'est certainement pas nécessaire d'apprendre les minuties de C (y compris l'arithmétique des pointeurs et ainsi de suite) avant de commencer avec les ajouts d'Objective-C au langage, et en tant que programmeur novice commencer rapidement avec Objective-C peut vous aider à commencer à «penser aux objets» plus rapidement.

En termes de ressources disponibles, la documentation d'Apple suppose généralement une familiarité avec C, donc commencer avec le langage de programmation Objective-C 2.0 ne vous sera pas très utile. J'investirais dans une copie de Programming in Objective-C de Stephen Kochan (selon la rapidité avec laquelle vous voulez démarrer, vous pouvez envisager d'attendre la deuxième édition):

Bibliothèque des développeurs Objective-C de programmation Programmation Objective-C 2.0

Il ne suppose aucune expérience préalable et vous apprend Objective-C et autant de C que vous en avez besoin.

Si vous vous sentez un peu ambitieux, vous pourriez commencer par le didacticiel «Learn C» de Scott Stevenson , mais il comporte quelques prérequis («Vous devriez déjà connaître au moins un langage de script ou de programmation, y compris des fonctions, des variables et des boucles. ll devra également taper des commandes dans le terminal Mac OS X. ").

(Juste pour mémoire et pour le contexte: j'ai appris les deux en même temps en 1991 - cela ne semblait pas me faire de mal. Cependant, j'avais une formation en BASIC, Pascal, Logo et LISP. )


2
vous ne devriez absolument pas trouver nécessaire d'apprendre d'abord le C. Surtout si vous connaissez déjà un langage comme C # de Java. C # et Java doivent beaucoup à l'objectif C. Bien que C # doive beaucoup plus à l'expérience d'Helsberg et aux erreurs avec Delphi.
Daniel Honig

18

J'ai beaucoup réfléchi à ce problème avant d'écrire mon livre sur Objective-C. Premièrement, je crois vraiment qu'apprendre le langage C avant d'apprendre Objective-C n'est pas la bonne voie. C est un procédurelangage contenant de nombreuses fonctionnalités qui ne sont pas nécessaires pour la programmation en Objective-C, en particulier au niveau novice. En fait, le recours à certaines de ces fonctionnalités va à l'encontre de l'adhésion à une bonne méthodologie de programmation orientée objet. Ce n'est pas non plus une bonne idée d'enseigner tous les détails d'un langage procédural (et d'attaquer la solution d'un problème avec des fonctions et des techniques de programmation structurées) avant d'apprendre un langage orienté objet. Cela peut faire démarrer le programmeur dans la mauvaise direction, conduisant potentiellement à développer une mauvaise orientation et un mauvais état d'esprit pour favoriser une bonne discipline de programmation orientée objet. Ce n'est pas parce que Objective-C est une extension du langage C que vous devez d'abord apprendre le C!

Je pense qu'enseigner l'Objective-C et le langage C sous-jacent comme un seul langage intégré est la bonne approche. Il n'y a aucune raison d'apprendre qu'une instruction «for» provient du langage C et non de son surensemble de langage Objective-C. De plus, pourquoi apprendre en détail des choses comme les tableaux C et les chaînes (et les manipuler) avanten savoir plus sur les objets tableau (NSArray) et chaîne (NSString), par exemple? De nombreux textes en C consacrent beaucoup de temps aux structures, aux pointeurs vers des structures et aux itérations dans des tableaux avec des pointeurs. Mais vous pouvez commencer à écrire des programmes Objective-C sans connaître aucune de ces fonctionnalités du langage C. Et pour un programmeur novice, c'est un gros problème. Non seulement cela raccourcit la courbe d'apprentissage, mais réduit également la quantité de matériel qui doit être appris (et certains d'entre eux sélectivement filtrés) pour écrire des programmes Objective-C.

Je conviens que vous voudrez apprendre la plupart, sinon la totalité, des fonctionnalités C sous-jacentes, mais beaucoup peuvent être différées jusqu'à une solide compréhension de la définition des classes et des méthodes, du travail avec des objets et des expressions de message, et de la compréhension des concepts d'héritage et le polymorphisme est bien compris.


Tout cela est pour ceux qui veulent apprendre rapidement tout en évitant les difficultés et la compréhension profonde. J'enseigne un noob de programmation complet (alors que j'ai plus de 11 ans d'expérience en programmation) à programmer et j'ai l'habitude d'enseigner aux autres avant (mais je ne suis pas un enseignant pour le dire clairement). Et tu sais quoi? Tous ces concepts auxquels nous sommes tous habitués sont tellement compliqués et peu intuitifs pour un débutant complet! C est un excellent moyen de comprendre les choses de niveau assez bas, de sorte qu'à l'avenir, ce ne sera pas de la magie pour eux. Cela dit, pour une meilleure courbe d'apprentissage du programmeur, c'est mieux avec C au début avec ses règles barbares =)
MANIAK_dobrii

15

Je plongerais directement dans l'Objectif C - si vous avez déjà quelques langues à votre actif, ce n'est pas la syntaxe qui est la courbe d'apprentissage, c'est Cocoa.


1
Cela dit, il y a beaucoup plus de matériel disponible pour apprendre C. trouvé que c'était la partie la plus difficile d'ObjC, le manque de matériel bien organisé, clair, avait suffisamment de profondeur pour comparer au matériel C ou C ++ et vraiment vous aider à comprendre ce qui était se passe à l'intérieur.
Spanky

10

Je pense que, pour la plupart, apprendre C est une bonne idée, quel que soit le domaine dans lequel vous vous dirigez, au moins pour comprendre le fonctionnement interne du développement logiciel avant d'utiliser des produits préemballés, de cette façon si quelque chose ne va pas. vous avez une meilleure chance de comprendre le fonctionnement interne. Il y a beaucoup de discussions à ce sujet sur SO, et c'est une question plutôt subjective, mais en général, vous utiliserez intrinsèquement C dans votre code Objective-C, donc je suppose que cela dépend vraiment de vous. Je suis un type de personne à la base, mais parfois cela peut gêner et je connais plusieurs personnes intelligentes qui ont travaillé de haut en bas, je pense que la partie importante est que vous compreniez le fonctionnement interne comme il le fera démarquez vos capacités de celles qui ne le font pas et augmentez vos capacités.


apprendre d'abord C peut également déformer votre vision de la programmation OO si vous n'y êtes pas déjà ancré. Mélanger codage structuré et procédural n'est pas bon. Mais il est également vrai que OO perd sa valeur dans de nombreux endroits où C brille, comme l'écriture de code de niveau inférieur.
Daniel Honig

1
La raison pour laquelle je suggère à chaque développeur d'apprendre C à un moment donné est au moins basée sur l'idée que même les langages OO se compilent avec les mêmes instructions exactes que C à la fin. Les variables pour les objets utilisent des pointeurs, les garbage collectors utilisent malloc et free, les fichiers sont verrouillés à l'aide des poignées du système d'exploitation; lorsque quelque chose ne va pas dans une application Java ou C #, la connaissance de ces principes fondamentaux peut grandement améliorer votre compréhension de ce qui n'a pas fonctionné. Comprendre l'allocation des ressources qui sera effectuée tend également à conduire à l'écriture de code plus informé qui fonctionnera de manière plus optimale pour un contexte spécifique.
TheXenocide

7

C'est une bonne idée d'apprendre C avant d'apprendre Objective-C, qui est un sur-ensemble strict de C. Cela signifie que Objective-C peut prendre en charge tout le code C normal, donc le code commun aux programmes C est lié à apparaître même dans Objective- Code C.

En plus de regarder les choses d'un point de vue purement linguistique, vous constaterez que Mac OS X est un système d'exploitation Unix complet. Toutes les bibliothèques de niveau système sont écrites en C.

Il est probablement possible d'apprendre les deux en même temps, mais je pense que vous apprécierez et comprendrez davantage Objective-C si vous avez d'abord une solide connaissance pratique de C.


5

J'apprendrais Objective-C et j'apprendrais autant de C que nécessaire au fur et à mesure.

Les zones de C dont vous ne dépendez pas beaucoup:

  • Arithmétique et tableaux de pointeurs. Je n'ai pas du tout utilisé de tableaux C.
  • Chaînes C. Les cordes d'Objective-C font le travail de manière plus agréable et plus sûre.
  • Gestion manuelle de la mémoire si vous utilisez GC dans Obj-C 2.1. Je recommande vivement cette voie pour des raisons de vitesse de développement et de performances.

6
Une mise en garde: Garbage Collection en Objective-C n'est pas disponible sur toutes les plates-formes (en particulier l'iPhone), ce dont il faut être conscient.
Mark Bessey

5

Lorsque vous apprenez Objective-C et Cocoa, vous ne pouvez pas éviter d'apprendre des bits de C. Par exemple, les rectangles sont couramment représentés par CGRect, une structure C.

Si vous avez le temps, apprenez par tous les moyens C. Comme d'autres l'ont dit ici, le livre de Kochan (deuxième et première éditions) est excellent comme livre dans lequel plonger.


4

Il y a beaucoup de choses que vous ne pouvez pas faire uniquement en Objective-C, donc l'apprentissage de certaines compétences de base en C sera assez critique. Vous aurez au moins besoin de comprendre les déclarations de variables et les fonctions de base de la bibliothèque C, sinon vous serez frustré.


3

Honnêtement, tant de langages sont basés sur la syntaxe C qu'il est bon de se familiariser avec. Je prendrais une semaine ou deux pour vous familiariser avec C malgré tout.

Cela dit, je me suis juste enseigné l'Objectif C, et je dois être honnête: je n'ai pas trouvé mon expérience C aussi utile que je l'aurais pensé. L'Objectif C m'a définitivement ouvert les yeux.


3

Vous pouvez accéder directement à Objective-C, avec les avantages suivants:

  1. Vous apprendrez "un" C en chemin.
  2. Vous apprendrez les parties C qui vous intéressent.

Au moins pour moi, il est plus facile d'apprendre une nouvelle langue lorsque je suis intéressé par une application ou un échantillon spécifique, et j'échoue lorsque je dois apprendre autre chose qui ne m'intéresse pas exactement.

Vous pouvez toujours affiner vos connaissances en C plus tard si vous vous intéressez à la programmation de niveau inférieur.


3

Mieux, je ne sais pas, encore moins car je ne suis pas familier avec Objective-C.
Mais les bases de C ne sont pas si difficiles à apprendre, ce n'est pas un langage très complexe (en termes de syntaxe, pas en termes de maîtrise!), Alors allez-y, ce ne sera pas une perte de temps.
Personnellement, je pense que c'est toujours une bonne idée d'apprendre le C, cela donne un bon aperçu du fonctionnement de l'ordinateur. Après tout, la plupart des langages et des systèmes sont toujours écrits en C. Alors continuez! :-)

PS: Par "bouger", je ne voulais pas dire "laisser tomber", juste "apprendre plus, apprendre différemment". Une fois que vous connaissez C, vous pourriez ne jamais le laisser tomber: Java utilise JNI pour appeler des routines C pour des trucs de bas niveau, Python, Lua, etc. sont souvent étendus avec du code C (la référence Lua suppose même juste des connaissances C pour certaines fonctions qui un wrapper fin à la fonction C derrière), et ainsi de suite.


3

Oui, apprendre le langage C avant tout autre langage avancé vous aidera à apprendre rapidement d'autres langages.


2

Selon Wikipédia , Objective-C est un super-ensemble strict de C. Cela étant le cas, je suggérerais d'abord d'apprendre le C. Ensuite, lorsque vous apprenez Objective-C, il sera clair quelles parties sont ajoutées dans le cadre d'Objective-C.


2

C vous donne très peu d'abstraction de l'assemblage. Certains compilateurs C vous permettront même d'assembler en ligne. Cela peut être très utile pour réfléchir au fonctionnement de l'ordinateur, ce qu'il est important de savoir.

Cela étant dit, si vous êtes vraiment intéressé par Object-C, ne vous laissez pas coincer à écrire quelque chose en C simplement parce que c'est "bon pour vous". Vous n'avez pas besoin de vous frustrer pendant que vous essayez d'acquérir de nouvelles compétences. Il est important que vous vous amusiez avec ce que vous faites.



2

L'objectif C est suffisamment différent de C pour ne pas mériter d'apprendre C d'abord.

Du point de vue de la syntaxe / famille de langues, il vaut presque mieux étudier SmallTalk (sur lequel l'objectif C est basé)

D'un point de vue pratique, concentrez vos efforts sur l'apprentissage d'une langue à la fois.

Plus tard, si vous souhaitez apprendre un autre langage, C ++, Java et Python sont 1) faciles à apprendre en tant que groupe 2) populaires et donc commercialisables 3) puissants.


1
Non, Objective-C est un très petit sur-ensemble de C. Sans C, vous ne pouvez rien faire en Objective-C. Bien sûr, le modèle objet est tiré de smalltalk, mais la syntaxe n'est même pas proche pour la plupart des parties.
Sven

2

Vous devez avoir une connaissance de base de C avant de démarrer Objective_C, mais il n'est pas nécessaire de maîtriser tous les détails de C.

J'ai publié mes notes après avoir lu "Programmation en Objective-C" au cas où cela aiderait quelqu'un d'autre.

apprendre l'objectif c avec la programmation


1

En fonction de nombreuses langues que vous connaissez déjà, il peut être préférable de simplement commencer à apprendre Objective-C. La base dans la plupart des langues est fondamentalement la même, c'est la syntaxe qui est différente. Apprendre d'abord C ne fera pas vraiment une grande différence en ce qui concerne l'apprentissage d'Objective-C.


Mais seulement si l'on connaît au moins un autre langage de programmation.
Sven

En plus du commentaire de @ Sven: "... qui a un concept de pointeurs"
MANIAK_dobrii

1

J'ai tout de suite appris Objective-C et cela a bien fonctionné pendant environ un an maintenant, j'ai juste eu des difficultés à lire le code C lorsque j'ai téléchargé le projet pour voir comment ils fonctionnent, mais maintenant je ressens vraiment le besoin d'apprendre C.Vous pouvez essayer d'apprendre ObjC sans C, mais tôt ou tard, vous aurez besoin de C.


1

À mon humble avis, il faut d'abord apprendre au moins un certain C et en particulier sur les pointeurs. C'est encore plus important si l'on vient d'une langue qui n'a pas de pointeurs. Beaucoup de gens posent des questions sur le code comme

NSString *string = [[NSString alloc] init];
string = @"something";

puisqu'ils ne connaissent pas la distinction entre un pointeur et l'objet vers lequel il pointe.

Bien sûr, il n'est pas nécessaire d'apprendre tout le C avant de pouvoir commencer avec Objective-C, mais certaines choses fondamentales sont absolument nécessaires.


J'aimerais pouvoir voter +10. Une fois dans une interview obj-c dev, on m'a demandé s'il était possible de créer un pointeur vers NSInteger ... J'ai été choqué, car c'était si essentiel pour moi, mais cela ne semble pas pour tout le monde. Il est donc important et facile d'oublier que cela doit également être compris.
MANIAK_dobrii

0

Heck non, allez directement à l'objectif C!

Je suis passé d'ActionScript 3 à Objective C, et j'ai déjà un stagiaire dans une entreprise!

Faites ce que vous voulez.


Pourquoi manquer complètement l'état d'esprit orienté objet et commencer à apprendre le C en premier? C'est comme apprendre à piloter un cerf-volant et espérer devenir pilote. Vous devez intégrer la POO dès le départ.
SwiftArchitect

0

Si vous apprenez une autre langue avant, vous aurez toujours de la confusion dans l'écriture de la bonne syntaxe. Je ne connais pas le but, mais Object C utilise une syntaxe étrange (pas courante) pour appeler des méthodes objet. Il le nomme comme l'envoi de messages, oui, c'est vrai en conséquence pur concept orienté objet, cependant la plupart des langages orientés objet nomment cela comme méthode d'appel et utilisent une syntaxe plus traditionnelle des méthodes d'appel. Le ramassage des ordures est également quelque chose de très étrange, Object C est basé sur le nombre de références de la vieille école. Vous aurez donc des difficultés à l'accepter si vous passez d'une autre langue. J'écris un livre Guide de migration rapide Object C pour les programmeurs C / C ++ dans l'espoir d'aider les gens à comprendre toutes les différences plus rapidement.


Parce qu'en Objective-C "envoyer un message" n'est pas "appeler une méthode", mais qu'en même temps envoyer un message provoque l'appel d'une méthode (fonction) =) Lorsque vous envoyez un message à un objet, il passe par une distribution de message mécanisme (vous pouvez en savoir plus ici: developer.apple.com/library/ios/documentation/Cocoa/Conceptual/… ou ici: stackoverflow.com/questions/982116/… )
MANIAK_dobrii
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.