Quelle est la différence entre une procédure et une orientée objet? [fermé]

je suis assez nouveau à la programmation mais j'ai lu quelques discussions intéressantes sur StackOverflow sur diverses approches de programmation. Je ne sais toujours pas très bien quelle est la différence entre la programmation procédurale et la programmation orientée objet. On dirait que la programmation orientée objet utilise encore des procédures (méthodes) mais tout est organisé différemment parce que l'objet est la vedette du spectacle. Mais il me semble que les procédures de toujours vous permettent de faire tout de même chose. Comme en c/" class="blnk">C, vous pouvez mettre toutes vos procédures similaires dans une bibliothèque. Alors ne pourriez-vous pas vraiment dire qu'une bibliothèque en C est similaire à un objet en C++?

28
demandé sur Serx 2009-02-10 04:08:38

17 réponses

La différence entre les deux est subtile, mais importante.

dans un programme procédural, les modules interagissent en lisant et en écrivant un État qui est stocké dans des structures de données partagées.

dans un programme orienté objet, les modules sous forme d'objets interagissent en envoyant des messages à d'autres objets.

13
répondu Serx 2009-02-10 07:12:04

dans un programme procédural, le code est roi et les données sont subordonnées. En d'autres termes, vous avez des programmes qui agissent sur les données et ils ne sont généralement pas étroitement liés.

dans le monde OO, les objets sont la chose principale d'intérêt. Un objet de données et le code qui est autorisé à agir sur ces données, et ils sont très étroitement liés. C'est le concept d'encapsulation, la dissimulation de l'information.

An exemple, disons que vous avez un numéro et que vous voulez le doubler. Une façon procédurale de le faire est la suivante:

n = n * 2

le code ici multiplie tout à fait explicitement n par 2 et stocke le résultat dans N.

la façon de faire est D'envoyer un "message" à l'objet nombre lui disant de se doubler:

n.double();

l'avantage de ceci est appelé polymorphisme. Ce qui se passe quand vous décidez que vous voulez être en mesure de doubler un une ficelle comme "bob". Dans le monde de la procédure, vous auriez à fournir plus de code pour faire le doublage, mais vous auriez aussi à appeler ce code différemment.

avec OO, vous créez un objet string qui peut aussi prendre le message 'double'. Le code pour doubler une chaîne appartient à l'objet string donc il sait qu'il doit agir différemment de l'objet number. S'il décidait que " bob "* 2 était "bobbob", le code ressemblerait à quelque chose comme:

class number:                    class string:
    int n                           char array s
    procedure double:               procedure double:
        n = n * 2                       s = string_join(s,s)

puis vous on pourrait appeler X. double () peu importe le type réel x était (nombre ou chaîne) et il saurait quel code exécuter - cela simplifie grandement votre code. Vous pouvez doubler l'entier, les chaînes, les matrices, les nombres complexes, les réals, les tailles de fenêtre sur votre moniteur et toutes sortes de choses différentes.

et vous avez raison, une bibliothèque C peut être faite pour ressembler un peu à des objets. L'exemple classique est stdio.h - vous ne vous souciez jamais quoi a FILE* en fait indique, juste le fait qu'il se comportera d'une certaine manière. Les FILE* , fopen() , fclose() et d'autres fonctions sont une classe de sortes représentant les capacités D'E/S DE C.

33
répondu paxdiablo 2009-09-23 01:40:59

vous pouvez programmer de façon procédurale dans la plupart des langues OO, mais le pouvoir de OO vient de la capacité d'hériter, d'encapsuler et d'abstraire cette logique procédurale. Je pense que vous avez raison, une bibliothèque doit ressembler à une classe. Elle devrait avoir sa propre portée et englober la logique derrière les fonctions avec des noms significatifs.

21
répondu Aram Verstegen 2009-02-10 01:13:36

vous avez raison dans votre observation que les programmes orientés objet sont basés de plusieurs façons sur le paradigme procédural. Vous avez également raison dans ce que syntaxiquement tout ce qui se passe vraiment est que vous invoquez des fonctions. En fait, vous pourriez implémenter de nombreuses fonctionnalités de langages orientés objet en utilisant des mécanismes procéduraux (par exemple, pointeurs de fonction en C++). Vous pouvez donc faire un design orienté objet et l'implémenter dans un langage procédural (par exemple, comme l'ont fait les anciens compilateurs C++).

l'importance du paradigme orienté objet n'est pas tant dans le mécanisme du langage que dans le processus de pensée et de conception . Dans la programmation procédurale, la réflexion porte sur les opérations et la décomposition de ces opérations en utilisant d'autres opérations, en les regroupant en modules, etc. Cela signifie que les données ou l'état entrent dans une importance secondaire. C'est comme penser à des opérations mathématiques.

