Первый паттерн: Конфигурации приложения.
Проблема: Многие приложения сталкиваются с необходимостью иметь системные настройки приложения (application preferences), это может быть название приложения, курсы валют, частота обновления или запуска какого-то сервиса. Часто такого рода задачу решают с помощью файлов настроек (*.yml, *.properties), но это в случае когда они не меняются. Как только возникает необходимость вынести эти настройки на уровень пользователя, то решения с конфигурационными файлами не хватает.
Концептуальное решение: Хранить настройки в базе данных и при старте приложения загружать их в память в виде констант. Как только происходит запись в таблицу настроек, все константы, либо изменившуюся следует перечитать.
Пример реализвации на ruby:
1. шаг - миграция
class CreateProperties < ActiveRecord::Migration
def self.up
create_table :properties, :options => 'ENGINE=InnoDB CHARSET=utf8' do |t|
t.string :name
t.string :value
end
end
def self.down
drop_table :properties
end
end
2. шаг - модель
class Property < ActiveRecord::Base
validates_presence_of :name
validates_presence_of :value
after_save :property_changed
PROPERTIES = {:pvn => 0.18, :eur_rate => 0.7}
private
def property_changed
Property.load_properties
end
def self.load_properties
PROPERTIES.each {|name, value|
Property.create(:name => name.to_s, :value => value) unless
Property.find_by_name(name.to_s)}
Property.find(:all).each do |property|
class_eval <<-EOF
#{property.name.upcase} = #{property.value}
EOF
end
end
load_properties
BACK_PVN = Property::PVN + 1
end
В принципе это все. Далее используем Propert::PVN, Property::EUR_RATE, ... при обновлении значения какой-то переменной, она автоматически перегрузится. Так же есть возможность внести стартовые значения по умолчанию PROPERTIES = {:pvn => 0.18, :eur_rate => 0.7}, которые автоматически запишутся в базу при первом обращении ClassLoader'а к Property.