probablement une question très commune, mais n'a pas pu trouver réponse appropriée encore ..paramètres d'application de multiplication
j'ai un (Python w/modules C +) application qui fait un usage intensif d'une base de données SQLite et son chemin se fourni par l'utilisateur au démarrage de l'application.
Chaque fois qu'une partie de l'application a besoin d'accéder à la base de données, je prévois d'acquérir une nouvelle session et de la rejeter une fois terminée. Pour que cela se produise, j'ai évidemment besoin d'accéder au chemin fourni au démarrage. Couple de façons que je vois qu'il se passe:
1. arguments explicites
Le chemin de la base de données est passé partout où elle doit être par le biais d'un paramètre explicite et une session de base de données est instancié avec ce chemin d'accès explicite. C'est peut-être le plus modulaire, mais semble être incroyablement maladroit.
2. Chemin de la base singleton
L'objet de la session de base de données ressemblerait à ceci:
import foo.options
class DatabaseSession(object):
def __init__(self, path=foo.options.db_path):
...
Je considère cela comme le singleton moins-mal, puisque nous ne stockant que les chaînes constantes, qui ne changent pas pendant l'exécution de l'application. Cela permet de remplacer la valeur par défaut et de tester la classe DatabaseSession
si nécessaire.
3. Chemin de la base singleton + méthode statique usine
amélioration Peut-être légèrement au-dessus de ce qui précède:
def make_session(path=None):
import foo.options
if path is None:
path = foo.options.db_path
return DatabaseSession(path)
class DatabaseSession(object):
def __init__(self, path):
...
De cette façon, le module ne dépend pas foo.options
du tout, à moins que nous sommes en utilisant la méthode d'usine. En outre, la méthode peut effectuer des tâches comme la mise en cache de session ou autres.
Et puis il y a d'autres modèles, que je ne connais pas. J'ai vaguement vu quelque chose de similaire dans les frameworks web, mais je n'ai aucune expérience avec ceux-ci. Mon exemple est assez spécifique, mais j'imagine qu'il s'étend également à d'autres paramètres d'application, d'où le titre de la publication.
Je voudrais savoir ce que vous pensez de la meilleure façon d'organiser cela.
Pour être clair, est-ce que foo.options définit db_path comme un singleton? –