2010-07-24 5 views
17

Récemment, j'ai fini de lire K & R avec ses exercices et exemples, presque tous. Je prévoyais de passer à "Accelerated C++" que je suis tombé sur Axel Schreiner's book OOP avec ANSI-C. Je suis intrigué et je veux l'apprendre. Mais avant d'y investir du temps, je veux connaître la valeur de la mise en œuvre de la POO en C. Pour pouvoir décider combien de temps je dois y consacrer. L'implémentation de la POO en C, est-elle vraiment utilisée?Dois-je apprendre à mettre en œuvre la POO en C? Y a-t-il des projets qui utilisent la POO en C?

  1. Ou c'est juste pour l'exercice mental?
  2. Est-ce que leurs projets C existants utilisent la POO?
  3. Quand est-ce une bonne idée d'utiliser la POO en C?
  4. Dois-je investir mon temps?

Je pense qu'il est approprié que je mentionne mes antécédents ici afin que vous puissiez me guider d'une meilleure façon. J'ai terminé la théorie C, C++, Java et OOP il y a environ un an, j'ai aussi un boulot. Mais alors Joel's blog et SO m'a fait réaliser que je manque de beaucoup de choses. Alors j'ai repris les livres et je commence à les étudier correctement. R, Accéléré C++, Algorithme en C++ et quelques autres livres sont mes efforts pour améliorer mes compétences. Je ne suis pas nouveau à OOP.
Alors, que suggérez-vous?

Merci pour votre temps.

+1

Il y a quelques réponses vraiment super ici que je suis entièrement d'accord avec! –

Répondre

14

OO est utilisé en C aussi souvent que nécessaire. Généralement, je ne suis pas d'accord avec l'opinion que l'on ne peut pas faire de POO en C, dès que vous fournissez un ensemble de fonctions qui fonctionnent sur un type donné, vous avez une POO. Prenez par exemple, vous décidez de créer une structure de données. Si vous fournissez des fonctions pour créer, ajouter, supprimer et trouver des éléments de la structure de données, c'est OO. Généralement, d'autres langages fournissent du sucre syntaxique en impliquant automatiquement une variable d'instance et en explorant automatiquement les différentes propriétés de cette instance.

  1. Pour autant que "est-ce vraiment utilisé", la réponse est oui. Ce n'est pas pour l'exercice mental, c'est un paradigme valide dans C.
  2. Le meilleur exemple qui vient à l'esprit est GObject, utilisé par GLib, GTK + et de nombreux projets sans rapport avec GNOME. GObject fournit un moyen de construire des objets en C. Cependant, il n'est pas nécessaire d'utiliser le support tiers pour avoir OO en C. Beaucoup de projets existants l'ont, bien qu'il ne soit pas présent dans l'interface (une bonne chose à mon avis), et utilisé en interne à des fins diverses (propreté, protection des données, toutes les justifications OO habituelles).
  3. C'est une bonne idée d'utiliser la POO en C quand vous trouvez le besoin de grouper des comportements et/ou des données. Lorsque vous pouvez justifier la petite dépense syntaxique supplémentaire dans l'utilisation de votre interface d'objets, et le temps passé à ne pas réellement terminer votre solution. Ne vous laissez pas distraire.
  4. Vous ne devriez pas perdre de temps à apprendre l'OO parce que vous pensez qu'il est supérieur, plutôt qu'il devrait compléter vos futures solutions, et vous devriez l'ajouter à votre boîte à outils. Utilisez-le quand il semble que la bonne chose à faire. Se familiariser avec la façon dont on fait OO en C, la meilleure façon serait de faire un peu de C++, ou d'examiner tout bon projet qui utilise un peu OO de style C. Cela vous semblera naturel après cela.
4

J'ai eu l'expérience avec plusieurs projets C avancés qui font au moins une certaine utilisation de la POO. Le plus connu est le noyau Linux.

Le noyau est entièrement en C (sauf pour les pièces spécifiques à la plate-forme dans l'assemblage pour les interfaces matérielles).

Le noyau fait un usage intensif de structures avec des pointeurs de fonction dans de nombreux endroits. Le premier qui me vient à l'esprit est celui des systèmes de fichiers. Les pilotes remplissent la structure file_operations (ainsi que beaucoup d'autres) avec des rappels à leurs implémentations spécifiques.

Le noyau fait également beaucoup d'utilisation des instructions goto qui dans certains contextes peuvent être considérées comme des instructions de lancement rudimentaires menant une étiquette à la fin de la fonction pour faire un peu de nettoyage et de sortie. (Bien qu'ils utilisent également goto pour beaucoup plus que juste la gestion des erreurs, et il est également utilisé uniquement pour les "exceptions" dans une fonction, pas pour les transmettre à l'extérieur.)

+0

+1 pour la mention du noyau Linux, un bon exemple, que j'ai oublié de mentionner. –

3

Il y a des gens qui disent que vous pouvez écrire un objet code orienté dans n'importe quelle langue, et il y a aussi des gens qui disent que vous pouvez écrire un code horriblement déstructuré dans n'importe quelle langue.

Le langage "OO" réel vous fournit une poignée de mécanismes pour implémenter la conception OO: Les langages ont des concepts intégrés pour objet et/ou classes, pour encapsuler du code avec des données, pour l'héritage, etc. C n'a pratiquement rien de tout cela, mais rien ne vous empêche de faire de la programmation OO en C, compte tenu des techniques et de l'autodiscipline (comme votre livre vous le dit sûrement).

