def up add_column :member_roles, :send_status_mails, :boolean, default: true execute "UPDATE member_roles SET send_status_mails='t'" change_column :member_roles, :send_status_mails, :boolean, default: true, null: false end def down remove_column :member_roles, :send_status_mails end end
объект в бинарное представление. • кладёт в очередь (БД, хранилище Redis, …) • Обработчик: (через какое-то время, другой процесс, другой компьютер) • достаёт из очереди объект «Команда». • десериализует. • выполняет.
отката команды, ибо контекст исполнения отличается от контекста порождения. • Макрокоманда — цепочка из нескольких команд. • Транзакционность — макрокоманда либо будет выполнена до конца (с изменением состояния), либо не будет выполнена вообще (состояние останется неизменным). • Если 8-я команда завершилась с ошибкой, откатываем обратно с 7-й по 1-ю.
не наоборот. Принцип Голливуда: «Не звоните нам, мы сами вам позвоним». • Hooks (callbacks, крючки, зацепки) — определяются по желанию. Как правило, в базовом классе это функции с пустыми телами. • virtual foo() = 0; заставляет определять функции в подклассе. Принцип инверсии зависимостей
• Переходы между состояниями может делать как основной класс, так и классы состояний. • Классы состояний можно наследовать друг от друга (если поведение несильно отличается). • Можно сделать классы состояний синглтонами (если все данные лежат в основном классе). Принцип открытия- закрытия
динамически поменять алгоритм; • если используется несколько не связанных алгоритмов (напр.: форматирование по ширине и расстановка переносов), возникает картезианский взрыв классов- наследников.
ThreadingModel> class SmartPtr : public CheckingPolicy<T>, public ThreadingModel<SmartPtr> { // ... T *operator->() { typename ThreadingModel<SmartPtr>::Lock guard(*this); CheckingPolicy<T>::check(pointee); return pointee; } private: T *pointee; };
информации друг о друге. • Повышается эффективность программы, ибо связывание делается на этапе компиляции, механизм виртуальных функций не нужен. • Теряется возможность динамического изменения стратегий во время выполнения.