Namen für eine Klasse, die Daten lädt...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

Ich habe eine Klasse, die bislang "DataLoader" heißt und jetzt mal erweitert wird. Früher war das eine Funktion, jetzt wurde das eine Klasse, weil die eine größere Zahl von Funktionen bündeln wird (u. a. check(), verschiedene Export-Funktionen und später auch noch einige weitere Import-Funktionen). Hauptaufgabe ist das Laden und Bereitstellen eines Datensatzes, der dann an andere Programme weitergegeben wird.

Meine Frage ist DataLoader ein sinnvoller Name für die Klasse, mir kommt das irgendwie hölzern vor!? Würdet ihr das Kind Dataset oder DataSet nennen, ich könnte dann als Methoden
* import
* export
* __check
beigeben!? Da die Klasse jetzt schon in einigen Programmen gebraucht wird und zukünftig häufiger vorkommt, möchte ich die Namensgebung möglichst gut machen. Ältere Programme werden weiterhin die ältere Software nutzen, neuere Programme möchte ich gerne mit der neuen Klasse versehen.
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

Zusätzliche Frage: Ich habe für Spezialaufgaben spezielle Software, die auch nur in je einem konkreten Fall gebraucht wird. Ich habe jetzt beim Modul requests gelesen, dass dieses Modul unter der Haube urllib3 verwendet und d. h. - ohne mich durch den Quelltext zu lesen - wohl eine elegantere Form des Zugriffs in einem Programm ermöglicht.
powered by urllib3, which is embedded within Requests
Würdet ihr möglichst viele Funktionen in einer Klasse selbst unterbringen oder die Klasse ermächtigen über andere Klassen diese Funktionalität bereitstellen oder lieber getrennte Klassen für getrennte Aufgaben nutzen.

Konkret: Ich habe für eine Datenquelle eine Klasse, die nur diese Datenquelle händelt und lokal speichert. Eine weitere Klasse kann die gespeicherten Daten aufrufen, umwandeln und weiterreichen an andere Programme. Prinzipiell ist die Zahl der unterschiedlichen Datenquellen und unterschiedlichen Datenformate überschaubar, aber eben nicht nur ein oder zwei.

Eine große Klasse, die mit all diesen Datenquellen direkt umgehen kann oder eine Klasse, die unter der Haube verschiedene Klassen jeweils für eine Datenquelle nutzt oder direkt viele verschiedene Klassen!?
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wieso nicht einfach nur "Loader"? Das ist kürzer und sagt in etwa genau soviel aus wie "DataLoader".

Oder kannst du konkret benennen, welche Art von Daten geladen werden?
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Zu der anderen Frage: Das könnte man über eine API lösen, die für alle Loader die gleichen Methoden bereitstellt. Die spezifischen Loader für konkrete Datentypen würden diese Methoden dann implementieren und die Schnittstelle ggf durch weitere Methoden erweitern. Damit hättest du dann eine garantierte Mindestmenge an bestimmten Methoden, die jeder Loader unterstützen muss. Damit könnte man von "außerhalb" einen Loader verwenden, ohne wissen zu müssen, um welchen konkreten Loader es sich handelt, weil man dann eben nur die allgemeine API des Loaders verwendet. So könnte etwas wie `get_loader()` automatisch den passenden Loader für was-auch-immer ermitteln und er wäre verwendbar, ohne seine konkrete Ausprägung zu kennen. Dieses Prinzip wird z.B. oft in der Java-Welt angewendet. Ob es für dich Sinn macht, musst du anhand deines Problems natürlich selbst beurteilen.
BlackJack

@pixewakb: Du schreibst die Klasse bündelt Funktionen — haben die auch einen gemeinsamen Zustand? Das klingt mir verdächtig nach Klassenmissbrauch wenn Lade- und Speicherfunktionen und dann auch noch für verschiedene Datenquellen/-formate in eine Klasse gesteckt werden. Oder anders gefragt: Was hindert dich daran die alle als Funktionen in einem Modul zu haben?
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

Mit dem Begriff gemeinsamen Zustand fange ich nichts an.

Alle Datensets aus den verschiedenen Quellen sind hier relativ gleich aufgebaut und bieten weitgehend gleiche Daten.

