2008-09-20 4 views
217

Ich bin an das Java-Modell gewöhnt, wo Sie eine öffentliche Klasse pro Datei haben können. Python hat diese Einschränkung nicht, und ich frage mich, was am besten für das Organisieren von Klassen ist.Wie viele Klassen sollte ich in eine Datei schreiben?

+5

Ich denke, das ist eine vernünftige * Frage * angesichts der Anforderungen und Konventionen anderer Sprachen, und die * Antwort * ist " und darüber hinaus ist es eine Frage der Präferenz (/ Meinung)" - * diese Antwort * ist selbst keine Meinung – d3vid

Antwort

268

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

Ein Modul ist eine eindeutige Sache, die eine oder zwei Dutzend eng verwandte Klassen haben kann. Der Trick besteht darin, dass ein Modul importiert wird, und Sie müssen diesen Import für Personen, die Ihre Software lesen, pflegen und erweitern, vollkommen sinnvoll finden.

Die Regel ist dies: ein Modul ist die Einheit der Wiederverwendung.

Sie können nicht einfach eine einzelne Klasse 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.

Zum Beispiel arbeiten Sie an etwas, das Tabellen liest, Berechnungen durchführt und die Ergebnisse in eine Datenbank lädt. Wie soll dein 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) 

Denken Sie an den Import als die Möglichkeit, Ihren Code in Konzepten oder Chunks zu organisieren. Genau wie viele Klassen in jedem Import sind, spielt keine Rolle. Was zählt, ist die gesamte Organisation, die Sie mit Ihren import Aussagen darstellen.

+16

Haha, ich mag den "Sinn" in Zitaten. – cdleary

+21

@cdleary: Der Sinn einer Person ist der Wahnsinn einer anderen Person. In der Regel können Sie sinnvolle Module definieren. In einer großen Anwendung gibt es jedoch immer mehrere Dimensionen der Analyse, und eine Person teilt sich die Haare beim Schneiden und Trennen der Funktionalität einer anderen Person. –

+4

Die obigen Empfehlungen stimmen mit http://docs.python-guide.org/en/latest/writing/structure/ –

5

Ich würde sagen, so viele Klassen wie logisch in dieser Datei gruppiert werden, ohne es zu groß und komplex zu machen.

35

Da es keine künstliche Grenze gibt, kommt es darauf an, was verständlich ist. Wenn Sie eine Menge ziemlich kurzer, einfacher Klassen haben, die logisch zusammen gruppiert sind, werfen Sie eine Menge davon ein. 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.

13

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

Zum Beispiel verwende ich oft eine Reihe von Klassen für die Datenabstraktion - also kann ich 4 oder 5 Klassen haben, die nur 1 Zeile lang sein können (class SomeData: pass).

Es wäre dumm, jede davon in separate Dateien aufteilen - aber da sie aus verschiedenen Dateien verwendet werden können, alle diese in einem separaten data_model.py Datei setzen würde Sinn machen, so kann ich from mypackage.data_model import SomeData, SomeSubData

Wenn Sie das tun habe eine Klasse mit viel Code drin, vielleicht mit einigen Funktionen, die es nur benutzt, wäre es eine gute Idee, diese Klasse und die Hilfsfunktionen in eine separate Datei aufzuteilen.

Sie sollten sie so strukturieren, dass Sie tun from mypackage.database.schema import MyModel, nicht from mypackage.email.errors import MyDatabaseModel - wenn wo Sie Dinge aus sinnvoll importieren, und die Dateien sind nicht Zehntausende von Zeilen lang, Sie haben es richtig organisiert.

Die Python Modules documentation enthält einige nützliche Informationen zum Organisieren von Paketen.

+0

defekten Link zu Python Modules Dokumentation überein. Vielleicht ist [Abschnitt 6.4 Module.Packages] (http://docs.python.org/2/tutorial/modules.html#packages) der beabsichtigte Link jetzt? – cod3monk3y

10

Ich mag das Java-Modell aus dem folgenden Grund.Wenn Sie jede Klasse in eine einzelne Datei einfügen, wird die Wiederverwendung gefördert, da Klassen beim Durchsuchen des Quellcodes leichter zu erkennen sind. Wenn Sie eine Gruppe von Klassen in einer einzigen Datei gruppieren, ist es für andere Entwickler möglicherweise nicht offensichtlich, dass dort Klassen vorhanden sind, die wiederverwendet werden können, indem einfach die Verzeichnisstruktur des Projekts durchsucht wird. Wenn Sie also meinen, dass Ihre Klasse möglicherweise wiederverwendet werden kann, würde ich sie in eine eigene Datei schreiben.

7

Ich splittere Dinge auf, wenn ich mich über die Größe von Dateien ärgere und wenn die wünschenswerte Struktur der Verbundenheit auf natürliche Weise entsteht. Oft scheinen diese beiden Phasen zusammenzufallen.

Es kann sehr ärgerlich sein, wenn man Dinge zu früh aufteilt, weil man anfängt zu erkennen, dass eine völlig andere Ordnung der Struktur erforderlich ist.

Auf der anderen Seite, wenn eine .java oder .py-Datei zu mehr als etwa 700 Zeilen zu bekommen beginnt ich genervt ständig versuchen zu erinnern, wo "das bestimmte Bit" ist. Auch bei Python/Jython scheint die zirkuläre Abhängigkeit von Importanweisungen eine Rolle zu spielen: Wenn man versucht, zu viele zusammenarbeitende Grundbausteine ​​in separate Dateien aufzuteilen, scheint diese "Einschränkung"/"Unvollkommenheit" der Sprache zu zwingen Gruppendinge, vielleicht in einer vernünftigen Art und Weise.

Zum Teilen in Pakete, weiß ich nicht wirklich, aber ich würde sagen, wahrscheinlich die gleiche Regel der Belästigung und Entstehung der glücklichen Struktur funktioniert auf allen Ebenen der Modularität.

Verwandte Themen