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?
java
object-oriented
python
user2783998
la source
la source
Réponses:
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.
la source
private
pour 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.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.
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 ...
la source
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.
la source
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 ....)
la source
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.
la source
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.
la source
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.
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:
this.
notation pour faire référence aux variables lorsqu'elles sont masquées par d'autresSystem.out
est un outputStream. Et oui, c'est un champ, mais c'est unstatic
champ.String[]
est un tableau. C'est un type d'objet spécial, mais encore une fois, pas vraiment.int
est un type primitif. C'est spécial.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.
la source
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.
la source
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.
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
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.
la source