ОО Дизайн: множественный персистентный дизайн для рубинового класса - PullRequest
1 голос
/ 07 октября 2008

Я разрабатываю класс для записей журнала моего почтового сервера. Я проанализировал записи в журнале и создал иерархию классов. Теперь мне нужно сохранить представление в памяти на диск. Мне нужно сохранить его в нескольких местах, таких как mysql и файлы на диске. Я в недоумении, чтобы найти правильный способ разработки механизма персистентности. Задачи:

  1. Как передать настойчивость информация инициализации как имя файла, параметры подключения БД перешел к ним. Варианты, которые я могу думаю, все уродливы, например:

    1.1 Конструктор: становится ужасно добавить больше настойчивости.

    1.2 Метод: Object.mysql_params (""), опять приклад безобразно

  2. «Правильное» имя метода для вызова каждого механизм сопротивления: например: Object.save_mysql, Object.save_file, или Object.save (mysql) и Object.save (файл)

Я уверен, что есть какой-то шаблон для решения этой конкретной проблемы. Я использую ruby ​​в качестве языка без всяких рельсов, то есть чистый код ruby. Любая подсказка приветствуется.

Радж

Ответы [ 3 ]

2 голосов
/ 07 октября 2008

Лично я бы немного разбил вещи - объект, представляющий запись журнала, действительно не должен беспокоиться о том, как он должен его сохранять, поэтому я, вероятно, создал бы 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:password@localhost/database")
Object.store = store

obj = Object.new(foo)
obj.save
1 голос
/ 07 октября 2008

Вы действительно должны отделить свои проблемы здесь. Сообщение и способ сохранения сообщения - это две разные вещи. Фактически, во многих случаях было бы более эффективно не открывать новое соединение MySQL или новый указатель файла для каждого сообщения.

Я бы создал класс Saver, расширенный с помощью FileSaver и MysqlSaver, каждый из которых имеет метод save, которому передается ваше сообщение. Хранитель отвечает за извлечение применимых частей сообщения и сохранение их на носителе, за который он отвечает.

1 голос
/ 07 октября 2008

Если я полностью не понял ваш вопрос, я бы рекомендовал использовать шаблон Стратегии. Вместо того, чтобы этот один класс пытался писать во все эти разные источники, делегируйте эту ответственность другому классу. Есть несколько классов LogWriter, каждый из которых несет ответственность за сохранение объекта в определенном хранилище данных. Таким образом, у вас могут быть MySqlLogWriter, FileLogWriter и т. Д.

Каждый из этих объектов может быть создан самостоятельно, а затем объект передачи может быть передан ему:

lw = FileLogWriter.new "log_file.txt"
lw.Write(log)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...