Domanda

Sono abituato al modello Java in cui è possibile avere una classe pubblica per file. Python non ha questa limitazione e mi chiedo quale sia la migliore pratica per organizzare le lezioni.

È stato utile?

Soluzione

Un file Python è chiamato " modulo " ed è un modo per organizzare il tuo software in modo che abbia "senso". Un'altra è una directory, chiamata "pacchetto" &

Un modulo è una cosa distinta che può avere una o due dozzine di classi strettamente correlate. Il trucco è che un modulo è qualcosa che importerai, e devi importarlo per essere perfettamente sensibile alle persone che leggeranno, manterranno ed estenderanno il tuo software.

La regola è questa: un modulo è l'unità di riutilizzo .

Non puoi riutilizzare facilmente una singola classe. Dovresti essere in grado di riutilizzare un modulo senza alcuna difficoltà. Tutto nella tua libreria (e tutto ciò che scarichi e aggiungi) è un modulo o un pacchetto di moduli.

Ad esempio, stai lavorando a qualcosa che legge fogli di calcolo, esegue alcuni calcoli e carica i risultati in un database. Come vuoi che sia il tuo programma principale?

from ssReader import Reader
from theCalcs import ACalc, AnotherCalc
from theDB import Loader

def main( sourceFileName ):
    rdr= Reader( sourceFileName )
    c1= ACalc( options )
    c2= AnotherCalc( options )
    ldr= Loader( parameters )
    for myObj in rdr.readAll():
        c1.thisOp( myObj )
        c2.thatOp( myObj )
        ldr.laod( myObj )

Pensa all'importazione come al modo di organizzare il tuo codice in concetti o blocchi. Non importa quante classi ci siano in ogni importazione. Ciò che conta è l'organizzazione generale che stai rappresentando con le tue dichiarazioni import .

Altri suggerimenti

Poiché non esiste un limite artificiale, dipende davvero da ciò che è comprensibile. Se hai un gruppo di classi piuttosto brevi e semplici che sono raggruppate logicamente insieme, gettane un gruppo. Se hai classi grandi e complesse o classi che non hanno senso come gruppo, seleziona un file per classe. O scegli qualcosa tra. Rifattore quando le cose cambiano.

Mi capita di apprezzare il modello Java per il seguente motivo. Posizionare ogni classe in un singolo file promuove il riutilizzo rendendo le classi più facili da vedere quando si sfoglia il codice sorgente. Se hai un gruppo di classi raggruppate in un singolo file, potrebbe non essere ovvio per gli altri sviluppatori che ci sono classi lì che possono essere riutilizzate semplicemente sfogliando la struttura di directory del progetto. Quindi, se pensi che la tua classe possa essere riutilizzata, la metterei nel suo file.

Dipende interamente da quanto è grande il progetto, da quanto tempo sono le classi, se saranno usate da altri file e così via.

Ad esempio, uso abbastanza spesso una serie di classi per l'astrazione dei dati, quindi posso avere 4 o 5 classi che possono essere lunghe solo 1 riga ( class SomeData: pass ).

Sarebbe stupido dividere ognuno di questi in file separati - ma dal momento che possono essere utilizzati da file diversi, mettere tutti questi in un file data_model.py separato avrebbe senso, quindi posso da mypackage.data_model importa SomeData, SomeSubData

Se hai una classe con molto codice, forse con solo alcune funzioni che usa, sarebbe una buona idea dividere questa classe e le funzioni di supporto in un file separato.

Dovresti strutturarli in modo da da mypackage.database.schema importare MyModel , non da mypackage.email.errors importare MyDatabaseModel - se da dove stai importando cose ha senso, e i file non sono lunghi decine di migliaia di righe, l'hai organizzato correttamente.

La Documentazione sui moduli Python contiene alcune informazioni utili sull'organizzazione dei pacchetti.

Mi ritrovo a dividere le cose quando mi annoio per la grandezza dei file e quando la struttura desiderabile di parentela inizia a emergere naturalmente. Spesso queste due fasi sembrano coincidere.

Può essere molto fastidioso se dividi le cose troppo presto, perché inizi a capire che è necessario un ordinamento della struttura totalmente diverso.

D'altra parte, quando un file .java o .py sta arrivando a più di circa 700 righe, comincio a infastidirmi costantemente, cercando di ricordare dove "quel particolare bit". è.

Con Python / Jython anche la dipendenza circolare delle istruzioni di importazione sembra avere un ruolo: se provi a dividere troppi blocchi di base cooperanti in file separati questa "restrizione" e / "imperfezione". del linguaggio sembra costringerti a raggruppare le cose, forse in modo piuttosto sensato.

Per quanto riguarda la suddivisione in pacchetti, non lo so davvero, ma direi probabilmente la stessa regola del fastidio e dell'emergere di una struttura felice funziona a tutti i livelli di modularità.

Direi di mettere quante più classi si possono raggruppare logicamente in quel file senza renderlo troppo grande e complesso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top