l'objet le paradigme orienté, d'un autre côté, dit que vous devez penser à l'état et aux opérations ensemble comme une entité, puis concevoir votre programme comme des interactions entre des entités qui échangent l'état et activent les opérations.

15
répondu Uri 2009-02-10 02:53:26

à mon humble avis, la programmation orientée objet est un concept qui existe à un niveau d'abstraction plus élevé que la programmation procédurale. Les deux ne sont pas mutuellement exclusifs en ce que les méthodes individuelles dans un programme OO ressemblent à peu près la même chose que les fonctions individuelles dans un programme de procédure. Cela contraste avec, par exemple, la programmation fonctionnelle, qui exige un État d'esprit complètement différent. De plus, vous pouvez écrire de manière procédurale dans un langage OO en rendant tout statique, etc. Vous pouvez être un compilateur humain et écrire efficacement du code OO en C en utilisant beaucoup de pointeurs de fonction et de lancer de pointeur struct.

OO, ensuite, est plus d'une conception de la philosophie et la vision du monde que quelque chose w/ une définition rigoureuse. Il exige que l'héritage, le polymorphisme, etc. être utilisés comme des modèles majeurs dans la structuration de votre code, et que la syntaxe soit fournie pour rendre ces expressifs sans recourir à des trucs de bas niveau. Il exige que vous pensez de code qui agit sur l'état de une collecte de données en tant que propriété des données, et non une procédure qui existe par elle-même. Il n'est pas noir et blanc. Votre code peut être "plus " ou" moins "oo selon l'importance que vous accordez à l'héritage, au polymorphisme, aux classes et aux" méthodes en tant que propriété des données". vision du monde comme moyen de structurer et d'expliquer/comprendre votre code.

10
répondu dsimcha 2009-02-10 01:51:00

OO est surtout un État d'esprit. Vous pouvez programmer OO en C (si vous voulez vraiment ... ), et vous pouvez parfaitement avoir du code de procédure en C++/Java; ce que je veux dire, c'est que, même si vous utilisez des classes à la surface, cela pourrait quand même être procédural.

L'idée derrière OO est l'abstraction de l'etat. Au lieu de "penser" en termes de "groupes de données", vous "penser" en termes d ' "objets", où un objet est une "interface" pour "regroupement de données et de moyens de manipuler ces données".

tout cela sonne philosophique, parce que c'est .

il y a beaucoup à dire ici, et il ne peut pas être tout dit dans un si petit poste, donc je vais le laisser ici.

mise à JOUR

Comme mentionné dans réponse de Flanagan , les langues oo mettent en œuvre des constructions qui utilisent cette abstraction.

je veux dire, vous pourriez techniquement "Hacker" des classes et polymorphisme en termes de structures, fonctions, et pointeurs de fonction.

Voici un exemple de OO en C

8
répondu hasen 2017-05-23 12:03:09

la différence est que les objets ont des procédures et des données connexes dans le même endroit - les langues de procédure utilisent des 'structures' (choses qui tiennent des données connexes ensemble) qui maintient les données séparées des procédures. En effet, tout ce que vous faites dans une langue OO devrait être possible dans un langage procédural avec une combinaison de structures et de procédures.

La principale différence est l'état d'esprit qu'un OO langues met programmeurs.

6
répondu vanja. 2009-02-10 01:12:19

[pardon de l'amorce de style, il est tard et je suis fatigué]

procédures de traiter des données - données, appliquez un peu de traitement, d'obtenir les données

parfois, certains des éléments de données sont liés à d'autres éléments de données, et il est commode de les regrouper dans une structure de données , qui peut ensuite être manipulée et traitée comme une seule unité.

maintenant notre procédure peut prendre une structure comme entrée et le modifier et / ou produire une autre structure de données comme sortie

nous remarquons parfois que certaines procédures ne concernent qu'un certain type de structure de données; il est commode de regrouper ces procédures avec leur structure de données, et de l'appeler un objet .

un modèle pour créer des objets est appelé classe ; un objet est dit être une instance d'une classe

nous pouvons remarquer qu'une classe est très semblable à une autre, donc au lieu de copier et coller le code, nous laissons une classe hériter d'une autre: la sous-classe hérite de la superclasse ou"classe de base". De cette manière, la sous-classe a accès à toutes les structures de données et procédures de la superclasse et peut les augmenter ou les outrepasser de certaines manières

si nous demandons poliment à un objet de faire quelque chose pour nous au lieu d'appeler brutalement ses procédures directement, cela s'appelle message passant , même si aucun 'message' réel n'est transmis. La joie ici est que beaucoup de différents types d'objets peuvent comprendre le même message, ce qui conduit à la notion de polymorphisme . Par exemple, nous pouvons demander à différents types de documents de S'imprimer, et ils répondent chacun de manière appropriée.

un langage qui supporte des objets (via des classes ou non) avec transmission de messages et héritage est appelé object-oriented . S'il n'y a pas d'héritage, le langage est simplement basé sur l'objet .

bonne chance pour vos études!

6
répondu Steven A. Lowe 2009-02-10 02:35:36

procédural fait partie de la distinction procédurale/fonctionnelle/logique (OU logique orientée) (comparez C, lisp, et prolog) entre différentes façons de décrire ce qu'un programme devrait faire.

L'orientation de L'objet est orthogonale à cette autre idée, et décrit un moyen de grouper des sous-programmes avec des données. C++ et java sont des langages procéduraux avec des fonctionnalités orientées objet; fortran77 est un langage procédural sans fonctionnalités orientées objet. Soutiens communs du lisp orientation de l'objet; certains lisps plus anciens ne le font pas. Simple Vanilla prolog ne supporte pas les objets, et je ne peux pas nommer un langage orienté logique qui le fait (je ne fais pas la programmation orientée logique, il est sur ma liste de choses à faire quand je ont un temps libre copieux. J'ai à peine faire de la programmation fonctionnelle).

