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.
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.
Antworten:
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.
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.
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.
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.
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.
Ich würde sagen, so viele Klassen wie möglich logisch in diese Datei zu gruppieren, ohne sie zu groß und komplex zu machen.