¿Hay alguna diferencia en aprender OOP en diferentes lenguajes de programación? [cerrado]

9

Quiero aprender OOP. Conozco Python y sé muy pocas cosas sobre OOP.

Pero cuando busco "aprender OOP" en los foros, vi a un chico que decía: "Python es tan nuevo, por eso no puedes aprender OOP en Python. Debes aprender Java y luego entender OOP en Java".

¿Es verdad? ¿Hay alguna diferencia en entender la POO en diferentes lenguajes de programación? como aprenderlo en Java, C #, C ++, Perl o Python?

usuario2783998
fuente
12
"Python es tan nuevo que por eso no puedes aprender OOP en Pyton. Aprendes Java y luego entiendes OOP en Java" Eso no tiene sentido para mí. Si quieres aprender OOP usando Python, no veo ninguna razón por la que no. ¡Ve a por ello!
FrustratedWithFormsDesigner
13
¿No es Python más antiguo que Java? Creo que sí, pero podría estar fuera por un par de años.
Jimmy Hoffa
2
@ Jimmy Jimmy es de hecho. 91 contra 95 según Wikipedia.
Evicatos
2
@JimmyHoffa: vamos, eso no puede ser verdad, ¿verdad? Todos sabemos que Java fue el primer lenguaje OO de la historia. "Sun anuncia en voz alta la novedad de Java" ... - En cuanto a la pregunta ... ¿por qué estás decidido a aprender OO? Eso se te impondrá pronto. Python es un excelente punto de partida para obtener información sobre los beneficios de múltiples paradigmas de programación.
Leftaroundabout

Respuestas:

10

Un objeto como construcción teórica es muy simple: es una estructura que almacena datos, funciones o ambos. La idea es que estas estructuras tienen un sentido de "yo" que está implícito en la mayoría de los lenguajes fuera de Python. Esto se llama un "descriptor" y le da al objeto un punto de auto referencia que une datos (variables o campos) y funciones (típicamente llamados métodos) al objeto particular en cuestión. La idea es que está utilizando específicamente una variable o método que pertenece a esa instancia particular (bloque de memoria asignado típicamente debajo) en lugar de a una construcción más grande y más general.

Los sistemas de objetos tienden a variar con respecto a dos grandes categorías: herencia y acceso.

Algunos, como Java o C ++, han declarado clases que actúan como "planos" para los objetos que luego se asignan. Estas clases y sus objetos no pueden modificarse estructuralmente una vez instanciados. Pueden anular sus contenidos en el sentido de que las variables pueden cambiar pero su estructura es estática. No puede, por ejemplo, agregar nuevos métodos a HashMap en Java. Puede ampliar la interfaz (clases implementadas básicamente parcialmente que sirven como contratos) o crear una subclase para obtener los métodos o variables adicionales que necesita junto con todas las variables y métodos originales de la clase en cuestión.

Otros lenguajes basados ​​en clases, el más comúnmente citado es Ruby, le permiten abrir fácilmente una clase existente y simplemente agregar métodos como mejor le parezca. Este es un punto de discusión y muchos lo consideran muy, muy peligroso.

Javascript es incluso más flexible, los objetos no son más que una colección de ranuras para variables o funciones. Se pueden cambiar o sobrescribir siempre que el programador sienta la necesidad de hacerlo. Incluso pueden clonarse arbitrariamente como "Prototipos" para otros objetos, transmitiendo así todas sus habilidades.

El control de acceso es el otro gran punto de diferencia entre los distintos idiomas.

Algunos lenguajes como Java tienen modificadores de acceso estrictamente forzados como "privado" y "protegido", que definen exactamente qué clases y subclases pueden usar una variable o método dado.

Otros, como Python, son menos formales y utilizan la convención de un guión bajo antes del método o el nombre de la variable para indicar que es privado.

En última instancia, Python es un lenguaje perfectamente legítimo para programar de una manera orientada a objetos, simplemente no lo aplica tan rigurosamente como algunos de los otros.

Ingeniero mundial
fuente
Puede ser un poco demasiado técnico para esta pregunta.
Zeroth
@zeroth, y demasiado específico también. El parámetro 'self' (o 'this') está lejos de ser universal.
Javier
@Javier Por eso dije que es explícito en Python e implícito en otros lugares.
Ingeniero mundial
La pregunta es sobre aprender OOP y creo que es bastante importante discutir cómo se escribe un lenguaje para lograr ciertos conceptos, como Encapsulación, donde tenemos privatepara Java y subrayado ( __) para Python. Creo que el nivel de abstracción de Python podría hacerlo un poco más desafiante para un principiante, pero definitivamente no es imposible. Java lo explica para el programador, lo que puede hacer que algunos conceptos se adhieran un poco más fácilmente.
Derek W
@WorldEngineer no estoy hablando de ser explícito / implícito (también, Python no es inusual en esto), sino de simplemente existir como concepto. Algunos idiomas hacen envíos polimórficos en todos los parámetros, no solo en el primero. Algunos usan otras sugerencias para la versión específica, y el estilo principal podría no privilegiar un argumento como 'esto'.
Javier
18

