Паттерны в веб приложениях

Первый пост о тех паттернах используемых в своей работе.

Первый паттерн: Конфигурации приложения.

Проблема: Многие приложения сталкиваются с необходимостью иметь системные настройки приложения (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.