Differenze tra "Java OOP" e "Pythonic OOP"? [chiuso]

19

Ho iniziato con ActionScript 2.0 e ho proseguito con Java. Da allora ho imparato, o almeno usato un sacco di lingue, incluso Python (probabilmente il mio preferito).

Temo che il mio stile di programmazione orientata agli oggetti sia molto spitico e più simile a Java OOP con sintassi Python. Cosa rende Java like e Pythonic OOP differiscono l'uno dall'altro? Che cosa fanno i programmatori Java spesso "nonptonizzati" quando scrivono codice orientato agli oggetti in Python?

    
posta Anto 28.03.2011 - 21:04
fonte

3 risposte

54

Per un ragazzo Java Python è un gioco anarchico in cui chiunque può prendere un club e iniziare a scavare la testa.

Per un ragazzo di Python Java è un universo orwelliano in cui sei costantemente incatenato alla visione decrescente di qualcun altro di come funziona l'universo.

La verità è tutto ciò che puoi fare in una lingua che puoi fare nell'altra altrettanto chiaramente. Tuttavia, come hai detto, ci sono importanti differenze in entrambe le comunità riguardo a ciò che clean significa.

Modo Java: Un sistema pulito è quello che fa ciò che è inteso e nient'altro, non permetterà estensioni o modifiche che vanno contro la natura dello scopo previsto e tenterà di farle rispettare il più possibile attraverso il compilatore. La flessibilità è ottenuta attraverso un'attenta realizzazione di semplici interfacce all'interno di strutture rigorose. In Java, la scatola di sabbia deve essere sempre chiaramente delimitata e il superamento di questi ha un rapido riscontro dal compilatore. Java fornisce mezzi per static definire strutture di oggetti e creare interazioni dinamiche da istanze di esse. Quando lavoro in Java cerco di creare in modo intelligente blocchi elementari verso una soluzione cerebrale. Io lavoro principalmente dal basso verso l'alto una volta che ho una teoria funzionante su come affrontare il problema.

Java tenderà a produrre un software di grandi dimensioni che può estendersi su grandi team e fornisce strumenti e mezzi per tenere sotto controllo il gruppo. Se mantenuti non controllati, ciò porterà a team molto distaccati che lavorano indipendentemente verso un obiettivo sempre più oscuro. Alla fine ogni squadra diventa la propria "ragion d'essere" e il sistema nel suo insieme diventa diluito, allontanando il progetto principale. Questi possono portare a sovraccarichi di costi estremi e sistemi software enormi che eseguono e mantengono scarsamente.

Non c'è quasi mai un modo semplice e veloce per fare cose in Java, ma l'IDE e gli strumenti sono lì per fare compiti dolorosi a pochi click di distanza.

Modo Python: Pulito significa conciso e facilmente leggibile. Un buon sistema Python è progettato per permetterti di arrivare direttamente al centro di esso ed espone i suoi segreti più nascosti in modo che tu possa capire dal codice l'uso previsto e il suo scopo. Ti permetterà anche di progettare la tua soluzione in giro estendendo e / o incapsulando il progetto originale in modo che vada esattamente nella tua direzione. Python fornisce i mezzi per creare modelli di oggetti da cui è possibile modificare dinamicamente l'istanza per soddisfare le esigenze in questione. In python tendo ad affrontare il problema subito e poi a diffondere il codice in una struttura logica tale che la soluzione finale rimanga il più semplice e leggibile possibile. In python tendo a lavorare dall'alto verso il basso e gestisco l'aumento delle complessità attraverso un approccio divide et impera.

I team Python tenderanno a produrre sistemi leggeri e ad essere molto veloci nel fornire una soluzione funzionante. Tendono ad essere un gruppo affiatato che lavora in modo intercambiabile su qualsiasi parte del sistema, convalidando la soluzione l'uno per l'altra ogni volta che ottengono. Si nutrono l'un l'altro creando una sinergia che è abbastanza esilarante. Tuttavia questo crea squadre che sono difficili da scalare su sistemi più grandi e spesso colpiscono una sorta di soffitto di vetro. L'introduzione di nuovi membri nel team aiuterà, ma ci vorrà del tempo perché le conoscenze si diffondano abbastanza per far sentire la produttività extra. Il team si dividerà e il quadro costante sull'intero sistema si diluisce come fa l'atmosfera dei primi giorni. Questo può portare a un codice troppo complicato per quello che una volta era un problema semplice, eccedenze di costo e sistemi che eseguono e mantengono scarsamente.

