107 votes

Apprenez d'abord le C avant d'apprendre l'Objective-C

En tant que futur développeur Apple, j'aimerais connaître l'avis de la communauté sur la nécessité d'apprendre d'abord le langage C avant de passer à l'Objective-C et, finalement, au Cocoa Framework.

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

164voto

Mecki Points 35351

Je commencerais par apprendre le C. J'ai appris le C (et fait beaucoup de choses en C) avant de passer à Obj-C. J'ai de nombreux collègues qui n'ont jamais été de vrais programmeurs C, ils ont commencé avec Obj-C et n'ont appris que la quantité de C nécessaire.

De temps en temps, je vois comment ils résolvent un problème entièrement en Obj-C, ce qui aboutit parfois à des solutions très maladroites. Habituellement, je remplace alors 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 vouloir insulter les programmeurs Obj-C, il y a des solutions qui sont très élégantes en Obj-C, ce sont des solutions qui fonctionnent (et ont l'air) bien mieux grâce à objets (La programmation OOP peut rendre les programmes complexes beaucoup plus beaux que la programmation fonctionnelle ; le polymorphisme par exemple est une caractéristique brillante)... et j'aime vraiment Obj-C (beaucoup plus que C++ ! Je déteste la syntaxe C++ et certaines caractéristiques du langage sont tout simplement exagérées et conduisent à de mauvais modèles de développement) ; cependant, lorsque 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 qu'il utilisait auparavant et est environ 400% plus rapide à l'exécution.

Ce que j'essaie de dire ici : Chaque langage a ses avantages et ses inconvénients. C a des avantages et des inconvénients et Obj-C en a aussi. Cependant, la caractéristique vraiment géniale d'Obj-C (c'est pourquoi je l'aime même plus que Java) est que vous pouvez passer au C simple à volonté et revenir. Pourquoi cette caractéristique est-elle si importante ? Parce que, tout comme Obj-C corrige plusieurs des inconvénients du C pur, le C pur peut corriger certains des inconvénients d'Obj-C. Si vous mélangez les deux, vous obtiendrez un meilleur résultat. Si vous les mélangez ensemble, vous obtiendrez une équipe très puissante.

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

Un exemple typique était un code que nous utilisions et qui devait encoder des données en base64, mais nous ne pouvions pas utiliser une bibliothèque externe pour cela (pas de librairie OpenSSL). Nous avons utilisé un encodeur base64, entièrement écrit à l'aide de classes Cocoa. Il fonctionnait bien, mais lorsque nous lui avons fait coder 200 Mo de données binaires, cela a pris une éternité et l'overhead 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 prenait NSData en entrée et renvoyait NSString en sortie, mais à l'intérieur de la fonction tout était en C). L'encodeur C était tellement plus compact, il a battu l'encodeur Cocoa pur par un facteur 8 en vitesse et l'overhead mémoire était aussi beaucoup moins important. Encoder/décoder des données, jouer avec des bits et d'autres tâches de bas niveau similaires sont les points forts du C.

Un autre exemple était un code d'interface utilisateur qui dessinait beaucoup de graphiques. Pour stocker les données nécessaires à la représentation des graphiques, nous avons utilisé des NSArray. En fait, il s'agissait de NSMutableArray, puisque le graphique était animé. Résultat : Animation du graphique très lente. Nous avons remplacé tous les NSArray par des tableaux C normaux, les objets par des structs (après tout, les informations sur les coordonnées du graphique ne sont pas indispensables dans les objets), l'accès aux énumérateurs par de simples boucles for et nous avons commencé à déplacer les données entre les tableaux avec memcopy au lieu de les prendre d'un tableau à l'autre, index pour index. Le résultat : Une vitesse multipliée par 4. Le graphique s'est animé de manière fluide, même sur les vieux systèmes PPC.

La faiblesse du C est que tout programme plus complexe devient laid à long terme. Maintenir des applications C lisibles, extensibles et gérables exige beaucoup de discipline de la part d'un programmeur. De nombreux projets échouent parce que cette discipline fait défaut. Obj-C vous permet de structurer facilement votre application en utilisant des classes, l'héritage, les protocoles, etc. Cela dit, je n'utiliserais pas de fonctionnalité purement C au-delà des limites d'une méthode, à moins que cela ne soit nécessaire. Je préfère garder tout le code d'une application Objective-C dans la méthode d'un objet ; tout le reste va à l'encontre de l'objectif d'une application OO. Cependant, à l'intérieur de la méthode, il m'arrive d'utiliser exclusivement du C pur.

25voto

mmalc Points 7663

Vous pouvez facilement apprendre le C et l'Objective-C en même temps - il n'est certainement pas nécessaire d'apprendre les détails du C (y compris l'arithmétique des pointeurs, etc.) avant de commencer à utiliser les ajouts de l'Objective-C au langage, et en tant que programmeur débutant, se mettre rapidement à l'Objective-C peut vous aider à commencer à "penser en objets" plus rapidement.

