¿Diferencias entre "Java OOP" y "Pythonic OOP"? [cerrado]

19

Comencé con ActionScript 2.0 y luego seguí con Java. Aprendí, o al menos utilicé, varios idiomas desde entonces, incluido Python (probablemente mi favorito).

Sin embargo, me temo que mi estilo de programación orientada a objetos es muy poco ficticio y más parecido a Java OOP con sintaxis de Python. ¿En qué se diferencian Java y Pythonic OOP entre sí? ¿Qué hacen los programadores de Java a menudo "sin pitón" al escribir código orientado a objetos en Python?

Anto
fuente

Respuestas:

54

Para un chico de Java, Python es un juego anárquico donde cualquiera puede agarrar un palo y comenzar a golpear tu cabeza.

Para un tipo de Python, Java es un universo orwelliano donde estás constantemente encadenado a la visión decreciente de otra persona de cómo funciona el universo.

La verdad es que todo lo que puede hacer en un idioma puede hacerlo en el otro igual de limpio. Sin embargo, como ha mencionado, hay una diferencia importante en ambas comunidades en cuanto a lo que significa limpio .

Manera Java: un sistema limpio es aquel que hace lo que está destinado y nada más, no permitirá extensiones o modificaciones que vayan en contra de la naturaleza del propósito previsto e intentará hacerlas cumplir tanto como sea posible a través del compilador. La flexibilidad se obtiene mediante la elaboración cuidadosa de interfaces simples dentro de estructuras estrictas. En Java, la caja de arena de uno siempre debe estar claramente delimitada y sobrepasarse, esto se debe a la rápida respuesta del compilador. Java proporciona medios para definir estáticamente estructuras de objetos y crear interacciones dinámicas a partir de instancias de ellos. Cuando trabajo en Java, trato de crear inteligentemente bloques de construcción básicos para una solución con muerte cerebral. Sobre todo trabajo de abajo hacia arriba una vez que tengo una teoría de trabajo sobre cómo abordar el problema.

Java tenderá a producir un gran software que puede abarcar grandes equipos y proporciona herramientas y medios para mantener a raya a la bandada. Si no se controla, esto conducirá a equipos muy separados que trabajen de forma independiente hacia un objetivo cada vez más incierto. Finalmente, cada equipo se convierte en su propia "razón de ser" y el sistema en su conjunto se diluye conduciendo por el mal camino del proyecto principal. Esto puede conducir a excesos de costos extremos y enormes sistemas de software que funcionan y se mantienen mal.

Casi nunca hay una pequeña forma rápida y fácil de hacer cosas en Java, pero el IDE y las herramientas están ahí para realizar tareas dolorosas a solo unos clics de distancia.

Python: Clean significa conciso y fácil de leer. Un buen sistema de Python está diseñado para permitirle llegar directamente al corazón y exponer sus secretos más íntimos de una manera que pueda comprender del código el uso previsto y el propósito del mismo. También le permitirá diseñar su propia solución extendiendo y / o encapsulando el diseño original para que vaya exactamente en su dirección. Python proporciona medios para crear plantillas de objetos desde las cuales puede cambiar dinámicamente la instancia para que se ajuste a las necesidades disponibles. En python tiendo a resolver el problema de inmediato y luego distribuir el código en una estructura lógica de tal manera que la solución final siga siendo lo más simple y legible posible. En python tiendo a trabajar de arriba hacia abajo y gestionar las complejidades de aumento a través de un enfoque de divide y vencerás.

Los equipos de Python tenderán a producir sistemas ligeros y serán muy rápidos en la entrega de una solución de trabajo. Tienden a ser un grupo muy unido que trabaja indistintamente en cualquier parte del sistema validando la solución de cada uno cada vez que tengan la oportunidad. Se alimentan unos de otros creando una sinergia que es bastante estimulante. Sin embargo, esto crea equipos que son difíciles de escalar a sistemas más grandes y que a menudo golpean una especie de techo de cristal. La introducción de nuevos miembros en el equipo ayudará, pero llevará algún tiempo que el conocimiento se extienda lo suficiente como para que se sienta la productividad adicional. Luego, el equipo se divide y la visión general constante sobre todo el sistema se diluye al igual que la atmósfera de los primeros días. Esto puede conducir a un código demasiado complicado para lo que alguna vez fue un problema simple,

Casi siempre hay una manera rápida y fácil de hacer cosas con Python, pero la complejidad puede ser más difícil de controlar una vez que el sistema alcanza un cierto umbral.

En resumen, ambos tienen un lado oscuro y ambos tienen una fuerza clara. Sin embargo, al pinchar a lo largo de ambas comunidades, encontrará que la fuerza de uno conduce al lado oscuro del otro y viceversa.

De ahí los acalorados debates sobre cuál es el mejor.

Newtopian
fuente
14

Entonces, ¿sabes todo acerca de cómo configurar la visibilidad de los métodos y las variables? Sí, esos ya no existen, todo es público. Hay convenciones de nombres y cambios de nombres, pero todo está realmente disponible.

Parte de la flexibilidad de Python proviene del hecho de que se le permite hacer casi cualquier cosa. Debido a eso, la filosofía es que las personas deben saber cómo usar la API en lugar de la API que exige que un método se use correctamente.