Mais voudriez-vous? Mon opinion est la suivante: si vous apprenez juste à faire de la programmation OO, il serait plus logique d'apprendre ceci en étant "tenu par la main" par un langage qui incorpore déjà profondément les concepts. Une langue bien structurée, simple et interactive serait bien pour cela: Avec un libre choix, je recommanderais Ruby, Python ou Groovy. Étant donné une langue avec «magie» intégrée OO, il devient très évident quand vous faites des choses OO et quand vous êtes juste structuré, discipliné et bien organisé. Il peut également y avoir des choses à apprendre lors du passage de C à une autre langue: les points communs, les différences. Certaines personnes recommandent d'apprendre le C++ comme la progression OO naturelle de C. Je ne suis pas du tout d'accord avec cela, parce que je considère le C++ comme un boulonnage plutôt moche des capacités OO sur un langage qui était déjà plus "pratique" que élégant. En passant de la programmation C "standard" à la programmation OO, je pense qu'un programmeur devrait envisager de s'éloigner de la manipulation directe des pointeurs, par exemple, et je trouverais certainement fastidieux de devoir gérer la mémoire pour mes données. Les langages OO modernes l'automatisent, de sorte qu'un programmeur dispose de plus de cellules cérébrales pour les tâches de haut niveau. L'attrait du C++, bien sûr, est la vitesse brute. Parce qu'il peut tomber au même niveau de métal proche de C, il est généralement le plus rapide des langages OO. Tout ce qui est dit: Si vous avez un gros projet où la langue requise est C et que vous voulez utiliser et pratiquer les techniques OO, alors allez-y! Si ce n'est pas le cas, vous pourriez bénéficier d'apprendre OO dans un environnement qui encourage et soutient cela, et peut-être plus tard revenir à C avec votre connaissance de OO. Les techniques enseignées dans le livre auront alors un sens pour vous, et vous serez mieux placé pour décider si vous voulez vraiment le faire en C ou dans une "vraie" langue OO. L'implémentation de la POO en C, est-elle vraiment utilisée?

+2

Si vous gérez votre propre mémoire en C++, vous vous trompez presque certainement. C'est ce que RAII est pour. – Puppy

+0

Je dois admettre que j'ai perdu la trace de C++ il y a environ 10 ans. J'ai "Accéléré C++" par Koenig et Moo sur mon étagère, et la moitié d'entre elle traite de la façon de nettoyer vos objets après que vous avez terminé avec eux. Cela semble précéder le 'std :: auto_ptr' de la bibliothèque standard, parce que le point culminant du texte semblait être sur la façon de construire vos propres pointeurs intelligents.Mais ces pointeurs intelligents standardisés éliminent-ils tout ou partie du potentiel de prise de vue autonome avec fuite d'objet? –

+1

+1 pour montrer à quel point le C++ est laid :) –

6

Ou c'est juste pour l'exercice mental? Oui, il est vraiment utilisé, mais sans surprise, il n'est pas aussi commun que la POO dans les langages qui ont été conçus pour cela.Y a-t-il des projets C existants qui utilisent la POO?

Je me souviens à l'aide d'un couple:

Quand il est une bonne idée d'utiliser la POO en C?

Certains problèmes sont très bien modélisés par la POO. Les interfaces graphiques, par exemple, sont souvent conçues avec l'héritage entre les types de fenêtres, en utilisant le polymorphisme pour remplacer et spécialiser le comportement.

Vous devez utiliser OOP chaque fois que votre problème a une belle solution OOP. Avec la note de bas de page, vous ne devriez pas coller 100 lignes de code OOP dans un projet de ligne 15000, juste parce que c'est "kewl"! :)

Dois-je y consacrer mon temps?

Cela dépend vraiment de ce que vous envisagez de faire avec. Je ne préconiserais jamais d'apprendre quoi que ce soit - il est bon d'être exposé au comment, pourquoi et quand l'utiliser. C'est génial de voir un langage qui n'a pas été conçu pour le POO de support OOP. Vous avez lu le livre, donc je suppose que vous avez une certaine affinité avec C et un intérêt pour OOP. Jetez un coup d'œil, peut-être jeter quelques applications GUI dans GTK +. D'un autre côté, si vous cherchez à devenir le prochain développeur web de patrons de conception, ce n'est probablement pas la meilleure approche, vous pouvez considérer d'autres langages plus orientés vers ce domaine.

Alors, que suggérez-vous?

Je vous suggère d'utiliser les meilleurs outils à votre disposition qui correspondent aux problèmes que vous essayez de résoudre. Décidez du problème que vous allez résoudre. Une application de bureau GUI, un serveur Web, un jeu, un utilitaire de ligne cmd ... une fois que vous avez décidé de votre problème, vous serez en mesure de mieux décider quelle technologie convient pour développer une solution. J'ai découvert que vous ne pouvez pas vraiment maîtriser quoi que ce soit avec des «jouets», alors vous devez faire quelque chose de réel.

0

Il peut être, mais sans les appels de fonction de destruction-temps fournis par d'autres langages POO, ce n'est pas si utile. De plus, si vous avez besoin de POO, il y a toujours C++, où votre code est virtuellement portable.

+4

Mais C++ sux .... –

+0

@Matt Joiner: Seulement si vous ne savez pas comment l'utiliser. – Puppy

+1

Non seulement sux si vous savez comment l'utiliser. Si vous ne le faites pas, vous êtes plutôt impressionnés. Aussi si vous sucez alors vous pensez qu'il sux. Mais ce n'est pas moi;) –

Questions connexes