Wie viele Klassen sollte ich in eine Datei einfügen? [geschlossen]

274

Ich bin an das Java-Modell gewöhnt, bei dem Sie eine öffentliche Klasse pro Datei haben können. Python hat diese Einschränkung nicht und ich frage mich, was die beste Vorgehensweise für die Organisation von Klassen ist.

Brianegge
quelle
8
Ich denke, dies ist eine vernünftige Frage angesichts der Anforderungen und Konventionen anderer Sprachen, und die Antwort lautet "<Python-Module und -Pakete definieren> und darüber hinaus ist es eine Frage der Präferenz (/ Meinung)" - diese Antwort ist selbst keine Meinung
David.Libremone

Antworten:

333

Eine Python-Datei wird als "Modul" bezeichnet und ist eine Möglichkeit, Ihre Software so zu organisieren, dass sie "sinnvoll" ist. Ein anderes ist ein Verzeichnis, das als "Paket" bezeichnet wird.

Ein Modul ist eine eigenständige Sache, die ein oder zwei Dutzend eng verwandte Klassen haben kann. Der Trick besteht darin, dass Sie ein Modul importieren und dass dieser Import für Personen, die Ihre Software lesen, warten und erweitern, absolut sinnvoll ist.

Die Regel lautet: Ein Modul ist die Einheit der Wiederverwendung .

Sie können eine einzelne Klasse nicht einfach wiederverwenden. Sie sollten ein Modul problemlos wiederverwenden können. Alles in Ihrer Bibliothek (und alles, was Sie herunterladen und hinzufügen) ist entweder ein Modul oder ein Paket von Modulen.

Sie arbeiten beispielsweise an etwas, das Tabellen liest, einige Berechnungen durchführt und die Ergebnisse in eine Datenbank lädt. Wie soll Ihr Hauptprogramm aussehen?

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 )

Stellen Sie sich den Import als die Möglichkeit vor, Ihren Code in Konzepten oder Blöcken zu organisieren. Es spielt keine Rolle, wie viele Klassen in jedem Import enthalten sind. Was zählt, ist die Gesamtorganisation, die Sie mit Ihren importAussagen darstellen.

S.Lott
quelle
24
Haha, ich mag den "Sinn" in Zitaten.
CDLeary
27
@cdleary: Der Sinn einer Person ist der Wahnsinn einer anderen Person. Normalerweise können Sie sinnvolle Module definieren. In einer großen Anwendung gibt es jedoch immer mehrere Analysedimensionen, und eine Person spaltet die Haare beim Schneiden und Würfeln der Funktionalität einer anderen Person.
S.Lott
4
Die obigen
Mayank Jaiswal
4
Die Antwort, die die Frage nicht wirklich beantwortet, was ist mit der Lesbarkeit? Es ist schwierig, Dateien mit mehr als 500 Zeilen zu lesen.
Vedmant
38

Da es keine künstliche Grenze gibt, kommt es wirklich darauf an, was verständlich ist. Wenn Sie eine Reihe ziemlich kurzer, einfacher Klassen haben, die logisch zusammengefasst sind, werfen Sie eine Reihe von Klassen hinein. Wenn Sie große, komplexe Klassen oder Klassen haben, die als Gruppe keinen Sinn ergeben, gehen Sie eine Datei pro Klasse. Oder wählen Sie etwas dazwischen. Refactor, wenn sich die Dinge ändern.

Chris Upchurch
quelle
23

Ich mag das Java-Modell aus folgendem Grund. Das Platzieren jeder Klasse in einer einzelnen Datei fördert die Wiederverwendung, indem Klassen beim Durchsuchen des Quellcodes besser sichtbar sind. Wenn Sie eine Reihe von Klassen in einer einzigen Datei zusammengefasst haben, ist es für andere Entwickler möglicherweise nicht offensichtlich, dass es dort Klassen gibt, die einfach durch Durchsuchen der Verzeichnisstruktur des Projekts wiederverwendet werden können . Wenn Sie also der Meinung sind, dass Ihre Klasse möglicherweise wiederverwendet werden kann, würde ich sie in eine eigene Datei einfügen.

