Y a-t-il une différence d'apprentissage OOP sur différents langages de programmation? [fermé]

9

Je veux apprendre la POO. Je connais Python et je sais très peu de choses sur la POO.

Mais quand je cherche "apprendre OOP" dans les forums, j'ai vu un gars dire que "Python est si nouveau c'est pourquoi vous ne pouvez pas apprendre OOP sur Python. Vous devez apprendre Java puis comprendre OOP sur Java"

Est-ce vrai? Y a-t-il une différence dans la compréhension de la POO sur différents langages de programmation? comme l'apprendre sur Java, C #, C ++, Perl ou Python?

user2783998
la source
12
"Python est tellement nouveau que vous ne pouvez pas apprendre OOP sur Pyton. Vous apprenez Java puis comprenez OOP sur Java" Cela n'a aucun sens pour moi. Si vous voulez apprendre la POO en utilisant Python, je ne vois pas pourquoi. Fonce!
FrustratedWithFormsDesigner
13
Python n'est-il pas plus ancien que Java? Du haut de ma tête, je crois que oui, mais je pourrais être absent d'ici quelques années.
Jimmy Hoffa
2
@JimmyHoffa C'est en effet. 91 contre 95 selon Wikipedia.
Evicatos
2
@JimmyHoffa: allez, ça ne peut pas être vrai, n'est-ce pas! Nous savons tous que Java a été le premier langage OO de tous les temps. "Le soleil annonce bruyamment la nouveauté de Java" ... - Quant à la question ... pourquoi êtes-vous déterminé à apprendre OO? Cela vous sera imposé assez tôt. Python est un excellent point de départ pour obtenir des informations sur les avantages de plusieurs paradigmes de programmation.
leftaroundabout

Réponses:

10

Un objet en tant que construction théorique est très simple: c'est une structure qui stocke des données, des fonctions ou les deux. L'idée étant que ces structures ont un sens de «soi» qui est implicite dans la plupart des langages en dehors de Python. Ceci est appelé un "descripteur" et donne à l'objet un point d'auto-référence qui lie les données (variables ou champs) et les fonctions (généralement appelées méthodes) à l'objet particulier en question. L'idée étant que vous utilisez spécifiquement une variable ou une méthode qui appartient à cette instance particulière (bloc de mémoire alloué généralement en dessous) plutôt qu'à une construction plus grande et plus générale.

Les systèmes d'objets ont tendance à varier en fonction de deux grandes catégories: l'héritage et l'accès.

Certains, comme Java ou C ++, vous font déclarer des classes qui agissent comme des "plans" pour les objets qui sont ensuite alloués. Ces classes et leurs objets ne peuvent pas être structurellement modifiés une fois instanciés. Leur contenu peut être remplacé dans le sens où les variables peuvent changer mais leur structure est statique. Vous ne pouvez pas, par exemple, ajouter de nouvelles méthodes à HashMap en Java. Vous pouvez étendre l'interface (essentiellement des classes partiellement implémentées servant de contrats) ou créer une sous-classe pour obtenir les méthodes ou variables supplémentaires dont vous avez besoin ainsi que toutes les variables et méthodes d'origine de la classe particulière en question.

D'autres langages basés sur les classes, le plus souvent cité étant Ruby, vous permettent d'ouvrir facilement une classe existante et d'ajouter simplement des méthodes comme bon vous semble. C'est une pomme de discorde et considérée par beaucoup comme très, très dangereuse.

Javascript est encore plus lâche, les objets ne sont rien d'autre qu'une collection d'emplacements pour des variables ou des fonctions. Ils peuvent être modifiés ou remplacés chaque fois que le programmeur en ressent le besoin. Ils peuvent même être arbitrairement clonés en tant que "Prototypes" pour d'autres objets, transmettant ainsi toutes leurs capacités.

Le contrôle d'accès est l'autre gros point de différence entre les différentes langues.

Certains langages comme Java ont des modificateurs d'accès très strictement appliqués comme "privé" et "protégé", qui définissent exactement quelles classes et sous-classes peuvent utiliser une variable ou une méthode donnée.

D'autres, comme Python, sont moins formels, utilisant la convention d'un trait de soulignement avant le nom de la méthode ou de la variable pour indiquer qu'il est privé.