Aprender los principios de OOP no es un lenguaje específico en absoluto, así que si por "aprender OOP" quieres decir "aprende lo que significa la terminología, qué es OOP y por qué podría querer usarlo", entonces el idioma no importa.

Si quiere decir "aprender a desarrollar usando OOP", entonces sí, los diferentes idiomas lo manejan de manera diferente, pero todos comparten el mismo conjunto de principios. Si eres como yo, lo aprenderás mejor con solo hacerlo. Elija un lenguaje orientado a objetos con un buen tutorial o libro que cubra los aspectos orientados a objetos y tenga en él. Si tiene los principios del diseño orientado a objetos, podrá usarlos en cualquier otro lenguaje OO.

"Python es tan nuevo que es por eso que no puedes aprender OOP en Pyton. Aprendes Java y luego entiendes OOP en Java"

Esto solo me duele la cabeza. Tanto mal metido en una oración.

Python data de 1989.

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

Java a 1995.

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

Puedes sacar tus propias conclusiones sobre la validez de ese consejo ...

Paul Glover
fuente
1
Sí, pero Python 1.0 no fue hasta 1994. Java estuvo en desarrollo durante bastante tiempo antes de su lanzamiento también. Pero estoy de acuerdo en que Python tiene OO y PUEDES aprender los conceptos de OO. Es absurdo decir lo contrario.
chubbsondubs
2
@chubbsondubs Sí, ¡eso todavía está antes de Java! ;)
Izkata
1
Solo proporcionar un contrapunto ligero, la OOP basada en clases (C ++, Java, Python y muchas otras) es bastante diferente de la OOP basada en prototipos (JavaScript es el único lenguaje que sé que usa esto). Todavía son OOP y tienen los mismos fundamentos y cumplen muchos de los mismos objetivos, pero mucha gente considera que las clases son parte de lo que consideran OOP, mientras que JavaScript no las tiene y definitivamente está orientado a objetos.
KRyan
@KRyan: en caso de que te importe, hay otro lenguaje OO basado en prototipos que se llama Self.
Jerry Coffin
ActionScript tiene prototipos y clases.
OrangeDog
8

Creo que la persona que estás citando simplemente estaba mostrando machismo lingüístico.

En realidad, hay una diferencia entre los conceptos de OOP y la implementación de OOP. Poéticamente, esto se entiende mejor una vez que comprenda mejor algunos de los conceptos de POO.

Muchos programadores se sienten cómodos con solo unos pocos lenguajes similares, por lo que no tienen que ampliar sus capacidades o sufrir la incapacidad por un tiempo.

Entonces la pregunta se reduce a, ¿realmente Python le enseñará los conceptos de OOP?

Diré que puedes, siempre que tengas un apoyo de aprendizaje adecuado que te empuje a probar cosas que normalmente no explorarías en el aprendizaje autodirigido. Un libro o un mentor de algún tipo sería lo mejor. Mark Lutz escribe libros muy detallados, muy detallados y muy excelentes sobre Python, y recomendaría sus libros porque lo empujarán a hacer y aprender más.

Lo que debes recordar es que el camino de Python no es el único camino, ni es el único camino correcto. Cuantos más paradigmas de programación domines, mejor serás un programador. La forma en que Python hace OOP no es exactamente como lo hace C ++ o Java, pero los conceptos se transfieren bien.

Zeroth
fuente
44
En términos de OOP, Java y C ++ difieren entre sí tanto como cualquiera difiere de Python.
Gort the Robot
Hasta cierto punto, pero eso se debe en gran medida al cambio en el conocimiento del diseño del lenguaje y las diferentes restricciones.
Zeroth
Y, francamente, el 90% de los conceptos de OOP se transfieren bien entre ellos, casi de manera invisible.
Zeroth
Sí, estoy de acuerdo. Me resulta un poco extraño pensar que Java y C ++ son "lo mismo" en términos de POO.
Gort the Robot
4

Sí, las implementaciones de OOP son muy diferentes. Sin embargo, la teoría y los principios son los mismos, pero muchas personas consideran solo "OOP real" lo que hacen Java y C ++, que obtienes muchas referencias que se supone que son "independientes del lenguaje", pero que de hecho asumen lenguajes estáticamente basados ​​en clases. .