Raffi Khatchadourian
quelle
2
Ich stimme dir vollkommen zu. Mehrere öffentliche Klassen in einer einzigen Datei zu haben, ist kontraintuitiv und macht es schwierig, Code zu verstehen, so wie jemand die Struktur verbergen möchte und das Gefühl hat, nervös zu werden. Vor allem, wenn Sie von Java nach Python kommen.
WebComer
Vor allem, wenn Sie von Java nach Python kommen. Sie haben viele Klassen in einer Datei in Python
geworfen
14

Es hängt ganz davon ab, wie groß das Projekt ist, wie lange die Klassen sind, ob sie aus anderen Dateien verwendet werden und so weiter.

Zum Beispiel verwende ich ziemlich oft eine Reihe von Klassen für die Datenabstraktion - daher habe ich möglicherweise 4 oder 5 Klassen, die möglicherweise nur 1 Zeile lang sind (class SomeData: pass ).

Es wäre dumm, jede dieser Dateien in separate Dateien aufzuteilen - aber da sie möglicherweise aus verschiedenen Dateien verwendet werden, data_model.pywäre es sinnvoll, alle diese Dateien in einer separaten Datei abzulegen, damit ich das tun kannfrom mypackage.data_model import SomeData, SomeSubData

Wenn Sie eine Klasse mit viel Code haben, möglicherweise mit einigen Funktionen, die nur verwendet werden, ist es eine gute Idee, diese Klasse und die Hilfsfunktionen in eine separate Datei aufzuteilen.

Sie sollten sie so strukturieren, dass Sie es from mypackage.database.schema import MyModelnicht tunfrom mypackage.email.errors import MyDatabaseModel - wenn es Sinn macht, Dinge zu importieren, von denen Sie importieren, und die Dateien nicht zehntausende Zeilen lang sind, haben Sie sie richtig organisiert.

Die Dokumentation zu Python-Modulen enthält einige nützliche Informationen zum Organisieren von Paketen.

dbr
quelle
1
defekter Link zur Dokumentation zu Python Modules. Vielleicht ist Abschnitt 6.4 Module.Packages jetzt der beabsichtigte Link?
cod3monk3y
9

Ich finde mich dabei, Dinge aufzuteilen, wenn ich mich über die Größe der Dateien ärgere und wenn die erwünschte Struktur der Verwandtschaft auf natürliche Weise entsteht. Oft scheinen diese beiden Phasen zusammenzufallen.

Es kann sehr ärgerlich sein, wenn Sie die Dinge zu früh aufteilen, weil Sie feststellen, dass eine völlig andere Reihenfolge der Struktur erforderlich ist.

Wenn andererseits eine .java- oder .py-Datei mehr als 700 Zeilen umfasst, ärgere ich mich ständig darüber, wo "dieses bestimmte Bit" ist.

Bei Python / Jython scheint auch die zirkuläre Abhängigkeit von Importanweisungen eine Rolle zu spielen: Wenn Sie versuchen, zu viele kooperierende Grundbausteine ​​in separate Dateien aufzuteilen, scheint diese "Einschränkung" / "Unvollkommenheit" der Sprache Sie möglicherweise zu zwingen, Dinge zu gruppieren eher vernünftig.

Was die Aufteilung in Pakete angeht, weiß ich nicht wirklich, aber ich würde sagen, dass wahrscheinlich die gleiche Regel des Ärgers und der Entstehung einer glücklichen Struktur auf allen Ebenen der Modularität funktioniert.

Mike Nagetier
quelle
6

Ich würde sagen, so viele Klassen wie möglich logisch in diese Datei zu gruppieren, ohne sie zu groß und komplex zu machen.

Jason Baker
quelle