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


19

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

Temo però che il mio stile di programmazione orientata agli oggetti sia molto poco realistico, e più simile a Java OOP con sintassi Python. Cosa differenzia Java e Pythonic OOP l'uno dall'altro? Cosa fanno spesso i programmatori Java "in modo non pitonico" quando scrivono codice orientato agli oggetti in Python?

Risposte:


54

Per un ragazzo Java Python è un playgound anarchico in cui chiunque può afferrare un club e iniziare a massacrare la testa.

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

La verità è tutto ciò che puoi fare in una lingua che puoi fare nell'altra in modo altrettanto pulito. Tuttavia, come hai accennato, ci sono differenze importanti in entrambe le comunità su ciò che significa pulito .

Modo Java: un sistema pulito è quello che fa ciò che è destinato e nient'altro, non consentirà estensioni o modifiche che vanno contro la natura dello scopo previsto e tenterà di farli rispettare il più possibile attraverso il compilatore. La flessibilità è ottenuta attraverso l'attenta realizzazione di interfacce semplici all'interno di strutture rigorose. In Java un sand box dovrebbe essere sempre chiaramente delimitato e superarli superava il rapido feedback del compilatore. Java fornisce mezzi staticamente definire strutture degli oggetti e creare interazioni dinamiche dalle loro istanze. Quando lavoro in Java, cerco di creare abilmente elementi di base per una soluzione cerebrale. Lavoro principalmente dal basso verso l'alto una volta che ho una teoria funzionante su come affrontare il problema.

Java tenderà a produrre software di grandi dimensioni che può estendersi a team di grandi dimensioni e fornisce strumenti e mezzi per tenere sotto controllo il gregge. Se non controllato, questo porterà a team molto distaccati che lavorano in modo indipendente verso un obiettivo sempre più poco chiaro. Alla fine ogni squadra diventa la propria "ragion d'essere" e il sistema nel suo insieme si diluisce guidando fuori strada il progetto principale. Ciò può comportare sovraccarichi di costi estremi e enormi sistemi software che funzionano e mantengono male.

Non c'è quasi mai un modo semplice e veloce per fare le cose in Java, ma l'IDE e gli strumenti sono lì per rendere le attività dolorose a pochi clic di distanza.

Modo Python: pulito significa conciso e facilmente leggibile. Un buon sistema Python è progettato per permetterti di arrivare al cuore di esso ed espone i suoi segreti più intimi in modo da poter comprendere dal codice l'uso e lo scopo previsti. Ti permetterà anche di progettare la tua soluzione estendendo e / o incapsulando il design originale in modo che andrà esattamente nella tua direzione. Python fornisce mezzi per creare modelli di oggetti da cui è possibile modificare dinamicamente l'istanza per adattarsi alle esigenze attuali. In Python tendo ad affrontare subito il problema e quindi a diffondere il codice in una struttura logica in modo che la soluzione finale rimanga il più semplice e leggibile possibile. In Python tendo a lavorare dall'alto verso il basso e a gestire le crescenti complessità attraverso un approccio di divisione e conquista.

I team Python tenderanno a produrre sistemi di illuminazione e saranno molto veloci nel fornire una soluzione funzionante. Tenderanno ad essere un gruppo affiatato che lavora in modo intercambiabile su qualsiasi parte del sistema convalidando la soluzione reciproca ogni volta che ottengono. Si nutrono a vicenda creando una sinergia che è abbastanza esaltante. Tuttavia, ciò crea team che sono difficili da scalare in 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 prima che le conoscenze si diffondano abbastanza da far sentire la produttività extra. Il team viene quindi diviso e la costante panoramica sull'intero sistema si diluisce così come l'atmosfera dei primi giorni. Questo può portare a un codice troppo contorto per quello che una volta era un problema semplice,

Esiste quasi sempre un modo semplice e veloce per fare le 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 chiara forza. Tuttavia, quando si cammina lungo entrambe le comunità, scoprirai che la forza di una porta al lato oscuro dell'altra e viceversa.

Da qui i dibattiti accesi su quale sia il migliore.


14

