Programmation structurée versus programmation OO

11

Je fais une présentation qui montre les différences entre la programmation structurelle et la programmation orientée objet et je veux illustrer pourquoi les gens ont besoin de POO avec un exemple où l'application des concepts de POO rendra le codage beaucoup plus facile afin que le public ait vraiment le sentiment qu'il a besoin de POO.

Des idées ??

Ahmed
la source
2
poser cette question sur programmers.stackexchange.com vous donnera plus de réponses.
reggie
2
Quel est votre public? Programmeurs expérimentés non-OO (cobol, etc.)? programmeurs peu expérimentés (étudiants, etc.)? Cadres (pas programmeurs du tout)?
Je n'en avais pas entendu parler auparavant mais j'ai lu la FAQ et je suppose qu'il vaut mieux y poser la question.
Ahmed
peu expérimenté.
Ahmed
4
Je souhaite que certains programmes OO soient mieux structurés.
Scott Whitlock

Réponses:

17

Vous voudrez peut-être aller voir ce petit blog vidéo . Le résultat est que la différence entre la programmation structurée et la programmation OO est une question de ce qu'ils retirent de la programmation, pas de ce qu'ils ajoutent. Les disciplines logicielles telles que la programmation structurée et la programmation orientée objet sont contraignantes et non activantes. Voici quelques définitions. Attention: vous n'allez pas les aimer.

  • La programmation structurée est une discipline imposée à goto (transfert direct de contrôle)

  • La programmation OO est une discipline imposée aux pointeurs vers les fonctions (transfert indirect de contrôle)

  • La programmation fonctionnelle est une discipline imposée lors de l'affectation.

    Le premier n'est pas trop difficile à comprendre. Dijkstra a constaté qu'il était impossible de créer des preuves générales de correction lorsque goto était autorisé dans les algorithmes. Cependant, si les structures de contrôle étaient limitées à la séquence, la sélection et l'itération, des preuves de correction étaient possibles. Bien sûr, nous n'essayons même pas de prouver que les choses sont correctes de nos jours, mais nous aimons la simplicité et l'élégance d'une programmation structurée.

C'est un peu plus difficile à comprendre OO. Nous définissons souvent OO comme l'encapsulation, l'héritage et le polymorphisme. Ce qui est moins connu, c'est que ces trois attributs sont réalisables, et ont souvent été obtenus en C. En effet, C ++ a commencé comme juste un préprocesseur qui s'est compilé en C. Ce n'est pas vraiment difficile à encapsuler en C. Ni difficile à construire structures de données qui sont des sous-ensembles les uns des autres, simulant l'héritage. Le polymorphisme, cependant, est un peu plus difficile. Elle nécessite des pointeurs vers des fonctions qui, en C, sont difficiles à bien gérer. Ce que les langages comme C ++ nous ont donné, c'est une discipline imposée à ces pointeurs de fonctions. Le compilateur C ++ a construit les vtables pour nous et a initialisé les pointeurs en leur sein selon un formalisme strict. Donc, dans un sens très réel, OO est simplement une discipline imposéetransfert indirect de contrôle, c'est-à-dire pointeurs vers des fonctions.

La programmation structurée consiste à savoir comment ne pas utiliser goto. OO consiste à ne pas utiliser de pointeurs vers des fonctions. Et la programmation fonctionnelle est aussi une question de ne pas faire. En programmation fonctionnelle, nous n'affectons pas de variables, sauf dans les cas les plus rigoureusement contrôlés.

Donc, au final, toutes ces «technologies» de programmation sont en fait des disciplines contraignantes plutôt que des technologies habilitantes. Ils nous disent ce pas faire plus que ce qu'ils nous disent ce à faire. Et cela signifie que le développement de logiciels n'a pas augmenté au cours des 40 dernières années. Il a plutôt diminué. Il est de plus en plus contraint car nous avons appris toutes les choses que nous ne devrions pas faire.

Apprendre ce qu'il ne faut pas faire est bien; mais voici la question troublante: quelles nouvelles choses avons-nous appris à faire?

Oncle Bob.
la source
@Ahmed: +1 pour "TL; DR, merci pour la vidéo" - commentaire de bon augure (blague)
n611x007
link rot ... dead link
slashdottir
7

Il existe 3 méthodes de base pour programmer un ordinateur:

  1. Programmation non structurée - avec gotos, comme dans les anciens interprètes BASIC, ou en langage assembleur. Peu de gens programment de cette façon.
  2. Programmation impérative structurée - comme en C ou PASCAL.
  3. Programmation fonctionnelle structurée - comme dans Haskell, ML ou Lisp.

À mon avis, la programmation orientée objet est quelque chose de différent. Il s'agit de savoir comment organiser votre programme à plus grande échelle. Il ne remplace ni ne rend obsolète aucun des 3 paradigmes que j'ai mentionnés ci-dessus - dans un corps de méthode, vous devez toujours choisir l'un des 3 paradigmes de la liste pour écrire.