En fin de compte, Python est un langage parfaitement légitime pour programmer de manière orientée objet, il ne l'impose tout simplement pas aussi rigoureusement que certains autres.

Ingénieur du monde
la source
Cela pourrait être un peu trop technique pour cette question.
Zeroth
@zeroth, et trop spécifique aussi. Le paramètre «self» (ou «this») est loin d'être universel.
Javier
@Javier C'est pourquoi j'ai dit que c'était explicite en Python et implicite ailleurs.
World Engineer
La question concerne l' apprentissage de la POO et je pense qu'il est assez important de discuter de la façon dont un langage est écrit pour accomplir certains concepts tels que l'encapsulation où nous avons privatepour Java et underscore ( __) pour Python. Je pense que le niveau d'abstraction de Python pourrait le rendre un peu plus difficile pour un débutant, mais certainement pas impossible. Java le précise pour le programmeur, ce qui pourrait permettre à certains concepts de coller un peu plus facilement.
Derek W
@WorldEngineer je ne parle pas d'être explicite / implicite (aussi, Python n'est pas inhabituel à ce sujet), mais simplement d'exister en tant que concept. Certaines langues font une répartition polymorphe sur tous les paramètres, pas seulement sur le premier. Certains utilisent d'autres indices pour la version spécifique, et le style principal peut ne pas privilégier un argument comme «ceci».
Javier
18

L'apprentissage des principes de la POO n'est pas du tout spécifique au langage, donc si par "apprendre la POO" vous voulez dire "apprendre ce que signifie la terminologie, ce qu'est la POO et pourquoi je pourrais vouloir l'utiliser", alors la langue n'a pas d'importance.

Si vous voulez dire "apprendre à développer en utilisant la POO", alors oui, différents langages le gèrent différemment, mais ils partagent tous le même ensemble de principes. Si vous êtes comme moi, vous l'apprendrez mieux en le faisant. Choisissez un langage orienté objet avec un bon tutoriel ou un livre qui couvre les aspects orientés objet et ayez-le. Si vous maîtrisez les principes de la conception orientée objet, vous pourrez les utiliser dans n'importe quel autre langage OO.

"Python est tellement nouveau que vous ne pouvez pas apprendre OOP sur Pyton. Vous apprenez Java puis comprenez OOP sur Java"

Cela me fait juste mal à la tête. Tant de mal entassés dans une phrase.

Python date de 1989.

http://python-history.blogspot.com/2009/01/brief-timeline-of-python.html

Java à 1995.

http://www.oracle.com/technetwork/java/javase/overview/javahistory-index-198355.html

Vous pouvez tirer vos propres conclusions sur la validité de ce petit conseil ...