comme d'autres l'ont noté, cependant, une pensée orientée objet appropriée change la façon dont vous faites votre programmation autant qu'un passage de la procédure à la fonctionnelle.


BTW-- je vois que le terme "procédural"a beaucoup été utilisé pour distinguer les langages procéduraux non orientés objet de leurs frères orientés objet, mais je pense que c'est un mauvais usage dû à l'absence d'un adjectif propre pour "non orienté objet". YMMV.

4
répondu dmckee 2009-02-10 01:28:01

est plus facile à comprendre dans le contexte, à regarder les autres abstractions introduit entre les langues.

une différence clé entre le langage de l'assemblée et un langage procédural comme C ou Pascal est l'introduction de l'abstraction" procédure". Les gens écrivant le code d'Assemblée créent des procédures, mais son dur et sujet à des erreurs, un langage de procédure vous donne des outils pour le rendre plus facile.

La différence entre un langage procédural et un langage OO comme C++ est l'abstraction "objet". Les personnes qui écrivent " c "créent souvent des objets conceptuels mais son difficile et tendance à l'erreur , un langage OO vous donne des outils pour le rendre plus facile.

des Choses comme Chanter# de Microsoft (ou Erlang) ajouter le Message/le Processus d'abstraction dans la langue. Bien sûr, vous pouvez faire le passage de message et la création de processus en assembly, C ou C++ mais Sing# le rend plus facile.

tout vient jusqu'au même code machine, ces abstractions sont purement pour le bénéfice de nos cerveaux, pas de l'ordinateur.

2
répondu Maurice Flanagan 2017-05-23 11:33:26

dans un programme de procédure, vous divisez un grand problème en petits problèmes, et abstraites chacun de ces petits problèmes comme une procédure. Ceci est appelé la procédure d'abstraction.

dans les programmes orientés objet, vous analysez un problème comme certains objets, et l'interaction entre les objets. Cela s'appelle de l'objet de l'abstraction.

2
répondu wlqSmiling 2012-03-04 15:27:05

la différence est

programmation axée sur la procédure - donne de l'importance à l'algorithme plutôt qu'aux données.Cette façon de programmer se concentre sur les procédures I. e méthodes permettant d'effectuer des tâches spécifiques et de partager leur structure de données. Il suit les structures descendantes.

exemple: Pascal et C

programmation orientée Objet - Donne de l'importance à l'information plutôt que de l'algorithme. Il suit les structures ascendantes.Chaque chose est considérée comme un objet. Chaque objet a sa propre structure et procédure de données. Il comprend des caractéristiques comme la dissimulation de données, le polymorphisme,l'encapsulation et la transmission de messages. Les utilisateurs n'ont à peine de quoi à l'intérieur de ces objets , tout en les utilisant dans leurs programmes.

exemple: C++ et Java

2
répondu myk. 2013-02-09 07:42:39

il s'agit d'une réponse simplifiée.

  • dans un vrai langage OO, le seul codage procédural se fait à l'intérieur d'un objet.

  • c n'a pas d'objets et C++ est un langage qui supporte les objets. Java d'un autre côté tout est un objet(sauf les primitives). Tout ce qui est tapé.

  • progression linéaire se produit à l'intérieur des objets mais les objets ce ne sont que des collections de code et de données.
1
répondu WolfmanDragon 2009-02-10 02:32:00

