2008-09-20 14 views
217

Estoy acostumbrado al modelo Java donde puede 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.¿Cuántas clases debo poner en un archivo?

+5

Creo que esta es una * pregunta * razonable dados los requisitos y convenciones de otros idiomas, y * la * respuesta * es " y más allá es una cuestión de preferencia (/ opinión)" - * esa respuesta * no es en sí misma una opinión – d3vid

Respuesta

268

Un archivo Python se denomina "módulo" y es una forma de organizar el 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 va a importar, y necesita que la 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á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 sea 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. Exactamente cuántas clases hay en cada importación no importa. Lo que importa es la organización general que está retratando con sus declaraciones import.

+16

Jaja, me gusta el "sentido" en las citas. – cdleary

+21

@cdleary: el sentido de una persona es la locura de otra persona. Por lo general, puede definir módulos sensibles. En una gran aplicación, sin embargo, siempre hay múltiples dimensiones de análisis y una persona se dividirá el corte y el corte de la funcionalidad de otra persona. –

+4

Las recomendaciones anteriores están de acuerdo con http://docs.python-guide.org/en/latest/writing/structure/ –

5

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

35

Dado que no existe un límite artificial, realmente depende de lo que sea comprensible. Si tiene un grupo de clases bastante cortas y simples que están lógicamente agrupadas, agregue un montón de ellas. Si tienes clases o clases grandes y complejas que no tienen sentido como grupo, ve un archivo por clase. O elige algo intermedio. Refactor como las cosas cambian.

13

Depende completamente de cuán grande es el proyecto, cuánto duran las clases, si se usarán desde otros archivos, etc.

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

Sería estúpido para dividir cada uno de estos en archivos separados - pero ya que se pueden utilizar de diferentes archivos, poniendo todo esto en un archivo separado data_model.py tendría sentido, por lo que puede hacer from mypackage.data_model import SomeData, SomeSubData

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

Debe estructurarlos de modo que haga from mypackage.database.schema import MyModel, no from mypackage.email.errors import MyDatabaseModel - si lo que importa tiene sentido, y los archivos no tienen decenas de miles de líneas, lo ha organizado correctamente.

El Python Modules documentation tiene información útil sobre la organización de paquetes.

+0

enlace roto a la documentación de Python Modules. Tal vez [Sección 6.4 Módulos.Paquetes] (http://docs.python.org/2/tutorial/modules.html#packages) es el enlace previsto ahora? – cod3monk3y

10

Me gusta el modelo de Java por el siguiente motivo.Al colocar cada clase en un archivo individual, se promueve la reutilización haciendo que las clases sean más fáciles de ver al examinar el código fuente. Si tiene un grupo de clases agrupadas en un único archivo, puede que no sea obvio para otros desarrolladores que existen clases que pueden reutilizarse simplemente examinando la estructura de directorios del proyecto. Por lo tanto, si crees que tu clase puede ser reutilizada, la pondré en su propio archivo.

7

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

Puede ser 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 un 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 instrucciones de importación también parece jugar un rol: si intentas dividir demasiados bloques básicos cooperativos en archivos separados, esta "restricción"/"imperfección" del lenguaje parece obligarte a agrupar cosas, tal vez de una manera bastante sensata.

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

Cuestiones relacionadas