Paul Glover
la source
1
Oui, mais Python 1.0 n'était pas avant 1994. Java était en développement pendant un certain temps avant sa sortie également. Mais je suis d'accord que Python a OO et vous POUVEZ apprendre les concepts d'OO. Il est absurde de dire le contraire.
chubbsondubs
2
@chubbsondubs Oui, c'est encore avant Java! ;)
Izkata
1
Pour fournir juste un contrepoint léger, la POO basée sur une classe (C ++, Java, Python et bien d'autres) est assez différente de la POO basée sur un prototype (JavaScript est le seul langage que je connaisse qui utilise cela). Ils sont toujours OOP et ont les mêmes principes fondamentaux et servent beaucoup des mêmes objectifs, mais beaucoup de gens considèrent les classes comme faisant partie de ce qu'ils considèrent OOP, alors que JavaScript ne les a pas et est définitivement orienté objet.
KRyan
@KRyan: Si vous vous en souciez, il existe un autre langage OO basé sur un prototype qui s'appelle Self.
Jerry Coffin
ActionScript possède à la fois des prototypes et des classes.
OrangeDog
8

Je pense que la personne que vous citez montrait simplement du chauvinisme linguistique.

En réalité, il existe une différence entre les concepts de POO et la mise en œuvre de POO. Poétiquement, cela se comprend mieux une fois que vous avez une meilleure compréhension de certains des concepts de la POO.

De nombreux programmeurs se familiarisent avec seulement quelques langages similaires, de sorte qu'ils n'ont pas à étendre leurs capacités ou ne souffrent pas d'être capables pendant un certain temps.

Donc, la question se résume à, vraiment, Python vous enseignera-t-il les concepts de la POO?

Je dirai que vous pouvez, à condition que vous ayez un soutien d'apprentissage adéquat qui vous pousse à essayer des choses que vous n'exploreriez pas normalement dans l'apprentissage auto-dirigé. Un livre ou un mentor quelconque serait préférable. Mark Lutz écrit des livres très approfondis, très détaillés et très excellents sur Python, et je recommanderais ses livres car ils vous pousseront à faire et à en savoir plus.

Ce que vous devez vous rappeler, c'est que la voie de Python n'est pas la seule voie, ni la seule voie correcte. Plus vous maîtrisez de paradigmes de programmation, mieux vous deviendrez un programmeur. La façon dont Python fait la POO n'est pas exactement la façon dont C ++ ou Java le fait, mais les concepts se transfèrent bien.

Zeroth
la source
4
En termes de POO, Java et C ++ diffèrent l'un de l'autre autant que Python.
Gort the Robot
Dans une certaine mesure, mais cela est largement dû à l'évolution des connaissances en conception de langage et à différentes contraintes.
Zeroth
Et franchement, 90% des concepts de POO se transfèrent bien entre eux, presque invisiblement même.
Zeroth
Ouais, je suis d'accord. Je trouve un peu drôle de penser que Java et C ++ sont "les mêmes" en termes de POO.
Gort the Robot
4

Oui, les implémentations OOP sont très différentes. La théorie et les principes sont les mêmes cependant, mais tant de gens ne considèrent que le "vrai POO" que font Java et C ++, que vous obtenez de nombreuses références qui sont supposées être "indépendantes du langage", mais supposent en fait des langages basés sur des classes et typés statiquement .

Cela ne signifie pas que ces références sont mauvaises ou même limitées; par exemple, le livre fondateur du "gang des quatre" (GoF) "Design Patterns: Elements of Reusable Object-Oriented Software" est un excellent exemple d'un grand travail qui dit "OOP" quand il signifie vraiment "OOP basé sur une classe statique".

Donc, à mon avis: Oui, vous pouvez apprendre beaucoup de POO sur Python, Javascript, C et bien d'autres langages; mais certaines personnes (peut-être un futur employeur) qui demandent "expérience OOP" signifient Java / C ++ / C #. Il serait donc sage de vérifier cet autre point de vue également.

(et ce ne sont pas les deux seuls «types» de POO ....)

Javier
la source
2
Ironiquement statique, la POO basée sur les classes n'est pas ce qu'Alan Key a initialement suggéré comme POO. Mais beaucoup de POO "d'apprentissage" consiste à apprendre un sens de conception / codage qui n'est pas strictement limité à une implémentation de POO particulière
Daniel Gratzer
2
Il pourrait également être judicieux de regarder CLOS: je ne pense pas que de nombreux langages / frameworks proposent des méthodes multiples.
Giorgio
2
@jozefg: à droite, Alan Kay a dit "En fait, j'ai inventé le terme" orienté objet ", et je peux vous dire que je n'avais pas C ++ en tête."
Javier
1
@Giorgio En fait, Dylan pourrait fournir une version légèrement plus simple de CLOS (aucun moyen de spécifier quand une multiméthode est exécutée, mais beaucoup plus simple à approcher)
Daniel Gratzer
4

La programmation orientée objet est une idée de la façon de structurer le langage de programmation pour favoriser un faible couplage, la dissimulation des informations (alias encapsulation), le regroupement des données et des méthodes qui opèrent ensemble sur ces données et la réutilisation du code. De nombreuses langues mettent en œuvre leur vision de ces idées, il existe donc des variations entre les langues quant à la façon dont elles abordent l'orientation des objets. Par exemple, Java autorise uniquement une classe à étendre 1 classe. Cependant, Python et C ++ vous permettent d'étendre n'importe quel nombre de classes. Java a des raisons spécifiques pour ses limites. Limitations destinées à corriger des choses à partir de C ++, mais aussi parce que Smalltalk ne prend en charge qu'une seule classe de base.

Les langues OO peuvent être regroupées en deux familles. La famille Smalltalk (ou OOP basée sur une classe) de langages comprend C ++, Java, Smalltalk, Ruby, C #, Python pour n'en nommer que quelques-uns (il y en a des tonnes dans cette famille). Il s'agit d'un mélange de langages de type statique et dynamique et bien qu'ils diffèrent légèrement sur certains concepts, ils sont très similaires dans leur façon de penser la POO. Ce que je veux dire par là, c'est comment ils abordent le couplage, l'encapsulation, la liaison des données et des méthodes, et la réutilisation du code, et les outils qu'ils fournissent pour cela. Au sein de cette famille, beaucoup de concepts sont les mêmes.

L'autre famille est la POO basée sur des prototypes. Ces langages sont très différents dans leur implémentation OOP. L'exemple le plus connu est probablement Javascript, mais Javascript a copié ces idées de Scheme et Object LISP. Ce sont des langues moins connues et typées de manière dynamique. Je ne peux pas penser à un langage basé sur un prototype typé statiquement, mais cela ne signifie pas qu'il n'y en a pas. Vous pouvez le lire ici: http://en.wikipedia.org/wiki/Prototype-based_programming . Le fait est qu'ils abordent la POO d'une manière très différente de celle des langages basés sur les classes. Cela signifie que les concepts ne sont pas aussi portables entre ces deux familles. Ce n'est pas parce que vous connaissez OO dans une famille que vous passerez facilement ces idées à l'autre famille.

Gardez à l'esprit que la plupart des langages de programmation mélangent des concepts issus de nombreuses idées. Python et Ruby intègrent à la fois des idées de programmation orientée objet et de programmation fonctionnelle dans leurs langages. Et vous pouvez mélanger des OO basés sur des prototypes avec certaines extensions de langages basés sur des classes afin que ce soit encore plus complexe.

chubbsondubs
la source
Je ne compterais pas C ++ dans la famille Smalltalk. Smalltalk est basé sur Simula, et Alan Kay a délibérément ignoré la plupart des changements dans Simula-II, tandis que C ++ est basé sur cela. C # est étrange, il a été conçu par des utilisateurs C ++ et des concepteurs Pascal pour ressembler à Java.
Jörg W Mittag
1

La POO est un principe de programmation - c'est fondamentalement une idée. L'implémentation de la POO varie selon les langages de programmation - mais les piliers (abstraction, héritage, encapsulation et polymorphisme) de la POO sont généralement présents d'une manière ou d'une forme.

Je dirai sans préférence aux deux langages, que Java pousse la sémantique un peu plus durement sur le programmeur que Python.

Par exemple,

Code Java: class Cat extends Animal {}

Est un peu plus évident sur ce que vous faites du point de vue de la POO que:

Code Python: class Cat(Animal):

Bien sûr, ils définissent tous deux une hiérarchie de classes dans laquelle Cat hérite d'Animal. Mais je pense que pour un programmeur débutant en POO, l'application et les implications des idées de POO pourraient être un peu mieux en Java car cela le précise pour le programmeur.

Derek W
la source
1

Vous demandez explicitement quel est le langage le plus simple pour apprendre les concepts de POO. Je pense que la réponse est claire: python .

Pour montrer pourquoi c'est le cas, regardons le programme débutant typique en Java vs Python. Faisons un simple jeu de devinettes supérieur-inférieur.

Java

En Java, vous écrirez une classe de jeu.

public class Game {
    public int secretNumber;
    public int tries;

    public Game(int tries, int secretNumber) {
        this.tries = tries;
        this.secretNumber = secretNumber;
    }

    public void guess(int myNumber) {
        if(myNumber > secretNumber)
            System.out.println("Your guess is too high!");
        else if (myNumber < secretNumber)
            System.out.println("Your guess is too low!");
        else
            System.out.println("You win!!");
        tries = tries - 1;
        if(tries == 0) {
            System.out.println("No more tries: you lose :(");
        }
    }

    public static void main(String[] args) {
        Game game = new Game(10, 47);
        while(true) {
            // how do I read a newline again? Something with BufferedInputStreamReader?
            // how do I convert a String to a number?
        }
    }
}

Je suis un programmeur expérimenté, et même j'ai des difficultés. En outre, regardez ce que vous devez expliquer à un futur élève pour ce programme simple:

  • Méthodes statiques
  • Visibilité (public vs privé). Vous devez toujours marquer les champs comme privés.
  • this. notation pour faire référence aux variables lorsqu'elles sont masquées par d'autres
  • Le constructeur ressemble à une méthode, mais n'est pas une méthode.
  • System.outest un outputStream. Et oui, c'est un champ, mais c'est un staticchamp.
  • Parfois, vous pouvez omettre les accolades s'il n'y a qu'une seule instruction
  • String[]est un tableau. C'est un type d'objet spécial, mais encore une fois, pas vraiment.
  • intest un type primitif. C'est spécial.
  • Vous avez besoin de beaucoup de méthodes de framework

Python

Python est beaucoup plus «pur». Il n'y a pas de types primitifs. Un constructeur n'existe pas, il n'y a qu'une méthode spéciale qui est appelée à l'initialisation.

Vous n'avez pas besoin d'interagir avec la console, car vous en avez un REPL. Vous pouvez simplement jouer au jeu en utilisantg.guess(35) et en renvoyant une chaîne.

Cela rend le langage plus facile à apprendre et à saisir les concepts de base de la POO.

parasietje
la source
0

L'idée de base dans la POO est d'encapsuler (ce qui signifie regrouper ou masquer) les variables et les méthodes ensemble à l'intérieur des classes (que python prend absolument en charge). Il s'agit de concevoir votre code autour des noms. Ensuite, cela continue en quelque sorte.

Bien qu'il existe des différences d'implémentation (par exemple, python ne prend pas en charge la visibilité comme Java) et des différences de syntaxe (en Javascript, vous devez hériter des méthodes vous-même), la conception de base reste la même.

Je pense qu'il est plus facile d'apprendre la POO dans un langage comme Java, car le langage l'exige et la communauté y est moins défavorable que, disons, la communauté python.

Mais il y a des tonnes d'écrits sur la conception et les pratiques OOP, et lire ce n'est pas un effort inutile. Même lorsque j'écris du python (ce qui est beaucoup), j'écris beaucoup d'objets et j'utilise beaucoup d'objets provenant de bibliothèques tierces.

Rob
la source
L'idée de code est la transmission de messages. Aussi aucune source.
Utilisateur le
1
La POO ne concerne pas les classes.
Jörg W Mittag
1
L'idée originale de @User Alan Kay était à propos de la messagerie, mais depuis lors, la pratique de l'OO a évolué vers la conception par nom, ou classes d'objets. Par exemple, le Dr Kay a également émis l'opinion que Java n'est pas orienté objet, car il ne prend pas en charge la liaison tardive. @ Jorg lol ya ya
Rob
0

Lorsque vous apprenez la POO dans une langue, vous commencez à penser dans cette langue. La langue influence ce que vous pensez pouvoir faire et comment, et ajoute également une saveur à la POO.

  • Devrait-il y avoir une collecte des ordures?
  • Puis-je ajouter des méthodes aux entiers?
  • Dois-je utiliser des classes ou des prototypes?
  • Comment les objets se réfléchissent-ils?

Certaines personnes ne peuvent pas faire de POO sans cours. Certains doivent tuer leurs objets avec le processus.

Il y a un noyau de POO et les idées originales à ce sujet. Vous pouvez également consulter Smalltalk, Self, Simula, LISP, Newspeak. Et aussi un regard sur les types de langage non-OOP comme les langages de flux de données bash, APL, J. Logique Prolog. Haskell (classes de types). Ils vous apprendront tous une pensée différente et vous apprendrez peut-être que

  • La POO ne concerne pas les langues impératives
  • La POO ne concerne pas les classes

Et à la fin, vous pourrez voir à quoi sert la POO. Au moins, vous en aurez une autre idée. Je suggère de trouver des discussions par Alan Kay .


Si vous ne regardez pas les langues, cet article est inutile.

Comme vous pouvez le voir ici: Nous ne pouvons pas nous mettre d'accord sur ce qu'est la POO.

Utilisateur
la source