Pregunta

Estoy acostumbrado al modelo Java donde puedes tener una clase pública por archivo.Python no tiene esta restricción y me pregunto cuál es la mejor práctica para organizar clases.

¿Fue útil?

Solución

Un archivo Python se llama "módulo" y es una forma de organizar su software para que tenga "sentido".Otro es un directorio, llamado "paquete".

Un módulo es algo distinto que puede tener una o dos docenas de clases estrechamente relacionadas.El truco es que un módulo es algo que usted importará, y necesita que esa importación sea perfectamente sensible para las personas que leerán, mantendrán y ampliarán su software.

La regla es esta: un módulo es la unidad de reutilización.

No se puede reutilizar fácilmente una sola clase.Debería poder reutilizar un módulo sin ninguna dificultad.Todo lo que hay en su biblioteca (y todo lo que descarga y agrega) es un módulo o un paquete de módulos.

Por ejemplo, estás trabajando en algo que lee hojas de cálculo, hace algunos cálculos y carga los resultados en una base de datos.¿Cómo quieres que se vea tu programa principal?

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 )

Piense en la importación como la forma de organizar su código en conceptos o fragmentos.No importa exactamente cuántas clases hay en cada importación.Lo que importa es la organización general que estás retratando con tu import declaraciones.

Otros consejos

Como no existe un límite artificial, todo depende de lo que sea comprensible.Si tiene un montón de clases bastante cortas y simples que están lógicamente agrupadas, agregue un montón de ellas.Si tiene clases grandes y complejas o clases que no tienen sentido como grupo, utilice un archivo por clase.O elige algo intermedio.Refactorice a medida que las cosas cambien.

Resulta que me gusta el modelo Java por la siguiente razón.Colocar cada clase en un archivo individual promueve la reutilización al hacer que las clases sean más fáciles de ver al explorar el código fuente.Si tiene un montón de clases agrupadas en un solo archivo, puede que a otros desarrolladores no les resulte obvio que hay clases allí que se pueden reutilizar simplemente explorando el archivo del proyecto. estructura de directorios.Por lo tanto, si cree que es posible reutilizar su clase, la pondría en su propio archivo.

Depende completamente del tamaño del proyecto, de la duración de las clases, de si se utilizarán desde otros archivos, etc.

Por ejemplo, a menudo uso una serie de clases para la abstracción de datos, por lo que puedo tener 4 o 5 clases que solo pueden tener 1 línea de largo (class SomeData: pass).

Sería estúpido dividir cada uno de estos en archivos separados, pero como pueden usarse desde archivos diferentes, ponerlos todos en archivos separados data_model.py archivo tendría sentido, así que puedo hacer from mypackage.data_model import SomeData, SomeSubData

Si tiene una clase con mucho código, tal vez con algunas funciones que solo ella usa, sería una buena idea dividir esta clase y las funciones auxiliares en un archivo separado.

Deberías estructurarlos para que lo hagas. from mypackage.database.schema import MyModel, no from mypackage.email.errors import MyDatabaseModel - Si tiene sentido desde dónde está importando cosas y los archivos no tienen decenas de miles de líneas, lo ha organizado correctamente.

El Documentación de módulos de Python tiene información útil sobre cómo organizar paquetes.

Me encuentro dividiendo las cosas cuando me molesta el tamaño de los archivos y cuando la estructura deseable de relación comienza a surgir de forma natural.A menudo estas dos etapas parecen coincidir.

Puede resultar muy molesto si divides las cosas demasiado pronto, porque empiezas a darte cuenta de que se requiere un orden de estructura totalmente diferente.

Por otro lado, cuando cualquier archivo .java o .py llega a más de 700 líneas, empiezo a molestarme constantemente tratando de recordar dónde está "ese bit en particular".

Con Python/Jython, la dependencia circular de las declaraciones de importación también parece desempeñar un papel:si intenta dividir demasiados bloques de construcción básicos que cooperan en archivos separados, esta "restricción"/"imperfección" del lenguaje parece obligarlo a agrupar cosas, quizás de una manera bastante sensata.

En cuanto a la división en paquetes, no lo sé realmente, pero diría que probablemente la misma regla de molestia y aparición de una estructura feliz funciona en todos los niveles de modularidad.

Yo diría que se pongan tantas clases como se puedan agrupar lógicamente en ese archivo sin hacerlo demasiado grande y complejo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top