C'è sempre un modo semplice e veloce per fare cose con Python, ma la complessità può essere più difficile da tenere sotto controllo quando il sistema raggiunge una certa soglia.

In breve, entrambi hanno un lato oscuro ed entrambi hanno una forza chiara. Tuttavia, quando spingi su entrambe le comunità scoprirai che la forza di uno porta al lato oscuro dell'altro e viceversa.

Di qui i dibattiti accesi su quale sia il migliore.

    
risposta data 29.03.2011 - 09:32
fonte
14

Quindi sai tutto ciò che riguarda l'impostazione della visibilità di metodi e variabili? Sì, quelli non esistono più, tutto è pubblico. Esistono convenzioni di denominazione e manomissione dei nomi, ma tutto è ancora disponibile.

Parte della flessibilità di Python deriva dal fatto che ti è permesso fare quasi tutto. Per questo motivo, la filosofia è che le persone dovrebbero sapere come utilizzare l'API piuttosto che l'API che impone l'utilizzo corretto di un metodo.

Invece di overload di metodi, hai le variabili di default. Non utilizzare oggetti mutabili come valore predefinito.

# 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 differenza tra le variabili di classe e di istanza è molto sottile al primo avvio.

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

Queste sono alcune delle cose a cui dovevo abituarmi quando ho fatto lo switch.

    
risposta data 28.03.2011 - 21:23
fonte
6

Bene, Python non ha interfacce, ha metaclassi e consente la digitazione anatra. Python ha delle list comprehensions, che sono molto potenti e non esistono in Java. Java ha un ricco sistema di tipi con molte strutture dati e Python ha solo liste. Quindi, se stai sfruttando ciò che Python ha invece di provare a ricreare ciò che Java ha in Python, probabilmente stai scrivendo il codice Pythonic.

Ma per quanto riguarda il codice OO, ci sono alcuni fondamentali dello stile che non dovrebbero cambiare da una lingua all'altra: dovresti sempre cercare di scrivere codice che sia Shy e DRY, sia che tu stia scrivendo in Applescript, Python, Java, o C ++.

---- ---- Modifica

Come sottolinea pedantemente @delnan, ci sono in realtà cinque tipi di dati compositi definiti da Python a livello di kernel (lista, dict, tuple, set e frozenset, secondo la mia copia di "Python in a Nutshell"). Anche se questo è vero, non è realmente pertinente al punto che sto cercando di fare: Python si basa su liste come la struttura dati essenziale. Sì, è possibile utilizzare un elenco come stack, ma è possibile utilizzare lo stesso stesso elenco come una coda. E poi una pila di nuovo.

Java, d'altra parte, ha una struttura dati del kernel (Array, secondo "The Java Pocket Guide"), ma in generale, non è possibile ottenere molto da fare in Java senza importare collezioni. hai accesso a una libreria di tipi "ricca" (in tal senso intendo immensamente complessa) con cui ottenere la stessa funzionalità che avevi con la lista di Python.

Naturalmente, entrambi i linguaggi hanno classi e Java ha interfacce, ma mentre questi sono tipi di dati compositi, non sono realmente strutture di dati in senso letterale.

Una differenza consiste nel fatto che non è possibile eseguire il pop di un elemento da una coda Java e non è possibile passare da qualche parte un oggetto Java Queue che si aspetta un elenco collegato Java. Quindi, per "ricco", in realtà intendo "rigido".

Quindi per spiegare cosa intendo dicendo "Python ha solo elenchi", quello che voglio dire è che puoi fare praticamente tutto ciò che devi fare in Python che dovresti fare con le Collezioni Java usando il tipo Elenco Python. Questo singolo tipo fa il lavoro di moltissimi tipi in Java.

Che cosa significa questo per il programmatore Python? Significa che puoi sfruttare il tipo Elenco Python per scrivere codice diretto molto conciso senza l'uso di librerie aggiuntive e la pithiness (ovvero la caratteristica di trasmettere più valore in meno caratteri) è una caratteristica fondamentale del codice "Pythonic" .

    
risposta data 28.03.2011 - 21:24
fonte

Leggi altre domande sui tag