Eso no significa que esas referencias sean malas o incluso limitadas; por ejemplo, el libro seminal "Gang of four" (GoF) "Patrones de diseño: elementos de software orientado a objetos reutilizables" es un excelente ejemplo de un gran trabajo que dice "OOP" cuando realmente significa "OOP basada en clases estáticas".

Entonces, en mi opinión: Sí, puedes aprender mucha OOP en Python, Javascript, C y muchos otros lenguajes; pero algunas personas (tal vez un futuro empleador) cuando piden "experiencia OOP" se refieren a Java / C ++ / C #. Por lo tanto, sería aconsejable verificar esa otra vista también.

(y esos no son los únicos dos 'tipos' de OOP ...)

Javier
fuente
2
Irónicamente estático, la OOP basada en clases no es lo que Alan Key sugirió originalmente como OOP. Pero una gran cantidad de "aprendizaje" OOP se trata de aprender el diseño / sentido de codificación que no está estrictamente limitado a una implementación particular de OOP
Daniel Gratzer
2
También podría tener sentido mirar CLOS: no creo que muchos lenguajes / marcos ofrezcan métodos múltiples.
Giorgio
2
@jozefg: cierto, Alan Kay dijo una vez "En realidad, inventé el término" orientado a objetos ", y puedo decirte que no tenía en mente C ++".
Javier
1
@Giorgio En realidad, Dylan podría proporcionar una versión un poco más simple de CLOS (no hay forma de especificar cuándo se ejecuta un método múltiple , pero es mucho más simple de abordar)
Daniel Gratzer
4

La Programación Orientada a Objetos es una idea sobre cómo estructurar el lenguaje de programación para fomentar un bajo acoplamiento, ocultación de información (también conocida como encapsulación), agrupamiento de datos y métodos que operan juntos en esos datos y reutilización de código. Muchos idiomas implementan su opinión sobre estas ideas, por lo que existen variaciones entre los idiomas acerca de cómo abordan la Orientación a objetos. Por ejemplo, Java solo permite que una clase extienda 1 clase. Sin embargo, Python y C ++ le permiten ampliar cualquier número de clases. Java tiene razones específicas para sus limitaciones. Limitaciones que están destinadas a corregir cosas de C ++, pero también porque Smalltalk solo admite una única clase base.

Los idiomas OO se pueden agrupar en dos familias. La familia Smalltalk (o POO basada en clases) de lenguajes incluye C ++, Java, Smalltalk, Ruby, C #, Python, por nombrar algunos (hay toneladas en esta familia). Estos son una combinación de lenguajes de tipo estático y dinámico y, aunque difieren ligeramente en algunos conceptos, son muy similares en cuanto a cómo piensan acerca de OOP. Lo que quiero decir con eso es cómo abordan el acoplamiento, la encapsulación, el enlace de datos y métodos, y la reutilización de código, y las herramientas que proporcionan para que lo haga. Dentro de esta familia, muchos de los conceptos son los mismos.

La otra familia es la OOP basada en el prototipo. Estos lenguajes se ven muy diferentes en su implementación de OOP. Probablemente el ejemplo más conocido de esto es Javascript, pero Javascript copió estas ideas de Scheme y Object LISP. Estos son idiomas menos conocidos y típicamente escritos dinámicamente. No puedo pensar en un lenguaje basado en prototipos estáticamente tipado, pero eso no significa que no haya ninguno. Puede leerlo aquí: http://en.wikipedia.org/wiki/Prototype-based_programming . El punto es que se acercan a OOP de una manera muy diferente a los lenguajes basados ​​en clases. Eso significa que los conceptos no son tan portátiles entre estas dos familias. El hecho de que sepa OO en una familia no significa que pasará fácilmente esas ideas a la otra familia.

Tenga en cuenta que la mayoría de los lenguajes de programación mezclan conceptos de muchas ideas. Python y Ruby incorporan ideas de programación funcional y OOP en sus lenguajes. Y puede mezclar OO basado en prototipos con ciertas extensiones de lenguajes basados ​​en clases para que sea aún más complejo.

chubbsondubs
fuente
No contaría C ++ en la familia Smalltalk. Smalltalk se basa en Simula, y Alan Kay ignoró deliberadamente la mayoría de los cambios en Simula-II, mientras que C ++ se basa en eso. C # es extraño, fue diseñado por usuarios de C ++ y diseñadores de Pascal para ser como Java.
Jörg W Mittag
1

OOP es un principio de programación, es fundamentalmente una idea. La implementación de OOP varía en todos los lenguajes de programación, pero los pilares (abstracción, herencia, encapsulación y polimorfismo) de OOP generalmente están presentes de alguna forma o forma.

Diré sin preferencia a ninguno de los dos idiomas, que Java empuja la semántica un poco más duro en el programador que Python.

