2008-10-07 4 views
1

내 메일 서버의 로그 항목에 대한 클래스를 디자인하고 있습니다. 로그 항목을 구문 분석하고 클래스 계층을 만들었습니다. 이제 메모리 내 표현을 디스크에 저장해야합니다. mysql 및 디스크 파일과 같은 여러 대상에 저장해야합니다. 나는 지속성 메커니즘을 설계하는 적절한 방법을 찾기가 어렵다. 도전은 다음과 같습니다 OO 디자인 : 루비 클래스를위한 다중 퍼시스턴스 디자인

  1. 이 파일 이름, 그들에게 전달 DB 연결 매개 변수 같은 지속성 초기화 정보를 전달하는 방법. 내가 할 수있는 옵션 은 모두 예를 들어 추악한 생각이다 :

    1.1 생성자 : 내가 으로 지속성을 추가하는 것은 추악해진다.

    1.2 방법 : Object.mysql_params (""), 다시 추한

  2. 엉덩이 "각 지속성 메커니즘을 호출 할 올바른"방법 이름 : 예 : Object.save_mysql, Object.save_file을 또는 객체 .save (MySQL의) 및 Object.save (파일)

나는 확신이 특정 문제를 해결하기 위해 몇 가지 패턴이있다. 루비를 내 언어로 사용하고 있습니다. 순수한 루비 코드와 같은 모든 레일을 사용하지 않습니다. 어떤 단서를 환영합니다.

주권

답변

2

개인적으로 나는 조금 물건을 깰 것 - 그것을 저장하는 방법에 대해 걱정하지 말아야 정말 로그 항목을 나타내는 개체를, 그래서 아마 FileObjectStore MySQLObjectStore을 만들고 것, 별도로 구성 할 수 있으며 저장할 객체가 전달됩니다. 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

답변 해 주셔서 감사합니다. 접수 된 세 가지 답변 모두 동일한 접근 방식을 제안했습니다. –

1

질문을 완전히 오해하지 않는 한 전략 패턴을 사용하는 것이 좋습니다. 이 하나의 클래스가 모든 다른 소스에 쓰기를 시도하는 대신, 그 책임을 다른 클래스에 위임하십시오. LogWriter 클래스를 여러 개 가지십시오. 각 클래스는 객체를 특정 데이터 저장소로 전달해야합니다. 당신이 MySqlLogWriter, FileLogWriter 등

가있을 수 있습니다 그래서 이러한 개체의 각 하나는 그것에 스스로 인스턴스화 할 수 다음 persitence 개체가 전달 될 수 있습니다 : 당신은 정말 당신의 문제를 분리해야

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

답변 해 주셔서 감사합니다. 세 가지 답변 모두 똑같은 제안을했습니다. 나는 첫 번째 대답을 받아들입니다. –

1

이리. 메시지와 메시지가 저장되는 방식은 두 가지로 구분됩니다. 실제로 많은 경우에 모든 메시지에 대해 새로운 mysql 연결이나 새 파일 포인터를 열지 않는 것이 더 효율적입니다.

FileSaver 및 MysqlSaver에 의해 확장 된 Saver 클래스를 만들려고합니다. 각 클래스에는 메시지가 전달되는 save 메서드가 있습니다. 보호기는 적용되는 메시지의 부분을 꺼내 책임이있는 미디어에 저장합니다.

+0

답변 해 주셔서 감사합니다. 세 가지 답변 모두 똑같은 제안을했습니다. 나는 첫 번째 대답을 받아들입니다. –