3. “Tell, don't ask”
"Procedural code gets information
then makes decisions. Object-oriented
code tells objects to do things."
— Alec Sharp, Smalltalk by Example
8. A use case object
class CreateAction
def initialize(user)
@user = user
end
def execute(options)
project = @user.open_project(options[:project_id])
action = project.create_action(options[:attrs])
unless action.errors.any?
event = Event.create!(summary: "##{action.id} created", project_id: project.id)
msg = "#{@user.name} created #{action.title}"
project.campfire_room.speak(msg)
PushMessage.instance.publish("action-do.#{action.project.id}.action_item",
{:action_item_id => action})
action.project.users.reject {|u| u == @user}.each do |u|
ActionItemMailer.action_item_created(action, u).deliver
end
end
action
end
end
9. A use case object
class CreateAction
def initialize(user)
@user = user
end
def execute(options)
project = @user.open_project(options[:project_id])
action = project.create_action(options[:attrs])
unless action.errors.any?
event = Event.create!(summary: "##{action.id} created", project_id: project.id)
msg = "#{@user.name} created #{action.title}"
project.campfire_room.speak(msg)
PushMessage.instance.publish("action-do.#{action.project.id}.action_item",
{:action_item_id => action})
action.project.users.reject {|u| u == @user}.each do |u|
ActionItemMailer.action_item_created(action, u).deliver
end
end
action
end
end
10. A use case object
class CreateAction
def initialize(user)
@user = user
end
def execute(options)
project = @user.open_project(options[:project_id])
action = project.create_action(options[:attrs])
unless action.errors.any?
event = Event.create!(summary: "##{action.id} created", project_id: project.id)
msg = "#{@user.name} created #{action.title}"
project.campfire_room.speak(msg)
PushMessage.instance.publish("action-do.#{action.project.id}.action_item",
{:action_item_id => action})
action.project.users.reject {|u| u == @user}.each do |u|
ActionItemMailer.action_item_created(action, u).deliver
end
end
action
end
end
11. A use case object
class CreateAction
def initialize(user)
@user = user
end
def execute(options)
project = @user.open_project(options[:project_id])
action = project.create_action(options[:attrs])
unless action.errors.any?
event = Event.create!(summary: "##{action.id} created", project_id: project.id)
msg = "#{@user.name} created #{action.title}"
project.campfire_room.speak(msg)
PushMessage.instance.publish("action-do.#{action.project.id}.action_item",
{:action_item_id => action})
action.project.users.reject {|u| u == @user}.each do |u|
ActionItemMailer.action_item_created(action, u).deliver
end
end
action
end
end
12. A use case object
class CreateAction
def initialize(user)
@user = user
end
def execute(options)
project = @user.open_project(options[:project_id])
action = project.create_action(options[:attrs])
unless action.errors.any?
event = Event.create!(summary: "##{action.id} created", project_id: project.id)
msg = "#{@user.name} created #{action.title}"
project.campfire_room.speak(msg)
PushMessage.instance.publish("action-do.#{action.project.id}.action_item",
{:action_item_id => action})
action.project.users.reject {|u| u == @user}.each do |u|
ActionItemMailer.action_item_created(action, u).deliver
end
end
action
end
end
14. “Tell, don't ask”
"Procedural code gets information
then makes decisions. Object-oriented
code tells objects to do things."
— Alec Sharp, Smalltalk by Example
15. “Tell, don't ask”
"Procedural code gets information
then makes decisions. Object-oriented
code tells objects to do things."
— Alec Sharp, Smalltalk by Example
16. “Tell, don't ask”
"Sometimes an object will change
its state, and on those occasions
it might be expected to report
that change to others."
— David West, Object Thinking
17. A use case object
class CreateAction
def initialize(user)
@user = user
end
def execute(options)
project = @user.open_project(options[:project_id])
action = project.create_action(options[:attrs])
unless action.errors.any?
event = Event.create!(summary: "##{action.id} created", project_id: project.id)
msg = "#{@user.name} created #{action.title}"
project.campfire_room.speak(msg)
PushMessage.instance.publish("action-do.#{action.project.id}.action_item",
{:action_item_id => action})
action.project.users.reject {|u| u == @user}.each do |u|
ActionItemMailer.action_item_created(action, u).deliver
end
end
action
end
end
18. A use case object
class CreateAction
def initialize(user)
@user = user
end
def execute(options)
project = @user.open_project(options[:project_id])
action = project.create_action(options[:attrs])
unless action.errors.any?
event = Event.create!(summary: "##{action.id} created", project_id: project.id)
msg = "#{@user.name} created #{action.title}"
project.campfire_room.speak(msg)
PushMessage.instance.publish("action-do.#{action.project.id}.action_item",
{:action_item_id => action})
action.project.users.reject {|u| u == @user}.each do |u|
ActionItemMailer.action_item_created(action, u).deliver
end
end
action
end
end
19. A use case object : after
class CreateAction
def initialize(user)
@user = user
end
def execute(options)
project = @user.open_project(options[:project_id])
action = project.create_action(options[:attrs])
unless action.errors.any?
EventBus.announce('action-created', action: action, actor: @user, publisher: self)
end
action
end
end
https://rubygems.org/gems/event_bus
20. The Campfire listener
class CampfireAnnouncer
def action_created(payload)
actor = payload[:actor]
action = payload[:action]
project = action.project
msg = "#{actor.name} created #{action.title}"
project.campfire_room.speak(msg)
end
def action_deleted(payload)
#...
end
#...
end
21. Listener registration
class ApplicationController < ActionController::Base
before_filter do
EventBus.clear
EventBus.register(CampfireAnnouncer.new)
EventBus.register(EventLogger.new)
EventBus.register(EmailNotifier.new)
EventBus.register(PushNotifier.new)
end
#...
end