En termes de ressources disponibles, la documentation d'Apple suppose généralement une familiarité avec le C, donc commencer par Le langage de programmation Objective-C 2.0 ne vous sera pas d'un grand secours. J'investirais dans un exemplaire de Programming in Objective-C de Stephen Kochan (en fonction de la rapidité avec laquelle vous souhaitez vous lancer, vous pourriez envisager d'attendre la deuxième édition) :

Programmation Objective-C Bibliothèque pour développeurs Programmation de la bibliothèque des développeurs d'Objective-C 2.0

Il ne suppose aucune expérience préalable, et vous enseigne Objective-C et autant de C que nécessaire.

Si vous vous sentez un peu ambitieux, vous pouvez commencer par Tutoriel "Apprendre le C" de Scott Stevenson mais il a quelques prérequis ("Vous devez déjà connaître au moins un langage de script ou de programmation, y compris les fonctions, les variables et les boucles. Vous devrez également savoir taper des commandes dans le terminal Mac OS X.").

(Pour mémoire et pour le contexte : J'ai appris les deux en même temps en 1991 - cela n'a pas semblé me faire de mal. Par contre, j'ai eu un arrière-plan en BASIC, Pascal, Logo et LISP).

18voto

skochan Points 161

J'ai beaucoup réfléchi à cette question avant d'écrire mon livre sur l'Objective-C. Tout d'abord, je crois vraiment qu'apprendre le langage C avant d'apprendre l'Objective-C n'est pas la bonne voie. Le C est un procédure Ce langage contient de nombreuses fonctionnalités qui ne sont pas nécessaires à la programmation en Objective-C, surtout au niveau des novices. 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ée) avant d'apprendre un langage orienté objet. Cela peut faire partir le programmeur dans la mauvaise direction et le conduire à 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 l'Objective-C est une extension du langage C que vous devez d'abord apprendre le C !

Je pense qu'enseigner 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 sur-ensemble, l'Objective-C. De plus, pourquoi apprendre en détail des choses comme les tableaux en C et les tableaux de données en C ? De plus, pourquoi apprendre en détail des choses comme les tableaux C et les chaînes de caractères (et leur manipulation) ? avant l'apprentissage des objets de type tableau (NSArray) et chaîne de caractères (NSString), par exemple ? De nombreux textes en C consacrent beaucoup de temps aux structures, aux pointeurs vers les structures et à l'itération dans les 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 débutant, c'est un gros avantage. Non seulement cela raccourcit la courbe d'apprentissage, mais cela réduit aussi la quantité de choses à apprendre (et à filtrer sélectivement) pour écrire des programmes Objective-C.

Je suis d'accord pour dire que vous voudrez apprendre la plupart, sinon la totalité, des fonctionnalités C sous-jacentes, mais beaucoup d'entre elles peuvent être reportées jusqu'à ce qu'une solide maîtrise de la définition des classes et des méthodes, du travail avec des objets et des expressions de messages, et de la compréhension des concepts d'héritage et de polymorphisme soit bien comprise.

15voto

Paul Dixon Points 122033

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

10voto

TheXenocide Points 654

Je pense que, dans l'ensemble, apprendre le C est une bonne idée, quel que soit le domaine dans lequel vous vous engagez, au moins pour comprendre les rouages du développement logiciel avant d'utiliser des produits préemballés, de cette façon, si quelque chose ne va pas, vous aurez une meilleure chance de comprendre les rouages. 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 du C dans votre code Objective-C, donc je suppose que c'est vraiment à vous de voir. Je connais plusieurs personnes intelligentes qui ont fait leur chemin du haut vers le bas. Je pense que l'important est que vous compreniez les rouages internes, car cela vous permettra de vous distinguer de ceux qui ne le font pas et d'augmenter vos capacités.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X