Quindi sai tutto sull'impostazione della visibilità di metodi e variabili? Sì, quelli non esistono più, tutto è pubblico. Esistono convenzioni di denominazione e modifica del nome, ma tutto è ancora veramente 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 usare l'API piuttosto che l'API, imponendo che un metodo sia usato correttamente.

Invece di sovraccarichi di metodo, hai variabili predefinite. 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 all'inizio.

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 mi sono dovuto abituare quando ho fatto il passaggio.


1
+1 buon riassunto di alcune cose, anche se le conoscevo da prima
Anto,

6

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

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

----Modificare----

Come sottolinea pedonicamente @delnan, in realtà ci sono CINQUE tipi di dati compositi definiti da Python a livello di kernel (elenco, dict, tuple, set e frozenset, secondo la mia copia di "Python in a Nutshell"). Anche se questo è vero, in realtà non è rilevante per il punto che sto cercando di chiarire: Python si basa sugli elenchi come struttura di dati essenziale. Sì, PUOI utilizzare un elenco come stack, ma puoi utilizzare lo stesso elenco esatto di una coda. E poi ancora una pila.

Java, d'altra parte, ha una struttura di dati del kernel (Array, secondo "The Java Pocket Guide), ma in generale, non puoi fare molto in Java senza importare le raccolte. Una volta fatto, hai accesso in una libreria di tipi "ricca" (nel senso che intendo immensamente complessa) con cui ottenere la stessa funzionalità che hai avuto con l'elenco di Python.

Naturalmente, entrambe le lingue hanno classi e Java ha interfacce, ma mentre quelli sono tipi di dati compositi, in realtà non sono strutture di dati nel senso di un libro di testo.

Una differenza è che non è possibile estrarre un elemento da una coda Java e non è possibile passare un oggetto Coda Java da qualche parte in attesa di un elenco collegato Java. Quindi forse per "ricco" intendo in realtà "rigido".

Quindi, per spiegare cosa intendo dicendo "Python ha solo elenchi", ciò che intendo è che puoi fare praticamente tutto ciò che devi fare in Python che faresti con le raccolte Java usando il tipo Elenco Pythons. Questo singolo tipo funziona in moltissimi tipi in Java.

Cosa significa questo per il programmatore Python? Significa che puoi sfruttare il tipo di Elenco Python per scrivere codice molto pithy, diretto 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" .


Conosco tutti tranne i metaclassi, li cercherò. Grazie :)
Anto,

7
-1 finché non puoi spiegare quanto segue: (1) "Python ha solo elenchi" - Python ha una vasta gamma di strutture di dati. Non ha tre implementazioni di ogni singola struttura di dati mai concepita, ma comunque su ognuna delle quali la maggior parte delle persone avrà mai bisogno. (2) Chiamare il sistema di tipi Java "ricco" è una presa in giro di quei sistemi di tipo davvero sofisticati. Per cominciare , guarda Haskell (98 senza alcuna estensione).

Mi dispiace, questo non è vero. Python ha esattamente due strutture di dati: Elenchi e Dizionari. Alcune BIBLIOTECHE Python potrebbero estendere queste strutture fondamentali, ma non è lo stesso che dire che il linguaggio le ha.
Philosodad,

5
Sono già il doppio dei nomi delle risposte. L'elenco raddoppia come stack. Anche insiemi e tuple sono integrati (quante strutture di dati sono integrate in Java?) Ci sono anche moduli nella libreria standard per (min-) heap, deques, record immutabili e array omogenei strettamente compressi (limitato a C tipi). E questo è solo dalla cima della mia testa. Sì, la maggior parte di quelli usa liste / dicts internamente (tuttavia, i set non sono dicts con chiavi inutilizzate). Ma lo sono anche la maggior parte delle raccolte in Java - in effetti, in tutte le lingue. Funziona così.

1
Ora penso di aver capito il punto che hai cercato di chiarire (e ho rimosso il mio voto negativo, che ho aggiunto in primo luogo perché quella parte era chiaramente sbagliata nel modo in cui era stata inizialmente dichiarata). Penso ancora che sia necessario considerare almeno due strutture di dati (elenchi come sequenze quasi universali e dicts come mappature quasi universali). E questo per non parlare dei vari iteratori e generatori, che uso almeno come (e probabilmente anche di più) frequentemente come elenchi.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.