2009-04-09 35 views
4

可能是一個非常普遍的問題,但找不到合適的答案了..傳播應用程序設置

我有一個(Python的W/C++模塊)的應用,使大量使用SQLite數據庫和它的路徑被供應由用戶在應用程序啓動時進行。

每次應用程序的某些部分需要訪問數據庫時,我計劃獲取一個新的會話並在完成時放棄它。要做到這一點,我顯然需要訪問啓動時提供的路徑。

1.明確論點

數據庫路徑傳遞到處它需要通過一個明確的參數和數據庫會話實例化與明確的路徑:的,我看到它發生的方式夫婦。這也許是最模塊化的,但似乎令人難以置信的尷尬。

2.數據庫路徑單

數據庫會話對象將是這樣的:

import foo.options 
class DatabaseSession(object): 
    def __init__(self, path=foo.options.db_path): 
     ... 

我認爲這是較小的惡單,因爲我們只存儲常量字符串,在應用程序運行時期間不會更改。這樣可以覆蓋默認值,並且如果需要,可以測試DatabaseSession類。

3.數據庫路徑單+靜態工廠方法

在上面也許略有改善:

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): 
     ... 

這樣的模塊不依賴於foo.options可言,除非我們使用工廠方法。此外,該方法可以執行像會話緩存或什麼的東西。

然後還有其他模式,我不知道。我在Web框架中隱約看到了類似的東西,但我對這些東西沒有任何經驗。我的例子非常具體,但我想它也擴展到其他應用程序設置,因此文章的標題。

我想聽聽你的想法,最好的安排方式是什麼。

+0

只是要清楚,foo.options是否將db_path定義爲單例? – 2011-03-01 20:14:57

回答

2

是的,還有其他的。你的選項3雖然是Pythonic。

使用標準的Python模塊封裝選項(這就像Django的方式web框架做)

使用工廠發出正確配置會話。

由於SQLite已經有一個「連接」,爲什麼不使用它呢?你的DatabaseSession類增加了內置連接的缺點嗎?

+0

感謝您的評論。我使用術語「數據庫會話」來簡化示例;在現實中,它更像是一個從數據庫中獲取藍圖的對象工廠。 – 2009-04-09 20:45:35