Möglichkeiten, auf Programmeinstellungen zuzugreifen...

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
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

midan23 hat geschrieben:
Die interessante Frage wäre:

Ist für ein zentrale Programmkonfiguration ein Singleton/Borg vertretbar oder sollte man sich nach einer anderen Lösung (wie zB die Konfiguration beim Anlegen neuer Objekte mit auf den Weg geben) umsehen ?
Im Grunde mußt du zur Beantwortung dieser Frage eine Kosten-Nutzen-Rechnung anstellen. Das per Singleton / Klassenvariablen / globalen Variablen zu lösen, ist zunächst einmal mit vergleichsweise wenig Aufwand verbunden. Der Preis dafür kommt in zweierlei Gestalt:

1) Die Nachvollziehbarkeit des Programmflusses leidet, weil hier Informationen an den eigentlichen Schnittstellen vorbeifließen.

2) Vor allem aber handelst du dir unter Umständen Probleme mit Nebeneffekten ein: Gerade wenn Nebenläufigkeit ins Spiel kommt (z.B. durch GUIs) kann es passieren, daß sich der Inhalt einer Konfigurationsoption ändert, ohne daß eine Funktion, die diese Optionen verwendet, etwas davon mitbekommt. Du müßtest also Locks / Semaphoren implementieren, und da wirds dann schon wieder reichlich kompliziert. Oder halt den Schreibzugriff untersagen. Ganz häßlich wirds beim (automatisierten) Testen: Du mußt vor jedem einzelnen Test sicherstellen, daß die Konfiguration genau die Werte enthält, von denen du ausgehst. Vergisst du das, und es gibt auch nur einen anderen Test, der an der Konfiguration etwas verändert, mußt du dich auf sehr seltsame Effekte einstellen. Dazu gehören Tests, die scheinbar völlig irrational mal durchlaufen und mal fehlschlagen, obwohl du am Code nichts veränderst.

Ich würde sagen: Für Code, der nur mal schnell hingeworfen wird, nicht kritisch (im Sinne von finanziellen, gesundheitlichen oder sonstigen Schäden) ist und den du nicht aus den Händen gibst, mag ein Singleton in Ordnung sein. Weil du als Urheber wissen solltest, wo die Gefahren lauern. Für alles andere solltest du den etwas "umständlicheren" aber solideren Weg einschlagen und Abhängigkeiten ausschließlich als Parameter übergeben.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

mutetella hat geschrieben:
/me hat geschrieben:Dann pack einfach die Daten in ein spezielles, nur dafür vorgesehenes, Modul und importiere das überall wo du es brauchst.
Das hatte ich auch schon gemacht, allerdings müssen dann pro import die Daten neu eingelesen werden.
Warum? Der im Modul enthaltende Code wird doch nicht bei jedem Import neu ausgeführt.

Ein Modul wirkt unter Python quasi wie ein Singleton.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Pekh hat geschrieben:In diesem konkreten Fall solltest du dir noch mal überlegen, ob 'Item' nicht Aufgaben wahrnimmt, die in der übergeordneten Klasse 'View' besser aufgehoben wären.
Zuerst hatte ich das auch. Eine View(), die das macht, was sie soll: Eine vorher festgelegte Kalenderansicht zeichnen. Dann begann ich damit, bereits gezeichnete Ansichten zu cachen, damit einmal berechnete Koordinaten während der Navigation nicht ständig neu berechnet werden müssen. Irgendwann stand ich dann vor der Notwendigkeit, nur einzelne Tage (Items) innerhalb der Kalenderansicht neu zu zeichnen bzw. aus den eventuell im Cache vorhandenen Koordinaten abzubilden. Das alles wurde dann für mein nicht allzu leistungsfähiges Gehirn zu komplex. Deshalb begann ich, die eigentliche Kalenderansicht von den darin enthaltenen Items zu trennen.
Aber Du hast wohl Recht: Die Trennung erfolgte nur, weil die Programmstruktur schlecht gestaltet und deshalb kaum noch beherrschbar war. Ein schlechter Grund, muss ich zugeben. Ich werde darüber nachdenken, wieder zusammenzufügen, was zusammen gehört.
/me hat geschrieben:Warum? Der im Modul enthaltende Code wird doch nicht bei jedem Import neu ausgeführt.
Stimmt. Da hab' ich schneller widersprochen als überlegt... :wink:


Zum jetzigen Zeitpunkt werde ich erst einmal Pekh's Rat folgen, die Programmstruktur entschlacken und das Konfigurations-dict oder Teile daraus per Parameter weiterreichen. Gehört ja schließlich zu den Kernaufgaben der Parameterübergabe...

Vielen Dank für Eure Beiträge. Neben meiner eigentlichen Frage habe ich wieder mal viel von Euch lernen können. Das ist total Klasse!!!

Gruß
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten