2011-01-20 6 views
16

In Java, questa domanda è facile (anche se un po 'noiosa): ogni classe richiede un proprio file. Quindi il numero di file .java in un progetto è il numero di classi (senza contare le classi anonime/nidificate).Quando uno script Python dovrebbe essere diviso in più file/moduli?

In Python, però, posso definire più classi nello stesso file, e non sono abbastanza sicuro di come trovare il punto in cui ho diviso le cose. Sembra sbagliato creare un file per ogni classe, ma è sbagliato anche lasciare tutto nello stesso file per impostazione predefinita. Come faccio a sapere dove interrompere un programma?

+1

Bella domanda, mi sono chiesto anche questo. Ho aggiunto un paio di tag. – Colin

risposta

15

Ricorda che in Python, un file è un modulo che molto probabilmente importerai per utilizzare le classi in esso contenute. Ricorda anche uno dei principi di base dello sviluppo del software "the unit of packaging is the unit of reuse", che in pratica significa:

Se le classi sono molto probabilmente usate insieme, o se usare una classe porta a usarne un'altra, esse appartengono a un pacchetto comune.

2

In Java ... ogni classe richiede il proprio file.

Sul lato opposto, a volte un file Java, inoltre, includerà enumerazioni o sottoclassi o interfacce, all'interno della classe principale perché sono "strettamente correlati".

senza contare anonime/nidificato classi

classi anonime non devono essere conteggiati, ma penso che l'uso di buon gusto di classi nidificate è una scelta molto simile a quello che stai chiedendo su Python.

(Di tanto in tanto un file Java avrà due classi, non nidificate, che è permesso, ma che schifo non lo faccio.)

0

Python in realtà ti dà la possibilità di confezionare il codice in modo che si vede in forma .

L'analogia tra Python e Java è che un file, ad esempio, il file .py in Python è equivalente a un pacchetto in Java poiché può contenere molte classi e funzioni correlate.

Per buoni esempi, dare un'occhiata ai moduli incorporati Python. Basta scaricare la fonte e controllarli, la regola generale che seguo è quando hai classi o funzioni strettamente accoppiate li tieni in un singolo file altrimenti li rompi.

2

Come vedo, questa è davvero una domanda sul riutilizzo e l'astrazione. Se hai un problema che puoi risolvere in un modo molto generale, in modo che il codice risultante possa essere utile in molti altri programmi, inseriscilo nel suo modulo.

Ad esempio: qualche tempo fa ho scritto un client mpd (cattivo). Volevo semplificare il file di configurazione e l'analisi delle opzioni, quindi ho creato una classe che combina le funzionalità di ConfigParser e optparse in un modo che ritenevo ragionevole. Aveva bisogno di un paio di classi di supporto, quindi le ho messe tutte insieme in un modulo. Non uso mai il client, ma ho riutilizzato il modulo di configurazione in altri progetti.

EDIT: Inoltre, mi è appena venuta una risposta più cinica: se riesci a risolvere un problema in un modo davvero brutto, nascondi la bruttezza in un modulo. :)