2008-10-07 45 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