¿Cuántas clases debo poner en un archivo? [cerrado]

274

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.

brianegge
fuente
8
Creo que esta es una pregunta razonable dados los requisitos y convenciones de otros lenguajes, y la respuesta es "<definir módulos y paquetes de Python> y más allá de eso es una cuestión de preferencia (/ opinión)" - esa respuesta no es en sí misma una opinión
david.libremone

Respuestas:

333

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 una cosa distinta que puede tener una o dos docenas de clases estrechamente relacionadas. El truco es que un módulo es algo que 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 puede reutilizar fácilmente una sola clase. Debería poder reutilizar un módulo sin ninguna dificultad. Todo en su biblioteca (y todo lo que descarga y agrega) es un módulo o un paquete de módulos.

Por ejemplo, está 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 representa con sus importdeclaraciones.

S.Lott
fuente
24
Jaja, me gusta el "sentido" en las citas.
cdleary
27
@cdleary: el sentido de una persona es la locura de otra persona. Por lo general, puede definir módulos sensibles. Sin embargo, en una gran aplicación, siempre hay múltiples dimensiones de análisis y una persona dividirá los pelos en el corte y el corte de la funcionalidad de otra persona.
S.Lott
44
Las recomendaciones anteriores están de acuerdo con docs.python-guide.org/en/latest/writing/structure
Jaiswal
44
La respuesta que en realidad no responde a la pregunta, ¿qué pasa con la legibilidad? Es difícil leer archivos con más de 500 líneas.
Vedmant
38

Como no hay un límite artificial, realmente depende de lo que sea comprensible. Si tiene un montón de clases bastante cortas y simples que están agrupadas lógicamente, agregue un montón de ellas. Si tiene clases grandes y complejas o clases que no tienen sentido como grupo, vaya un archivo por clase. O elige algo en el medio. Refactorizar a medida que cambian las cosas.

Chris Upchurch
fuente
23

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 grupo de clases agrupadas en un solo archivo, puede que no sea obvio para otros desarrolladores que hay clases allí que pueden reutilizarse simplemente explorando la estructura de directorios del proyecto . Por lo tanto, si cree que su clase puede ser reutilizada, lo pondría en su propio archivo.

Raffi Khatchadourian
fuente
2
Estoy totalmente de acuerdo contigo. Tener varias clases públicas en un solo archivo es contra intuitivo y hace que el código sea difícil de entender, como si alguien quisiera ocultar la estructura y tiene la sensación de ser ticky-hortera. Especialmente si vienes de Java a Python.
WebComer
Especialmente si vienes de Java a Python. Solían lanzar muchas clases en un archivo en Python)
WebComer
14

Depende completamente de qué tan grande sea el proyecto, cuánto duran las clases, si se usará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 dado que se pueden usar desde archivos diferentes, data_model.pysería lógico poner todo esto en un archivo separado , por lo que puedo hacerfrom mypackage.data_model import SomeData, SomeSubData

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

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

La documentación de los módulos Python tiene información útil sobre la organización de paquetes.

dbr
fuente
1
Enlace roto a la documentación de los módulos Python. Tal vez la Sección 6.4 Módulos. Paquetes es el enlace previsto ahora?
cod3monk3y
9

Me encuentro dividiendo las cosas cuando me molesta la gran cantidad de archivos y cuando la estructura deseable de relación comienza a surgir naturalmente. A menudo, estas dos etapas parecen coincidir.

Puede ser muy molesto si divide las cosas demasiado pronto, porque comienza a darse 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 aproximadamente 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 jugar un papel: si intenta dividir demasiados bloques básicos de cooperación en archivos separados, esta "restricción" / "imperfección" del lenguaje parece forzarlo a agrupar cosas, tal vez 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 estructuras felices funciona en todos los niveles de modularidad.

Mike roedor
fuente
6

Diría que ponga tantas clases como pueda agruparse lógicamente en ese archivo sin hacerlo demasiado grande y complejo.

Jason Baker
fuente