Pourquoi devons-nous apprendre la programmation procédurale avant d'apprendre la programmation orientée objet [fermé]

10

Je suis en 4e année dans une université informatique maintenant, et quand je parle avec mon professeur de ce sujet, il rejette mon opinion et me fait une critique très lourde (dans mon université, on nous enseignait le C (ANSI) (en procédural) Cours de programmation - en 1ère année à l'université) avant C ++ (en classe OOP en 2ème année) et autres ...

Mais à 13 ans, mon frère a appris, par moi, Java d'abord et rien d'autre. Maintenant, il peut faire presque tout ce qu'un étudiant normal de 2e année peut faire avec Java.

Pour vous, pros, j'aimerais savoir pourquoi vous pensez que nous devrions d'abord apprendre la programmation procédurale.

Luc
la source
8
Parce que l'assembleur n'a pas d'objets.
9
C'est comme pourquoi nous devrions apprendre à calculer correctement avant d'apprendre à utiliser une calculatrice.
22
Parce que la conception orientée objet est défectueuse. Les programmes sont une collection de comportements qui opèrent sur les données. Les objets introduisent souvent une complexité inutile. Lisez "Comment concevoir des programmes: une introduction à la programmation et à l'informatique".
8
Comme l'a dit quelqu'un d'autre, "Ne distrayez pas les nouveaux programmeurs avec la POO": prog21.dadgum.com/93.html - essentiellement tout ce que la POO fait pour enseigner aux nouveaux programmeurs les principes fondamentaux. Vous leur enseignez deux concepts vraiment difficiles en même temps.
John Ripley
7
@juxstapose - dire que la programmation orientée objet introduit une complexité inutile revient à dire que nous devrions tailler les véhicules à partir d'un seul bloc d'acier. Juste mon avis.

Réponses:

23

Résumé rapide:

  1. Parce que dans le monde réel, tôt ou tard, vous devez travailler avec du code procédural.

  2. Parce que les langages procéduraux peuvent fonctionner comme une extension ou une introduction aux langages orientés objet, au lieu d'être simplement une alternative.

  3. Complément à la réponse 2. Parce que la POO est plus complexe que la programmation procédurale, il est donc préférable d'apprendre la programmation procédurale en premier.

  4. Parce que dans le monde réel, les programmeurs travaillent avec et combinent plusieurs façons de résoudre les problèmes, la "programmation multiparadigm" AKA, pas seulement un seul paradigme.

  5. La plupart des langages de programmation sont multiparadigm, à un certain niveau, même si leurs concepteurs ou développeurs communs disent le contraire.

  6. [NOUVEAU] Parce que la programmation modulaire qui est généralement mélangée et confondue avec la programmation procédurale, peut être appliquée à la POO. Par conséquent, la question peut être lue comme "Pourquoi devons-nous apprendre la programmation modulaire avant d'apprendre la programmation orientée objet"

Description détaillée de l'ennui:

Le point 1 est très clair, pas d'explication supplémentaire.

Point 2, classes, héritage, polymorphisme, interfaces, etc.

Point 3, je code du Pascal procédural avant d'apprendre le Pascal orienté objet, quand je suis arrivé, j'ai dit: "regardez, les classes sont comme de petits programmes procéduraux ... ... et vous pouvez les faire parler entre elles, cool !!! ".

J'ai entendu la même chose de la part de gens qui sont passés du simple C au C plus plus.

Point 4, La plupart du temps, les programmeurs combinent plusieurs techniques ou paradigmes de programmation ou façons de résoudre un problème. Fonctionnel, procédural, POO, logique.

Même Java "Pure OO" n'est pas aussi simple que la programmation d'objets.

+1 point pour dire "Programmation procédurale" au lieu de "Programmation structurée". Ou programmation modulaire. C'est important.

Cependant, ces termes sont souvent enseignés ensemble et utilisés de manière interchangeable, ils ne le sont pas. La programmation structurée comprend de nombreux concepts, pas seulement l'utilisation de procédures, et l'un d'eux fait en sorte que le programme ne ressemble pas à du "code spaghetti".

Aujourd'hui, j'ai lu plusieurs programmes OO «purs» qui ressemblent à du «code orienté objet spaghetti», ce qui signifie que le programmeur a utilisé la POO, mais son code ressemble à un gâchis.

Plusieurs fois, je peux lire un code OO et dire que le programmeur a appris la programmation structurée avant la POO, car le code est clair et organisé.

Et pour la programmation modulaire, j'ai vu plusieurs applications. en C ++ et PHP qui n'utilise pas de modules. *

umlcat
la source
18

Je pense que l'analogie serait similaire aux mathématiques. Vous devez d'abord apprendre quelques concepts de base (addition / soustraction / ...) puis passer à des sujets plus complexes (algèbre / calcul). Le programme procédural est très linéaire et il est plus facile de saisir le flux de contrôle pendant que vous apprenez la syntaxe. La POO est peut-être considérée comme plus complexe, elle s'appuie sur les constructions plus simples utilisées dans les langages procéduraux mais est plus abstraite et plus difficile à comprendre. Commencer avec des langages tels que C vous rapproche également du matériel et vous fait face à des problèmes d'allocation de mémoire et de pointeurs, que vous devez comprendre mais que vous n'avez pas vraiment à utiliser dans des langages tels que Java / C #. Il y a une réelle valeur à y être exposé à l'école, que cela arrive en premier ou en deuxième.

FWIW, il est appelé à changer éventuellement. Quand j'ai commencé l'école, nous avons appris en Pascal et PL / 1. Nous ne sommes pas arrivés à C jusqu'à la classe de langues avancées (qui me date). Je n'ai pas pris Java avant les études supérieures - il n'avait pas encore été inventé!

tvanfosson
la source
+1 - sorte de paradoxe d'intention là-bas ... "plus abstrait et plus difficile à comprendre" :)
10
@Spacemoses - pas vraiment, plus quelque chose est abstrait, plus la discussion est facile, mais plus il est difficile de saisir la réalité de ce qui est discuté.
d'accord, je vois votre point maintenant.
ses011
12

La programmation orientée objet est une collection d'extraits de procédure de manière organisée. Je pense que la leçon que vous apprenez est que la méthodologie orientée objet aide à maintenir l'organisation et la maintenabilité. Il y a beaucoup de programmeurs qui ne peuvent pas faire cette distinction et prétendront que leurs programmes sont orientés objet lorsqu'ils sont plus procéduraux.

ses011
la source
3
mais fonctions + état = objets
Dan D.
4
L'orientation des objets rend souvent la maintenance beaucoup plus difficile car elle gonfle la base de code. Les systèmes basés sur Java sont un cauchemar à entretenir en raison du niveau de pureté OO et du patternitis de conception trouvés dans cette communauté.
bit-twiddler
1
"Modèles de conception trouvés dans cette communauté" - sonne comme un problème personnel dans la "communauté Java" si telle est votre position.
ses011
1
@Dan D: l'orientation de l'objet est bien plus que de combiner des fonctions et des états dans un objet ...
Marjan Venema
4
@Spacemoses: J'ai un problème avec toute communauté de développement qui n'adhère pas au principe KISS. La meilleure solution à un problème est souvent la solution la plus simple.
bit-twiddler
11

Non.

Nous avons d'abord appris la programmation fonctionnelle , avec Scheme. Ensuite, nous sommes passés à la procédure, puis à la POO, puis à la programmation déclarative. Et croyez-le ou non, alors que je connaissais déjà la programmation, je pense que c'était aussi plus facile pour les autres: parce que la FP, c'est comme les mathématiques! Vous connaissez donc déjà les bases.

J'ai discuté de cela avec moi-même à plusieurs reprises, et j'ai finalement conclu que cela dépend vraiment de la façon dont votre professeur vous enseigne les concepts.

Il n'y a pas de réponse unique car:

  • Commencer par quelque chose de procédural comme C (ou même un assemblage) peut être un bon choix, car vous apprenez comment les ordinateurs fonctionnent vraiment

  • Commencer avec quelque chose de Java orienté objet peut être un bon choix, car il est relativement facile d'apprendre et d'appliquer la POO à la vie réelle, et parce qu'il vous apprend à ** former

  • Commencer avec une programmation fonctionnelle comme Scheme pourrait être un bon choix car il vous apprend à penser de manière plus abstraite (en termes de fonctions plutôt que de variables), ce qui fait de vous un meilleur programmeur

Si votre professeur ne l'enseigne pas bien, alors peu importe avec quoi vous commencez; ils seront à peu près les mêmes.

user541686
la source
4
+1 et je n'arrive pas à croire que j'ai dû faire défiler tant de mauvaises réponses pour le trouver!
jk.
En fait, j'ai eu du mal à jouer des fonctions mathématiques pendant un certain temps parce que j'avais d'abord appris le codage, et le concept d'une fonction qui est 'au lieu de' faire des choses 'm'a dérouté. : 3
StarWeaver
6

Un langage peut être orienté objet comme C ++, Java ou C #. Et vous pouvez commencer avec ces langues. Mais le fait est que, même avec ces langages OO, vous devez d'abord apprendre la programmation procédurale, puis la POO. Je pense que vous avez fait la même chose à votre frère.

Gulshan
la source
3
+1 Précisément. Chaque méthode POO est un programme procédural court. Si vous ne savez pas comment combiner les petits morceaux (types, valeurs littérales, variables, opérateurs, =affectation, if, for, etc) en gros morceaux (méthodes), comment pouvez - vous espérer comprendre POO. Comme pour la plupart des compétences, être très intelligent, motivé et / ou avoir accès à un enseignement individuel peut vous permettre d'apprendre simultanément plusieurs sujets connexes.
David Harkness
3

La programmation procédurale, au moins dans un langage comme C, dépouille la programmation à une pratique très simple: les algorithmes et les structures de données, et à un niveau d'abstraction qui est un juste milieu entre le code source compréhensible par l'homme et le code assembleur.

De cette façon, les étudiants peuvent apprendre un peu de science (algorithmes, structures de données) et un peu d'ingénierie (source-> objet-> compilation de la machine, architecture von-neuman (probable)) en même temps.

La POO, via C ++ / obj-C, introduit un modèle d'organisation de code, ce qui est juste une chose de plus à apprendre. Cela pourrait rendre l'apprentissage des concepts ci-dessus un peu plus difficile.

La POO via Java (entre autres) va encore plus loin en faisant abstraction du matériel et de l'environnement. Maintenant, le produit sous-jacent n'est pas du code machine, mais une sorte d'intermédiaire qui ne révèle pas le fonctionnement du matériel sous-jacent, mais l'effet est qu'il permet à l'étudiant de se concentrer sur les modèles d'organisation du code.

En fin de compte, je pense que c'est un compromis entre apprendre comment fonctionne le matériel ou apprendre un modèle d'organisation de code. Quant à ce qui est le plus important, je ne sais pas vraiment. Le monde réel nécessite la connaissance des deux, au moins dans une certaine mesure.

Je vais supposer qu'un programme de premier cycle qui commence par une programmation procédurale de bas niveau produit probablement des informaticiens / ingénieurs en informatique, et un programme qui commence par des concepts de niveau supérieur produit des ingénieurs / développeurs / programmeurs en logiciels.

Curtis Batt
la source
3

Les entrailles des objets POO sont constituées de programmation procédurale.

Si vous ne pouvez pas faire de boucle for, utilisez correctement les pointeurs, déclarez vos types et fonctions, vous ne pourrez pas écrire d'interfaces pour vos classes et encore moins faire faire à l'intérieur quelque chose qui en vaille la peine.

De toute façon, vous n'apprendriez vraiment pas la POO dans une classe d'introduction, ce serait juste de la syntaxe - sauter directement dans la POO rendrait les choses plus compliquées à saisir (au début) qu'elles ne le sont déjà.

La POO ne concerne pas la déclaration de syntaxe pour former des classes, elle concerne les structures de données, les modèles de conception, le polymorphisme, l'héritage et la composition.

Pour faire toutes ces choses dont vous avez besoin de connaître la programmation procédurale, quelque chose de facile à faire en C. Vous pouvez tout de même transporter presque tout ce que vous apprenez avec C en Java ou C ++, vous devrez peut-être repenser certaines choses que vous teniez pour acquises en C, MAIS ... Vous devez connaître la grammaire (où vous en êtes dans l'introduction C) pour écrire des phrases (vous devez écrire des procédures pour définir les interfaces) puis des paragraphes (vous devez connaître les structures de données), puis connaître certains modèles de conception (tragédie, comédie, défauts) héros, comment ils interagissent et quand ne pas les utiliser) avant de pouvoir écrire des romans complets (système OOP complet).

Si j'étais vous, je prendrais certains des livres suivants: Le langage de programmation C , le langage de programmation Java , les modèles de conception , le gang des quatre et les hachures de modèle . Je prendrais certainement une copie du langage de programmation C si j'étais sérieux au sujet de C / C ++.

Si vous voulez simplement aller jusqu'à Java (et le faire pour l'ID $), prenez quelques livres sur les modèles de conception Java et comment utiliser Java avec les serveurs Web Apache et Tomcat et quelques livres sur la programmation de base de données SQL. Java botte tellement de fesses sur le web, je suis désolé, mais PHP a eu une histoire de tonnes de failles de sécurité, ce qui rend la tâche aussi difficile que Windows pour empêcher le rootage de votre serveur ou l'injection de vos bases de données SQL.

Vous devriez également prendre le temps d'apprendre SQL, Oracle MySQL Postgresql et MSSQL ont beaucoup en commun en ce qui concerne la syntaxe, mais si je devais simplement en choisir un pour moi, choisissez Postgresql simplement parce qu'il est sous licence BSD au lieu de GPL (vous devriez rechercher une comparaison et le contraste sur les licences GPL / BSD aussi)

Hategrin
la source
2

Je dois dire que la plupart du code écrit dans des langages orientés objet comme Java n'est pas réellement orienté objet. Il est difficile de vraiment comprendre les idées derrière OO, par conséquent, le code OO est censé être essentiellement procédural.

Cependant, cela n'a rien de mal à écrire du code procédural en Java. Oui, il y a des avantages à faire OO, mais ce n'est pas quelque chose que je voudrais confondre avec un programmeur débutant. Donc, sur cette base, je ne vois rien de mal à enseigner Java. Ne vous attendez pas à de vrais OO, mais cela fonctionne.

Cependant, Java cache beaucoup de détails de bas niveau sur ce qui se passe à l'intérieur de l'ordinateur. C laisse ces éléments beaucoup plus à découvert. On peut démontrer que les élèves devraient apprendre comment fonctionnent ces détails de bas niveau avant d'utiliser un langage qui s'en occupe pour eux. Mais vous pouvez également faire valoir que vous devez ignorer ces détails et les apprendre plus tard.

Winston Ewert
la source
2

Plusieurs autres ont déjà répondu sur ce thème, mais je pense qu'il vaut la peine de le dire plus explicitement.

Même si vous commencez à apprendre la programmation avec un langage orienté objet comme Java, vous commencez par apprendre les techniques de programmation procédurale avant d'arriver aux concepts OO . Lorsque vous enseignez un nouveau programmeur Java, vous ne les introduisez pas d'abord aux objets et aux classes, vous les introduisez aux instructions et aux variables. Au moment où l'étudiant est en mesure d'apprendre beaucoup sur les objets et les classes, ils ont déjà au moins les bases de la programmation procédurale.

Donc, au moins, vous devez apprendre la programmation procédurale en Java, puis apprendre la programmation orientée objet en Java. Que vous passiez une année entière à la programmation procédurale ou que vous passiez simplement les premières semaines du cours de programmation, et que vous utilisiez ou non un langage différent, vous vous contentez de discuter des détails.

Ben
la source
0

Pour être trop brutal à ce sujet, je pense que l'élan pour cela vient principalement des anciens programmeurs qui souhaitent les temps anciens.

Avant de dire quoi que ce soit d'autre, je n'ai absolument aucune contention pour les programmeurs plus âgés, beaucoup d'entre eux sont tout simplement incroyablement qualifiés. Malheureusement, parfois, ceux qui ne le sont pas, qui s'échouent et qui n'ont jamais vraiment été vraiment bons en programmation pour commencer ... deviennent des professeurs quand ils ne peuvent pas le pirater dans le «monde réel». (Pas tous les professeurs non plus ... mais ... BEAUCOUP)

La POO n'est pas le Saint Graal de la programmation qu'elle est censée être, la programmation procédurale n'est pas non plus une relique. Il est bon de connaître au moins certains des deux, mais je pense que la pratique générale de ce qui finit par être enseigné en tant que programmation procédurale a tendance à être une énorme perte de temps et d'efforts. Nous devons apprendre la programmation dans le monde universitaire, pas seulement un style ou l'autre. J'attribue un peu de code terrible et d'idées fausses à cela, y compris le mien.

Garet Claborn
la source
2
J'avais un professeur utilisant C à partir de 1989, mais c'était pour une micropuce qui attendait 1999. Ensuite, il y avait cet autre enseignant utilisant «c ++» mais sans la STL ou les modèles. Peut-être aussi des structures avec des pointeurs de fonction.
Ape-inago
1
Pour être honnête, la STL et les modèles en général ne sont pas des sujets d'introduction C ++. L'objectif fondamental de tout cours de programmation de niveau 101 est d'enseigner comment créer une logique séquentielle, conditionnelle et itérative bien structurée dans les limites d'une syntaxe donnée. Toutes les autres fonctionnalités du langage ne sont que du sucre syntaxique qui permet de regrouper les structures de contrôle de base et de les lier aux données.
bit-twiddler
aie deux downvotes. J'ai vu que cela venait = P étrange pour moi, car l'opinion venait à l'origine d'un programmeur plus âgé qui m'a aidé à me remettre d'un mauvais enseignement. @Ape: Le chef de notre département CS essayait de nous enseigner le COBOL pendant un an en 2004 XD (le moindre de mes soucis de son style `` d'enseignement '', ça ne me dérange pas car je peux travailler sur certains points de vente machines lol mais geeze ... sérieusement?)
Garet Claborn
1
@ bit-twiddler - Oui monsieur, très étrange. Je ne me fie pas beaucoup à cette expérience dans cette opinion, mais j'ai cherché dans d'autres endroits. J'aime vraiment les deux styles de programmation et il me semble qu'ils devraient les enseigner ensemble. Je constate simplement que les professeurs, même un peu plus jeunes, n'ont pas le même pourcentage de fanatisme sur la question. OMI, c'est une bonne chose. Je comprends que certains pensent que la procédure est d'abord importante.
Garet Claborn
1
@ bit-twiddler: oui, mais ce n'était pas un cours d'introduction. C'était un cours avancé de 4e année en conception de bases de données, et nous étions censés utiliser c ++. Cela semblait juste mal après avoir expérimenté le c ++ à un niveau si élevé avec les cours précédents.
Ape-inago
0

Deux raisons pour moi: une programmation OO est venue résoudre des problèmes de programmation procédurale. Ainsi, en écrivant du codage procédural puis les mêmes choses dans OO, il est plus facile de comprendre la différence.

Il y a également un élément supplémentaire ici: Les deux approches pour éduquer sur des sujets de programmation. On peut commencer aussi bas que possible (exemple d'assemblage, dans de nombreux endroits procéduraux, d'autres commencent par des circuits) puis remonter (vers OO / Functional / Managed). L'autre approche consiste à partir du monde physique (par exemple, navigateur / Windows 7, etc.), puis à approfondir. Il y a des avantages et des inconvénients à chaque approche. Votre université a choisi la première et commencer par la procédure. Il pourrait y avoir une justification ou ils ont juste copié quelqu'un d'autre :-).

Dimitrios Mistriotis
la source
1
"La programmation OO est venue résoudre des problèmes de programmation procédurale." C'était l'objectif, mais OO a créé autant de problèmes qu'il a résolu.
bit-twiddler
@ bit-twiddler: Très grande histoire. En se concentrant (ou en le rétrécissant) sur l'aspect pédagogique, cela démontre: ce que nous avions, comment nous l'avons amélioré: cela (vous discutez si c'est mieux ou pas)
Dimitrios Mistriotis
0

Il n'y a pas d'autre raison que l'inertie institutionnelle. Regardez CMU, ils ont jeté tout leur programme OOP et l'ont remplacé par une programmation fonctionnelle. Encore une fois, la réponse à votre question est que c'est un choix arbitraire fait par les administrateurs de l'école que vous fréquentez. Au cas où quelqu'un s'interrogerait sur les déclarations factuelles que j'ai faites ici, c'est le post sur la modification du programme d'études à la CMU par un professeur / administrateur: Enseigner la PF aux étudiants de première année .

davidk01
la source
1
-1 trompeur - alors que j'ai vu un fil (via la recherche Google) qui affirmait que la CMU avait supprimé la POO de son programme CS de première année et l'avait remplacée par une programmation fonctionnelle, le programme officiel de la CMU commence par le langage de programmation Alice, qui est un objet - orienté [voir enr-apps.as.cmu.edu/assets/SOC/CS_SPRING.htm]
Steven A. Lowe
1
@ davidk01: (1) assertion factuellement incorrecte dans la réponse. (2) "Alice est un outil d'enseignement disponible gratuitement conçu pour être la première exposition d'un étudiant à la programmation orientée objet " de alice.org
Steven A. Lowe
2
@Steven A. Lowe: Directement de la bouche du cheval: "La programmation orientée objet est entièrement éliminée du programme d'introduction, car elle est à la fois anti-modulaire et anti-parallèle par sa nature même, et donc inadaptée à un programme CS moderne. Un nouveau cours proposé sur la méthodologie de conception orientée objet sera offert au niveau de la deuxième année pour les étudiants qui souhaitent étudier ce sujet. " - Enseigner la PF aux étudiants de première année
davidk01
1
@ davidk01: excellent lien, merci. D'après le document du comité cité dans cet article "Bien que la programmation orientée objet (dans ses innombrables formes) reste un thème dominant dans le développement de logiciels industriels, l'utilisation de langages orientés objet, tels que Java, au niveau introductif introduit une complexité considérable et distrait des objectifs de base au niveau de l'introduction . Il semble préférable de donner une couverture plus complète de la conception de l'OO et de la méthodologie de mise en œuvre plus tard dans le programme d'études pour permettre une concentration plus ciblée sur les bases au niveau de l'introduction. " [c'est moi qui souligne] ...
Steven A. Lowe
1
@ davidk01: Je suis heureux d'accepter d'être en désaccord. Appelez-moi pédant si vous voulez, mais pour moi, il y a une différence significative entre changer l'accent mis au niveau introductif et "jeter tout leur programme OOP". J'appellerais à peine réduire la portée des cours d'introduction un "changement radical" ;-)
Steven A. Lowe