En lugar de sobrecargas de métodos, tiene variables predeterminadas. No use objetos mutables como su valor predeterminado.

# bad
def fL(x=[])
  x.append(1)
  print x
# good
def fN(x=None)
  if (x is None):
    x = []
  x.append(1)
  print x

fL()
fL()
fN()
fN()

La diferencia entre las variables de clase e instancia es muy sutil cuando comienzas por primera vez.

class Obj(object):
   thing = "class variable"
   def __init__(self):
      self.thing1 = "instance variable"
      print self.thing, self.thing1

Esas son algunas de las cosas a las que tuve que acostumbrarme cuando hice el cambio.

muestreador
fuente
1
1 buen resumen de algunas cosas, aunque yo sabía que los de antes
Anto
6

Bueno, Python no tiene interfaces, tiene metaclases, y permite escribir pato. Python tiene listas de comprensión, que son muy poderosas y no existen en Java. Java tiene un sistema de tipo rico con muchas estructuras de datos, y Python solo tiene listas. Entonces, si está aprovechando lo que tiene Python en lugar de intentar recrear lo que Java tiene en Python, probablemente esté escribiendo código Pythonic.

Pero en lo que respecta al código OO, hay ciertos fundamentos de estilo que no deberían cambiar de un idioma a otro: siempre debe esforzarse por escribir código que sea tímido y SECO, ya sea que esté escribiendo en Applescript, Python, Java o C ++.

----Editar----

Como @delnan señala pedagógicamente, en realidad hay CINCO tipos de datos compuestos definidos por Python en el nivel de Kernel (list, dict, tuple, set y frozenset, según mi copia de "Python in a Nutshell"). Si bien esto es cierto, en realidad no es relevante para el punto que estoy tratando de hacer: Python se basa en listas como la estructura de datos esencial. Sí, PUEDE usar una lista como una pila, pero puede usar exactamente la misma lista que una cola. Y luego una pila de nuevo.

Java, por otro lado, tiene una estructura de datos del núcleo (matriz, de acuerdo con la "Guía de bolsillo de Java"), pero en general, no se puede hacer mucho en Java sin importar colecciones. Una vez que haga eso, tendrá acceso a una biblioteca de tipos 'rica' (en este sentido me refiero a inmensamente compleja) con la que obtener la misma funcionalidad que tenía con la lista de Python.

Por supuesto, ambos idiomas tienen clases y Java tiene interfaces, pero si bien son tipos de datos compuestos, en realidad no son estructuras de datos en el sentido de un libro de texto.

Una diferencia es que no puede hacer estallar un elemento de una cola de Java, y no puede pasar un objeto de cola de Java a un lugar que espera una lista enlazada de Java. Tal vez por "rico" me refiero a "rígido".

Entonces, para explicar lo que quiero decir al decir "Python solo tiene listas", lo que quiero decir es que puedes hacer casi todo lo que necesitas hacer en Python que harías con las Colecciones de Java usando el tipo de Lista de Pythons. Este tipo único hace el trabajo de muchos tipos en Java.

¿Qué significa esto para el programador de Python? Significa que puede aprovechar el tipo de Lista de Python para escribir código directo y muy concisa sin el uso de bibliotecas adicionales, y la concisión (es decir, la característica de transmitir más valor en menos caracteres) es una característica central del código "Pythonic" .

filosodad
fuente
Estoy familiarizado con todas las metaclases, pero las buscaré. Gracias :)
Anto
77
-1 hasta que pueda explicar lo siguiente: (1) "Python solo tiene listas" - Python tiene una gran cantidad de estructuras de datos. No tiene tres implementaciones de cada una de las estructuras de datos jamás concebidas, pero sigue siendo una de las que la mayoría de la gente necesitará. (2) Llamar "rico" al sistema de tipos de Java es una burla de esos sistemas de tipos realmente sofisticados. Para empezar , mira Haskell (98 sin ninguna extensión).
Lo siento, esto simplemente no es cierto. Python tiene exactamente dos estructuras de datos: listas y diccionarios. Algunas BIBLIOTECAS de Python pueden extender estas estructuras centrales, pero eso no es lo mismo que decir que el lenguaje las tiene.
philosodad
55
Eso ya es el doble de los nombres de las respuestas. La lista se dobla como pila. Los conjuntos y las tuplas también están incorporados (¿cuántas estructuras de datos están integradas en Java?) También hay módulos en la biblioteca estándar para montones (min), deques, registros inmutables y matrices homogéneas compactas (restringidas a C tipos). Y eso es solo desde lo alto de mi cabeza. Sí, la mayoría de esos usan listas / dictados internamente (sin embargo, los conjuntos no son dictados con claves no utilizadas). Pero también lo son la mayoría de las colecciones en Java, de hecho, en todos los idiomas. Asi es como funciona.
1
Ahora creo que entiendo el punto que trataste de hacer (y eliminé mi voto negativo, que agregué en primer lugar porque esa parte era simplemente incorrecta de la forma en que se dijo originalmente). Todavía creo que debe considerar al menos dos estructuras de datos (las listas como secuencias casi universales y los dictados como asignaciones casi universales). Y eso sin mencionar los diversos iteradores y generadores, que utilizo al menos como (y probablemente más) como listas.