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.
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.
Respuestas:
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 import
declaraciones.
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.
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.
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.py
serí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 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.
La documentación de los módulos Python tiene información útil sobre la organización de paquetes.
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.
Diría que ponga tantas clases como pueda agruparse lógicamente en ese archivo sin hacerlo demasiado grande y complejo.