Ken Bloom
la source
Je ne te comprends pas bien! Vous voulez dire que nous devons utiliser l'un des 3 paradigmes mais NOUS ne savons pas .. et OOP est à peu près plus d'organisation ??
Ahmed
Vous ne pouvez pas programmer sans apprendre la programmation impérative structurée ou la programmation fonctionnelle structurée. Ces deux paradigmes visent à faire avancer les choses. La POO, d'autre part, concerne la modularisation du programme qui n'entre en jeu qu'une fois que votre programme a atteint une certaine taille. Bien qu'elle apparaisse définitivement dans les bibliothèques que vous utilisez lors de la programmation tout le temps, on peut avoir une bibliothèque de classes parfaitement bonne sans fonctionnalités OO comme l'héritage, par exemple les bibliothèques de classes de Haskell, LISP ou Standard ML.
Ken Bloom
4

Tout dépend de la façon dont vous prévoyez le changement.

Les deux concepts se prêtent à la réutilisabilité, mais la POO ouvre la porte à des changements plus faciles. La POO a toute la réutilisabilité de la programmation structurelle, mais vous pouvez également l'utiliser pour créer de nouvelles fonctionnalités avec moins d'effort.

On pourrait dire que la POO hérite de toutes les fonctionnalités de la programmation structurelle avec les fonctionnalités supplémentaires de l'héritage! :-RÉ

corsiKa
la source
Je n'aime pas beaucoup l'héritage en ce moment.
4
Moi non plus, mais c'est parce que le gouvernement a arraché mon grand-père de sa pension. En termes de POO, cependant, l'héritage m'a assez bien servi!
corsiKa
D'après mon expérience, l'héritage est mieux évité dans la POO. À quelle fréquence construisez-vous réellement une superclasse par opposition à une interface? Privilégier la composition en règle générale.
janvier 2011
1
@Janx: "À quelle fréquence construisez-vous réellement une superclasse par opposition à une interface?" Hein? Vous ne "construisez pas de superclasses"; vous prenez des classes existantes et construire subclasss d'eux, et vous le faites que tout le temps. Si vous n'utilisez pas l'héritage, vous n'obtenez pas les avantages de la substitution et du polymorphisme de Liskov, alors que faites-vous en premier lieu dans la programmation orientée objet? La composition est un outil différent avec un cas d'utilisation différent, pas un remplacement de l'héritage. Vous ne devriez pas "favoriser" l'un sur l'autre; vous devez utiliser les deux, chacun pour ce à quoi ils sont utiles.
Mason Wheeler
1
@Mason - il convient de noter que Barbara Liskov (du principe de substitution de Liskov) a en fait dit (longue vidéo) qu'elle n'aime pas particulièrement l'héritage.
Aidan Cully
2

Les concepts sont orthogonaux. La programmation structurée consiste à structurer le code dans les procédures / fonctions / méthodes. Il est parfaitement possible (et souhaitable) de suivre les principes de la programmation structurée au sein des méthodes de classe lors de l'exécution de la POO.

Nemanja Trifunovic
la source
1

C'est une sorte de formulation subjective - la programmation structurée et la POO sont des styles de résolution de problèmes, et l'un n'est pas toujours meilleur que l'autre. L'écriture d'une bibliothèque de méthodes numériques a beaucoup de sens si elle est effectuée dans un style structuré, où vous effectuez des transformations sur les données d'entrée. Un simple agent piloté par une machine à états, cependant, peut être facilement exprimé comme une classe autonome en Java ou C ++. La POO peut être un moyen naturel d'exprimer des conteneurs de stockage pour des structures de données.

Parler de la dissimulation et de la modularité des informations est un bon moyen de motiver naturellement OOP en tant que style.

Steve Yegge a rédigé une version intéressante de cette question - à certains égards, l'une des meilleures descriptions des différences d'approche entre les deux styles.

user18014
la source
0

La POO est plus facile à comprendre lorsque vous créez un modèle commercial. Lorsque vous pensez à des éléments d'application, vous utilisez certains OBJETS et RELATIONS entre eux, par exemple le livre a un (des) auteur (s), un titre, un ISBN. Le livre est à laisser à la bibliothèque et pourrait être emprunté par l'étudiant. La programmation structurelle impose la réflexion sur des processus spécifiques, des implémentations qui ne sont pas en abstraction.

La POO est conçue pour faciliter les changements. La modification du programme structurel est possible mais doit être décrite par code. Le changement dans le programme OO pourrait être décrit par un changement de modèle abstrait.


la source
0

Portée variable:

Je pense qu'un principe des langages pour assurer une bonne programmation est de restreindre la portée des variables. Dans les langages structurés comme C, la portée est principalement de deux types -

  • Portée mondiale
  • Portée locale / fonction / méthode

Nous savons tous que la portée mondiale est nuisible. Mais parfois, les étendues locales ne suffisent pas pour exécuter le programme. Éviter les étendues globales tend alors à une utilisation plus large des pointeurs, ce qui permet d'utiliser des variables hors de la portée. Mais les pointeurs sont difficiles à comprendre et à utiliser.

Les langages POO comme C ++ ajoutent un nouveau type de portée - portée de classe / objet par encapsulation. Cette portée est encore renforcée par les variations privées / publiques. Et cela résout de nombreux problèmes de portée variable. Les étendues sont plus définies dans la POO. Et les pointeurs sont moins nécessaires.

C'est l'une des grandes fonctionnalités de la POO.

Gulshan
la source