2009-04-09 5 views
4

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.

+0

Pour être clair, est-ce que foo.options définit db_path comme un singleton? –

Répondre

2

Oui, il y en a d'autres. Votre option 3 est très Pythonic.

Utilisez un module standard de Python pour encapsuler les options (ce sont les cadres web Django façon comme le font)

Utilisez une usine pour émettre des sessions correctement configurées.

Puisque SQLite a déjà une "connexion", pourquoi ne pas l'utiliser? Qu'est-ce que votre classe DatabaseSession ajoute que la connexion intégrée manque?

+0

Merci pour votre commentaire. J'ai utilisé le terme "session de base de données" pour simplifier l'exemple; en réalité, c'est plus comme une usine d'objets qui obtient ses plans de la base de données. –