Combien de classes dois-je mettre dans un fichier? [fermé]
274
Je suis habitué au modèle Java où 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.
Je pense que c'est une question raisonnable étant donné les exigences et les conventions d'autres langages, et la réponse est "<définir les modules et packages Python> et au-delà c'est une question de préférence (/ opinion)" - cette réponse n'est pas en soi une opinion
david.libremone
Réponses:
333
Un fichier Python est appelé un "module" et c'est une façon d'organiser votre logiciel pour qu'il ait du "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. L'astuce est qu'un module est quelque chose que vous importerez, et vous avez besoin que cette importation soit parfaitement sensible aux personnes qui liront, maintiendront et étendront 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 aucune difficulté. Tout dans votre bibliothèque (et tout ce que vous téléchargez et ajoutez) est soit un module, soit un ensemble de modules.
Par exemple, vous travaillez sur quelque chose qui lit des feuilles de calcul, fait des calculs et charge les résultats dans une base de données. À quoi voulez-vous que votre programme principal ressemble?
Considérez 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 importe, c'est l'organisation globale que vous représentez avec vos importdéclarations.
@cdleary: Le sens d'une personne est la folie d'une autre personne. Habituellement, vous pouvez définir des modules sensibles. Dans une grande application, cependant, il y a toujours plusieurs dimensions d'analyse et une personne divisera les cheveux sur le tranchage et le découpage des fonctionnalités d'une autre personne.
La réponse qui ne répond pas réellement à la question, qu'en est-il de la lisibilité, il est difficile de lire des fichiers contenant plus de 500 lignes.
Vedmant
38
Puisqu'il n'y a pas de limite artificielle, cela dépend vraiment de ce qui est compréhensible. Si vous avez un tas de classes simples assez courtes qui sont logiquement regroupées, jetez-en un tas. Si vous avez de grandes classes complexes ou des classes qui n'ont pas de sens en tant que groupe, choisissez un fichier par classe. Ou choisissez quelque chose entre les deux. Refactorisez à mesure que les choses changent.
Il se trouve que j'aime le modèle Java pour la raison suivante. Placer chaque classe dans un fichier individuel favorise 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 peut ne pas être évident pour d'autres développeurs qu'il existe des classes qui peuvent ê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.
Je suis totalement d'accord avec vous. Avoir plusieurs classes publiques dans un seul fichier est contre-intuitif et rend le code difficile à saisir, comme quelqu'un veut cacher la structure et a le sentiment d'être rendu délicat. Surtout si vous venez de Java vers Python.
WebComer
Surtout si vous venez de Java vers Python. Ils
lançaient de
14
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 des données - je peux donc avoir 4 ou 5 classes qui ne peuvent avoir qu'une ligne ( class SomeData: pass).
Ce serait stupide de diviser chacun de ces fichiers en fichiers séparés - mais comme ils peuvent être utilisés à partir de fichiers différents, il data_model.pyserait logique de les mettre tous dans un fichier séparé , donc je peux le fairefrom mypackage.data_model import SomeData, SomeSubData
Si vous avez une classe avec beaucoup de code, peut-être avec certaines fonctions seulement qu'elle utilise, ce serait une bonne idée de diviser cette classe et les fonctions d'assistance dans un fichier séparé.
Vous devez les structurer de manière à ce que vous ne le fassiez from mypackage.database.schema import MyModelpas from mypackage.email.errors import MyDatabaseModel- si l'endroit où vous importez des choses a du sens et que les fichiers ne font pas des dizaines de milliers de lignes, vous les avez organisés correctement.
lien cassé vers la documentation des modules Python. Peut-être que la section 6.4 Modules.Packages est le lien prévu maintenant?
cod3monk3y
9
Je me retrouve à diviser les choses lorsque je suis ennuyé par la taille des fichiers et lorsque la structure souhaitable de la parenté commence à émerger naturellement. Souvent, ces deux étapes semblent coïncider.
Cela peut être très ennuyeux si vous divisez les choses trop tôt, car vous commencez à réaliser 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 environ, je commence à m'énerver constamment en essayant de me rappeler où se trouve "ce bit particulier".
Avec Python / Jython, la dépendance circulaire des instructions d'importation semble également jouer un rôle: si vous essayez de diviser un trop grand nombre de blocs de construction de base coopérants en fichiers séparés, cette "restriction" / "imperfection" du langage semble vous obliger à regrouper les choses, peut-être d'une manière plutôt sensée.
En ce qui concerne la division en packages, je ne sais pas vraiment, mais je dirais probablement que la même règle d'agacement et d'émergence d'une structure heureuse fonctionne à tous les niveaux de modularité.
Réponses:
Un fichier Python est appelé un "module" et c'est une façon d'organiser votre logiciel pour qu'il ait du "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. L'astuce est qu'un module est quelque chose que vous importerez, et vous avez besoin que cette importation soit parfaitement sensible aux personnes qui liront, maintiendront et étendront 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 aucune difficulté. Tout dans votre bibliothèque (et tout ce que vous téléchargez et ajoutez) est soit un module, soit un ensemble de modules.
Par exemple, vous travaillez sur quelque chose qui lit des feuilles de calcul, fait des calculs et charge les résultats dans une base de données. À quoi voulez-vous que votre programme principal ressemble?
Considérez 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 importe, c'est l'organisation globale que vous représentez avec vos
import
déclarations.la source
Puisqu'il n'y a pas de limite artificielle, cela dépend vraiment de ce qui est compréhensible. Si vous avez un tas de classes simples assez courtes qui sont logiquement regroupées, jetez-en un tas. Si vous avez de grandes classes complexes ou des classes qui n'ont pas de sens en tant que groupe, choisissez un fichier par classe. Ou choisissez quelque chose entre les deux. Refactorisez à mesure que les choses changent.
la source
Il se trouve que j'aime le modèle Java pour la raison suivante. Placer chaque classe dans un fichier individuel favorise 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 peut ne pas être évident pour d'autres développeurs qu'il existe des classes qui peuvent ê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.
la source
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 des données - je peux donc avoir 4 ou 5 classes qui ne peuvent avoir qu'une ligne (
class SomeData: pass
).Ce serait stupide de diviser chacun de ces fichiers en fichiers séparés - mais comme ils peuvent être utilisés à partir de fichiers différents, il
data_model.py
serait logique de les mettre tous dans un fichier séparé , donc je peux le fairefrom mypackage.data_model import SomeData, SomeSubData
Si vous avez une classe avec beaucoup de code, peut-être avec certaines fonctions seulement qu'elle utilise, ce serait une bonne idée de diviser cette classe et les fonctions d'assistance dans un fichier séparé.
Vous devez les structurer de manière à ce que vous ne le fassiez
from mypackage.database.schema import MyModel
pasfrom mypackage.email.errors import MyDatabaseModel
- si l'endroit où vous importez des choses a du sens et que les fichiers ne font pas des dizaines de milliers de lignes, vous les avez organisés correctement.La documentation des modules Python contient des informations utiles sur l'organisation des packages.
la source
Je me retrouve à diviser les choses lorsque je suis ennuyé par la taille des fichiers et lorsque la structure souhaitable de la parenté commence à émerger naturellement. Souvent, ces deux étapes semblent coïncider.
Cela peut être très ennuyeux si vous divisez les choses trop tôt, car vous commencez à réaliser 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 environ, je commence à m'énerver constamment en essayant de me rappeler où se trouve "ce bit particulier".
Avec Python / Jython, la dépendance circulaire des instructions d'importation semble également jouer un rôle: si vous essayez de diviser un trop grand nombre de blocs de construction de base coopérants en fichiers séparés, cette "restriction" / "imperfection" du langage semble vous obliger à regrouper les choses, peut-être d'une manière plutôt sensée.
En ce qui concerne la division en packages, je ne sais pas vraiment, mais je dirais probablement que la même règle d'agacement et d'émergence d'une structure heureuse fonctionne à tous les niveaux de modularité.
la source
Je dirais de mettre autant de classes qu'il est possible de les regrouper logiquement dans ce fichier sans le rendre trop gros et complexe.
la source