Por ejemplo,

Código Java: class Cat extends Animal {}

Es un poco más obvio en cuanto a lo que está haciendo desde el punto de vista de las cosas que:

Código de Python: class Cat(Animal):

Claro que ambos definen una jerarquía de clases en la que Cat hereda de Animal. Pero creo que para un programador que acaba de comenzar en OOP, la aplicación y las implicaciones de las ideas de OOP podrían quedarse un poco mejor en Java, ya que lo está explicando para el programador.

Derek W
fuente
1

Usted está preguntando explícitamente cuál es el lenguaje más fácil para aprender conceptos OOP. Creo que la respuesta es clara: python .

Para mostrar por qué este es el caso, echemos un vistazo al típico programa para principiantes en Java vs Python. Hagamos un simple juego de adivinanzas más alto-bajo.

Java

En Java, escribirás una clase de juego.

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?
        }
    }
}

Soy un programador experimentado e incluso estoy teniendo dificultades. Además, mira lo que necesitas explicarle a un posible alumno para este sencillo programa:

  • Métodos estáticos
  • Visibilidad (pública vs privada). Siempre debe marcar los campos como privados.
  • this. notación para referirse a variables cuando están enmascaradas por otros
  • El constructor se parece a un método, pero no es un método.
  • System.outes un outputStream. Y sí, es un campo, pero es un staticcampo.
  • A veces, puede omitir los corchetes si solo hay una declaración
  • String[]es una matriz Es un tipo especial de objeto, pero, de nuevo, en realidad no.
  • intEs un tipo primitivo. Es especial
  • Necesitas muchos métodos marco

Pitón

Python es mucho más "puro". No hay tipos primitivos. No existe un constructor, solo hay un método especial que se llama en la inicialización.

No necesita interactuar con la consola, ya que tiene un REPL. Simplemente puedes jugar el juego usando g.guess(35)y devolviendo una cadena.

Esto hace que el lenguaje sea más fácil de aprender y comprender los conceptos básicos de OOP.

parasietje
fuente
0

La idea central en OOP es encapsular (lo que significa agrupar u ocultar) variables y métodos juntos dentro de las clases (que Python es absolutamente compatible). Se trata de diseñar su código alrededor de sustantivos. Entonces, de alguna manera continúa desde allí.

Si bien existen diferencias de implementación (por ejemplo, python no admite la visibilidad como Java) y diferencias de sintaxis (en Javascript, debe heredar los métodos usted mismo), el diseño básico sigue siendo el mismo.

Sin embargo, creo que es más fácil aprender OOP en un lenguaje como Java, porque el lenguaje lo requiere y la comunidad es menos adversa que, digamos, la comunidad python.

Pero hay toneladas de escritos sobre el diseño y las prácticas de OOP, y leerlo no es un esfuerzo desperdiciado. Incluso cuando escribo python (que es mucho), escribo muchos objetos y uso muchos objetos de bibliotecas de terceros.

Robar
fuente
La idea del código es pasar mensajes. Además no hay fuente.
Usuario
1
OOP no se trata de clases.
Jörg W Mittag
1
La idea original de @Usuario Alan Kay era sobre la mensajería, pero desde entonces la práctica de OO ha evolucionado hacia el diseño por sustantivo o clases de objetos. Por ejemplo, el Dr. Kay también opinó que Java no está orientado a objetos, ya que no admite el enlace tardío. @ Jorg lol ya ya
Rob
0

Cuando aprendes OOP en un idioma, comienzas a pensar en este idioma. El lenguaje influye en lo que crees que se puede hacer y cómo, y también agrega un sabor a OOP.

  • ¿Debería haber una recolección de basura?
  • ¿Puedo agregar métodos a enteros?
  • ¿Utilizo clases o prototipos?
  • ¿Cómo se reflejan los objetos sobre sí mismos?

Algunas personas no pueden hacer POO sin clases. Algunos deben matar sus objetos con el proceso.

Hay un núcleo de OOP y las ideas originales al respecto. También puedes echar un vistazo a Smalltalk, Self, Simula, LISP, Newspeak. Y también un vistazo a los tipos de idiomas que no son OOP, como los idiomas de flujo de datos bash, APL, J. Logical ones Prolog. Haskell (clases de tipo). Todos te enseñarán un pensamiento diferente y puedes aprender que

  • OOP no se trata de idiomas imperativos
  • OOP no se trata de clases

Y al final puede ver para qué sirve la POO. Al menos tendrás otra idea al respecto. Sugiero encontrar charlas de Alan Kay .


Si no miras los idiomas, esta publicación es inútil.

Como puede ver aquí: no podemos acordar qué es OOP.

Usuario
fuente