Quildreen ya lo dijo:
Python es un lenguaje capaz de expresar mejor los conceptos de OO que Java y C ++. El código idiomático en Java y C ++ es más procesal.
Pero veamos por qué estoy tan de acuerdo con eso. En Python, todo es un objeto. Aunque quizás sea una ligera exageración, es cierto que puedes tratar casi todo de manera consistente. Si define una clase, puede hacer objetos con ella. La clase misma también es un objeto. La clase base fundamental, objeto, también es un objeto. Funciones? Objetos. Valores primitivos? No exactamente; los tipos incorporados son … objetos.
También diría que el hecho de que Python no te obligue a envolver todo en un objeto es un beneficio para OOP, no un inconveniente . Exploremos eso en el contexto de …
- Tengo 17 años de edad. ¿Cómo puedo trabajar para conseguir un trabajo en Silicon Valley como programador?
- Envié un mensaje de Facebook gratuito a un no amigo, por lo que aparecerá en su carpeta ‘otros’. Necesito que lo lean ahora. Si pago el mensaje ahora, ¿se moverá a su carpeta de bandeja de entrada?
- Estoy a punto de cumplir los veinte. ¿Qué debo saber sobre los veintitantos años que podrían ayudarme a evitar mucho dolor innecesario?
- Soy un estudiante de tercer año de ingeniería informática. ¿Qué curso debería preferir, una maestría en informática o una maestría en animación?
- Quiero comenzar mi propia empresa de inicio. ¿Cuáles son los pasos particulares para ello?
Java Aunque a menudo se promociona como una especie de lenguaje OOP global, final, creo que es un hash absoluto de varias cosas importantes:
- Las primitivas son fundamentalmente diferentes de los objetos. No tienen lugar en la jerarquía de clases, no puede tener referencias a ellos, se comportan generalmente de maneras muy extrañas. El autoboxing es una solución muy pragmática , pero no es realmente transparente y debes ser consciente de ello. (Por ejemplo, una matriz de enteros es algo muy diferente de una matriz de entradas).
- Muchos más elementos léxicos no se representan como objetos, porque no son tipos de primera clase. Aunque puede “reflexionar” y obtener acceso a clases y métodos, no son una parte natural del lenguaje de la misma manera.
- Poner todo en una ‘clase’ hace daño a OOP. No todo es lógicamente parte de una clase, pero Java no ofrece ninguna forma de expresar este hecho; en cambio, sobrecarga la palabra ‘clase’ para significar “a veces una clase en el sentido OOP, y a veces una especie de espacio de nombres para métodos estáticos”. La clase de matemáticas es el ejemplo más obvio, pero cada vez que veo un método estático, me encuentro al menos considerando si debería ser una función simple y antigua.
Al obligarlo a poner todo en una ‘clase’, Java diluye el diseño OOP
C ++ … oh, C ++. De hecho, creo que puede expresar conceptos OOP como Python. Los tipos primitivos no son objetos, pero puedes trabajar con ellos sin preocuparte demasiado por ello. (¿Cómo podría saber si algo es un typedef para un tipo entero primitivo, o una clase sin métodos públicos, excepto constructores, y un grupo de operadores sobrecargados?) Las clases y funciones no son tipos de primera clase, pero al menos puede pase funciones, si está dispuesto a vivir con la migraña de los punteros de función.
Pero C ++, ese famoso pulpo de agregar patas a un perro, es un lenguaje enorme y extenso con una enorme cantidad de características, que se agrega explícitamente en lugar de emerger naturalmente. Considere el lenguaje de plantilla, que se dice que es Turing completo, y muy poderoso siempre que no le importe los mensajes de error que hacen que sus ojos sangren. Considere la increíble cantidad de legado en el idioma. RAII es realmente una buena idea, pero lea Exceptional C ++ y más Exceptional C ++ y dígame si cree que alguna vez diseñará una aplicación segura de excepción.
Tengo la impresión de que las empresas y grupos que usan C ++ y se mantienen cuerdos lo hacen delineando fuertemente qué partes del lenguaje se les permite usar y cuáles son verboten.
En principio, no me gusta C ++ de la forma en que hago Java, pero no puedo imaginar querer trabajar en él, excepto posiblemente escribir pequeñas extensiones para lenguajes de nivel superior, donde preferiría mantener mi lógica; y luego solo usaría C ++ como C con un montón de conveniencias poderosas como clases, y no importa todas esas locuras.