2008-10-07 59 views
1

我正在爲我的郵件服務器的日誌條目設計一個類。我已經解析了日誌條目並創建了類層次結構。現在我需要將內存表示保存到磁盤。我需要將它保存到多個目標,如mysql和磁盤文件。我無法找到設計持久性機制的正確方法。面臨的挑戰是:OO設計:Ruby類的多重持久性設計

  1. 如何通過持續 初始化信息,如 文件名,傳遞給它們的數據庫連接參數 。我想 的選項都是醜陋的,例如:

    1.1構造函數:它變得很難看,因爲我增加了更多的持久性。

    1.2方法:Object.mysql_params(」「),再次 對接難看

  2. 「正確的」 方法名來調用每個 持久性機制:例如: Object.save_mysql,Object.save_file, 或對象.save(MySQL的)和 Object.save(文件)

我相信有一些模式來解決這方面的問題。我使用Ruby作爲我的語言,沒有任何軌道,即純Ruby代碼。任何線索都非常受歡迎。

拉吉

回答

2

個人而言,我會打破東西了一點 - 一個表示日誌條目真的不應該擔心它應該如何保存它的對象,所以我可能會創建一個MySQLObjectStore和FileObjectStore,您可以分別進行配置,並通過要保存的對象。你可以給你的Object類一個包含商店類型的類變量,在保存時被調用。

class Object 
    cattr_accessor :store 

    def save 
    @@store.save(self) 
    end 
end 

class MySQLObjectStore 
    def initialize(connection_string) 
    # Connect to DB etc... 
    end 

    def save(obj) 
    # Write to database 
    end 
end 

store = MySQLObjectStore.new("user:[email protected]/database") 
Object.store = store 

obj = Object.new(foo) 
obj.save 
+0

非常感謝您的回答。收到的所有3個答案都表明了相同的方法 – 2008-10-08 07:54:02

1

除非我完全誤解了你的問題,否則我會建議使用策略模式。不要讓這個班級試圖寫信給所有這些不同的來源,而是將這個責任委託給另一個班級。有一堆LogWriter類,每個類都負責將對象存放到特定的數據存儲區。所以,你可能有一個MySqlLogWriter,FileLogWriter等

這些對象中的每一個可以自行進行實例化,然後persitence對象可以被傳遞給它:

lw = FileLogWriter.new "log_file.txt" 
lw.Write(log) 
+0

感謝您的回答。所有三個答案都表明了同樣的事情。我接受第一個答案。 – 2008-10-08 07:56:19

1

你真的應該分開您的問題這裏。消息和消息的保存方式是兩個單獨的事情。事實上,在很多情況下,爲每條消息打開一個新的mysql連接或新的文件指針也會更有效率。

我會創建一個Saver類,由FileSaver和MysqlSaver擴展,每個類都有一個保存方法,它傳遞了您的消息。保存者負責提取應用的消息部分並將其保存到其負責的介質中。

+0

感謝您的回答。所有三個答案都表明了同樣的事情。我接受第一個答案。 – 2008-10-08 07:57:00