Question

Je suis habitué au modèle Java dans lequel vous pouvez avoir une classe publique par fichier. Python n’a pas cette restriction et je me demande quelle est la meilleure pratique pour organiser des cours.

Était-ce utile?

La solution

Un fichier Python est appelé un "module". et c’est un moyen d’organiser votre logiciel de manière à ce qu’il ait un sens. Un autre est un répertoire appelé "package".

Un module est une chose distincte qui peut avoir une ou deux douzaines de classes étroitement liées. Le truc, c’est qu’un module est quelque chose que vous importerez, et vous avez besoin que cette importation soit parfaitement compréhensible pour les personnes qui liront, géreront et développeront votre logiciel.

La règle est la suivante: un module est l'unité de réutilisation .

Vous ne pouvez pas facilement réutiliser une seule classe. Vous devriez pouvoir réutiliser un module sans difficulté. Tout ce qui se trouve dans votre bibliothèque (et tout ce que vous téléchargez et ajoutez) est un module ou un ensemble de modules.

Par exemple, vous travaillez sur quelque chose qui lit les feuilles de calcul, effectue des calculs et charge les résultats dans une base de données. À quoi voulez-vous que votre programme principal ressemble?

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 )

Pensez à l'importation comme le moyen d'organiser votre code en concepts ou en morceaux. Le nombre exact de classes dans chaque importation n'a pas d'importance. Ce qui compte, c'est l'organisation globale que vous décrivez avec vos instructions import .

Autres conseils

Puisqu'il n'y a pas de limite artificielle, cela dépend vraiment de ce qui est compréhensible. Si vous avez un groupe de classes assez courtes et simples qui sont logiquement regroupées, ajoutez-en un tas. Si vous avez de grandes classes complexes ou des classes qui n'ont pas de sens en tant que groupe, créez un fichier par classe. Ou choisissez quelque chose entre les deux. Refactor lorsque les choses changent.

J'aime le modèle Java pour la raison suivante. Le fait de placer chaque classe dans un fichier individuel facilite la réutilisation en rendant les classes plus faciles à voir lors de la navigation dans le code source. Si vous avez un groupe de classes regroupées dans un seul fichier, il ne sera peut-être pas évident pour les autres développeurs qu'il existe des classes pouvant être réutilisées simplement en parcourant la structure de répertoires du projet . Ainsi, si vous pensez que votre classe peut éventuellement être réutilisée, je la mettrais dans son propre fichier.

Cela dépend entièrement de la taille du projet, de la longueur des classes, de leur utilisation à partir d'autres fichiers, etc.

.

Par exemple, j’utilise assez souvent une série de classes pour l’abstraction de données - je peux donc avoir 4 ou 5 classes qui ne peuvent comporter qu’une ligne ( class SomeData: pass ).

Il serait stupide de scinder chacun de ces éléments en fichiers séparés - mais comme ils peuvent être utilisés à partir de fichiers différents, les placer tous dans un fichier data_model.py distinct aurait du sens. Est-ce que de mypackage.data_model importe SomeData, SomeSubData

Si vous avez une classe avec beaucoup de code, peut-être avec certaines fonctions seulement, il serait judicieux de scinder cette classe et les fonctions auxiliaires dans un fichier séparé.

Vous devez les structurer pour que vous fassiez depuis mypackage.database.schema importer MyModel et non depuis mypackage.email.errors importer MyDatabaseModel - si vous importez des éléments depuis logique, et les fichiers ne mesurent pas des dizaines de milliers de lignes, vous l’avez organisé correctement.

La documentation sur les modules Python contient des informations utiles. sur l'organisation des paquets.

Je me trouve en train de séparer les choses lorsque la gêne des fichiers me gêne et que la structure souhaitable de relations commence à émerger naturellement. Souvent, ces deux étapes semblent coïncider.

Cela peut être très gênant si vous séparez les choses trop tôt, car vous commencez à vous rendre compte qu'un ordre de structure totalement différent est nécessaire.

D'un autre côté, lorsqu'un fichier .java ou .py atteint plus de 700 lignes, je commence à m'énerver en essayant de me rappeler où "ce bit en particulier". est.

Avec la dépendance circulaire Python / Jython des instructions d’importation semble également jouer un rôle: si vous essayez de scinder un trop grand nombre de blocs de construction de base coopérants dans des fichiers séparés, cette "restriction" / "imperfection". de la langue semble vous obliger à grouper les choses, peut-être d'une manière plutôt raisonnable.

Pour ce qui est de la scission en paquets, je ne le sais pas vraiment, mais je dirais probablement que la même règle de gêne et d’émergence de la structure heureuse fonctionne à tous les niveaux de modularité.

Je dirais de mettre autant de classes que possible logiquement dans ce fichier sans le rendre trop volumineux et complexe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top