Gegen Funktionen spricht für mich, dass mir das in der Handhabung bislang zu kompliziert erscheint. Die Klasse - ich tendiere zum Namen "Dataset" - lädt Daten und speichert sie und soll einen erleichterten Zugriff auf die Daten bieten. U. a. möchte bzw. muss ich auch über die Daten iterieren können, um damit Berechnungen durchführen zu können. Auch Abfragen sind erforderlich, d. h. ich möchte aus dem Datensatz Daten zwischen einem Start- und Enddatum bekommen bzw. möchte dann direkt damit rechnen. In einigen Fällen muss ich die Daten konvertieren und in ein anderes Format bringen und auch das möchte ich in der Klasse kapseln.

Ich habe für mich jetzt einige Skripte, die meine eigentliche Arbeit erledigen, d. h. Daten laden, in einer Schleife darauf zugreifen und damit arbeiten. Ich sehe dort durch die Klasse die Chance, dass es für mich in diesen Skripten deutlich übersichtlicher wird, wenn ich z. B. direkt über die Klasse iterieren kann und nicht erst Daten an eine Variable binden und dann darüber iteriere.

Teilweise arbeite ich im Rahmen der Exploration in der Shell mit der Klasse, wenn ich dann eine Klasse habe, die das Dataset lädt und ich direkt in der Shell über Methoden der Klasse arbeite, halte ich das für sehr schnell und einfach. Ich müsste ansonsten erst einmal eine größere Zahl von Funktionen einzeln importieren und die Daten in Variablen separat bereithalten, die Lösung mittels Klasse erscheint mir da komfortabler.
BlackJack

@pixewakb: Der Zustand wird durch die Daten beschrieben die in der Klasse mit den Funktionen zusammengefasst ist die darauf operieren. Und die Daten und Methoden sollten auch inhaltlich zusammengehören, also so dass man nicht einen Teil der Daten und Methoden in eine andere Klasse verschieben könnte ohne das am verbliebenen Rest etwas nicht mehr funktioniert. Denn dann hätte man zwei verschiedene Klassen in einer zusammengeworfen.

Mir scheint Du vermischt dort zwei bis drei Dinge: Den eigentlichen Datensatz mit Operationen wie iterieren über alles oder Teilbereiche und das laden und speichern in verschiedenen Formaten.

Das mit der zusätzlichen Variable habe ich nicht verstanden. Ob man nun eine Funktion aufruft und über deren Ergebnis direkt iteriert statt es an einen Namen zu binden, oder ob man ein Exemplar aus einer Klasse erstellt (in dem man die Klasse aufruft) und dann über dieses Objekt iteriert ohne es an einen Namen zu binden, ist doch von der Handhabung das gleiche?

Du musst auch nicht Funktionen einzeln importieren, Du kannst auch einfach das Modul importieren und hast dort die Funktionen als Attribute so wie Du sie auf einem Exemplar Deiner Klasse als Attribute hättest.

Man kann lade- und speichermethoden zwar auch auf dem Typ bereitstellen der da geladen oder gespeichert werden soll, aber spätenstens wenn man das für mehr als zwei Formate macht, sollte man das IMHO aus der Klasse herausnehmen, sonst hat man am Ende eine „god class“ die einfach zu viel weiss und macht und schlecht wart- und erweiterbar ist.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Du fängst im Titel zu sagen die Klasse lädt Daten, es geht weiter mit Validierung, Export und inzwischen repräsentiert die Klasse die Daten selbst auch noch und dient zur Verarbeitung. Mit jedem deiner Beträge bekommt die Klasse mehr Features, der Name wird abstrakter und das gelöste Problem schwammiger. Kannst du überhaupt selbst noch in einem kurzen Satz konkret sagen was die Klasse macht, welches Problem - singular - sie löst?
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

In einem Satz: Die Klasse lädt Daten (aus dem Netz oder von der Festplatte) und stellt sie in Programmen so zur Verfügung, dass darüber leicht iteriert werden kann. Sie repräsentiert in meinen Skripten dann den geladenen Datensatz.

Da ich nicht jedes Mal Jupyter anschmeißen und mir den Datensatz plotten möchte, soll sie mittels einer Methode in der Lage sein, offensichtliche Fehler zu erkennen und 1, 2 Export-Funktionen mitbringen, so dass ich den Datensatz leicht speichern kann.
Antworten