cela dépend de la façon dont vous définissez OOP. En termes de Java-like OOP où vous appelez les méthodes sur les objets, la programmation procédurale est à peu près la même. Autant que je peux dire, vous pouvez émuler tous les principes OOP (encapsulation, abstraction, polymorphisme, héritage) dans un langage procédural comme C. preuve de ceci est GObject , à certains étendre Objectif-C, et de nombreuses autres implémentations de langage OOP en utilisant C, comme cPython. Ceci est fait en utilisant des structures et en ces structures utilisant des fonctions:

typedef struct {
    Object *isa;
    String *name;
    Date *birthday;
} Person;

Person *Person_new();
String *Person_name(Person *self);
void Person_setName(Person *self, String *newName);
// ...

l'interface est très OOP comme. Cela ne permet pas vraiment le polymorphisme, mais c'est aussi possible. Il est très similaire à une interface Python, sauf que les attributs sont séparés des "méthodes":

class Person(object):
    def __init__(self):
        self._name = ""
        self._age = datetime.datetime.now()

    @property
    def name(self):
        return self._name

    @property
    def age(self):
        return self._age

j'ai choisi Python pour l'exemple, parce que "auto" est explicite, comme dans l'exemple C. Beaucoup de langues OOP, comme Java, abstraient ceci.

il y a aussi le Smalltalk-comme la programmation orientée objet où les messages sont envoyés à des objets, plutôt que d'appeler des méthodes sur des objets. La différence est subtile à première vue, mais elle offre beaucoup de puissance et de flexibilité. Cela peut également être mis en œuvre dans les langues de procédure, comme le prouve L'objectif C.

la programmation orientée Objet n'est pas nécessairement un type de langage, mais plutôt un changement de paradigme. Les langages orientés objet tels que Java, Python, Ruby, etc. fournissent du sucre syntaxique pour manipuler facilement les objets, et c'est la principale différence entre les "langues procédurales" et "langages orientés objet".

en effet, une bibliothèque, ou plutôt un ensemble de fonctions fonctionnant sur une structure, est le même qu'un objet en C++. En fait, C++ est implémenté de cette façon.

1
répondu sebnow 2009-02-10 05:07:45

beaucoup de points intéressants déjà mentionnés ici.

une façon de penser à ce sujet est que dans OO, vous avez l'idée d '"objets" qui sont des choses qui ont des caractéristiques et des comportements inhérents à eux. Ils ont généralement une sorte d '"interface" publique qui fournit un mécanisme pour récupérer certaines informations à leur sujet, mais l'objet lui-même, ou plutôt sa "classe", limite ce que l'information est publiquement disponible. Les entrailles de l'objet ne sont pas exposés à le public parce qu'il n'est généralement pas nécessaire de connaître les détails sales "sous le capot" de l'objet. Donc orientée objet de programmes utilisent cette construction, ainsi que d'autres choses.

la programmation procédurale n'utilise généralement pas un tel couplage de données et de comportement dans un 'objet'. Je l'ai vu faire en C avant mais ce n'était pas vraiment et impliquait beaucoup trop d'affaires de singe pour se rapprocher de ce que l'on pourrait faire avec, disons, C++.

une des idées derrière le développement orienté objet est que je ne devrais pas être en mesure de muck avec vos données par d'autres moyens que ceux que vous avez fournis. Si vous me fournissez seulement une interface bien pensée, vous pouvez me garder honnête. Maintenant, si vous utilisez une approche procédurale et que vous m'envoyez une structure qui n'a pas de protection intégrée, alors je peux faire ce que je veux et si je suis stupide ou Diabolique, je peux changer des choses que vous ne voudriez pas que je change.

accordé, vous pouvez contourner l'objet si vous êtes intelligent, mais vous devez sortir du chemin pour le faire.

ce n'est pas complet, mais c'est un aspect.

0
répondu itsmatt 2009-02-10 01:42:26

la façon dont C++ est implémenté ne fait que faire ressembler la programmation OO à de la programmation procédurale. Vous devez changer légèrement votre façon de penser.

dans les objets C++ ont des méthodes qui sont juste des procédures qui agissent sur l'objet. Mais dans un vrai oo paradiam vous devriez penser aux méthodes comme des messages potentiels que l'objet peut recevoir (c'est-à-dire des lettres). L'objet reçoit un message (les paramètres représentent la charge utile du message c'est à dire le contenu de la lettre) et change son état en fonction du message.

0
répondu Martin York 2009-02-10 01:42:27

pour un exemple assez concret de la différence entre procédure et OO, essayez D'apprendre Smalltalk. En Smalltalk, tout, et je veux dire tout est un objet. Il n'y a pas si-états ou alors que des boucles. Vous atteindre cette fonctionnalité par l'envoi de messages (un.k.un. invoquer des méthodes) d'autres objets. Ça te fait vraiment tourner la tête au début, mais je pense que tu vas vite voir ce que OO est supposé être.

0
répondu moffdub 2009-02-10 05:20:35