際際滷

際際滷Share a Scribd company logo
THE TEN 
COMMANDMENTS 
of the ruby programmer
I AM EMILIO A RUBY PROGRAMMER 
Software developer +15 yrs 
10Pines founder 
Agiles community founding member 
agiles 2012 conference co-chair 
husband, father and homeBrewer
I. Thou shalt have no 
domain objects coupled 
with thy frameworks
class Speaker < ActiveRecord::Base 
! 
devise :omniauthable, 
:omniauth_providers => [:facebook] 
! 
def approve_session(session) 
# do something 
SessionMailer.approve(speaker: self, 
session: session).deliver 
end 
! 
end
II. THOU SHALT NOT 
STEAL & PASTE CODE
public List selectPending(List registrations) { 
! 
List pending = new ArrayList(); 
for (Registration registration: registrations) { 
if (!registration.isPaid()) { 
pending.add(registration); 
} 
} 
return pending; 
}
! 
def select_pending(registrations) 
registrations.reject(&:paid?) 
end 
! 
!
class SessionsController < ApplicationController 
! 
def create 
! 
@session = Session.new(session_params) 
! 
if @session.save 
redirect_to my_sessions_path, 
notice: 'Session created successfully' 
else 
render :new 
end 
! 
end 
end
class Program 
! 
def find_by_author(author) 
! 
sessions = Session.where(author: author, 
approved: true) 
! 
if sessions.empty? 
# do something 
else 
# do something 
end 
end 
! 
end
III. THOU SHALT 
NOT USE NIL
class AttendeePresenter 
! 
def phone_number 
! 
unless self.address.nil? 
unless self.address.phone_number.nil? 
self.address.phone_number 
else 
'Phone number not present' 
end 
else 
'Address not present' 
end 
end 
! 
end
class Attendee 
def initialize(address) 
if address.nil? 
raise ArgumentError, 'Address is required' 
end 
@address = address 
end 
! 
def address 
@address || UnknownAddress.new 
end 
! 
def phone_number 
Optional.new(@address). 
within {|address| address.phone_number} 
end 
end
IV. THOU SHALT 
NOT USE IF
class BankAccount 
! 
def process a_transaction 
! 
if a_transaction.type == :purchase 
# charge transaction fee 
else 
# assume refund 
end 
end 
! 
end
class BankAccount 
! 
def process a_transaction 
a_transaction.process self 
end 
! 
def process_purchase a_transaction 
# charge transaction fee 
end 
! 
def process_refund a_transaction 
# refund transaction fee 
end 
! 
end
class Purchase < Transaction 
! 
def process a_payment_method 
a_payment_method.process_purchase self 
end 
end 
! 
class Refund < Transaction 
! 
def process a_payment_method 
a_payment_method.process_refund self 
end 
end
V. THOU SHALT 
NOT MOCK
require 'spec_helper' 
! 
describe Registration do 
! 
it 'pays a registration' do 
! 
attendee_id = 1 
a_registration = double("Registration") 
an_attendee = double("Attendee", registration: a_registration) 
! 
allow(Attendee).to receive(:find) { an_attendee } 
! 
expect(a_registration).to receive(:paid=).with(true) 
expect(a_registration).to receive(:save).and_return(true) 
! 
expect_any_instance_of(PaypalAccount).to receive(:process) 
! 
Registration.pay(attendee_id) 
! 
end 
end
VI. THOU SHALT NOT TAKE 
THY TESTS 
IN VAIN
VI. THOU SHALT NOT TAKE 
THY 
IN VAIN 
VII. REMEMBER TO 
REFACTOR EVERY DAY
VI. THOU SHALT NOT TAKE 
THY 
IN VAIN 
VII. REMEMBER TO 
REFACTOR 
VII. THOU SHALT BEAR YOUR 
FELLOW PROGRAMMERS 
AND PAIR WITH THEM
IX. CHALLENGE 
HONOUR 
/[RUBY|RAILS|.*]/ 
FATHER AND MOTHER
X. NO GRAVEN 
PRACTICES
QUESTIONS? 
comments, critics, 
compliments
THANKS!!! 
email: egutter@10pines.com 
twitter: @10pines 
site: dev.10pines.com 
blog: blog.10pines.com

More Related Content

Rubyconf2014

  • 1. THE TEN COMMANDMENTS of the ruby programmer
  • 2. I AM EMILIO A RUBY PROGRAMMER Software developer +15 yrs 10Pines founder Agiles community founding member agiles 2012 conference co-chair husband, father and homeBrewer
  • 3. I. Thou shalt have no domain objects coupled with thy frameworks
  • 4. class Speaker < ActiveRecord::Base ! devise :omniauthable, :omniauth_providers => [:facebook] ! def approve_session(session) # do something SessionMailer.approve(speaker: self, session: session).deliver end ! end
  • 5. II. THOU SHALT NOT STEAL & PASTE CODE
  • 6. public List selectPending(List registrations) { ! List pending = new ArrayList(); for (Registration registration: registrations) { if (!registration.isPaid()) { pending.add(registration); } } return pending; }
  • 7. ! def select_pending(registrations) registrations.reject(&:paid?) end ! !
  • 8. class SessionsController < ApplicationController ! def create ! @session = Session.new(session_params) ! if @session.save redirect_to my_sessions_path, notice: 'Session created successfully' else render :new end ! end end
  • 9. class Program ! def find_by_author(author) ! sessions = Session.where(author: author, approved: true) ! if sessions.empty? # do something else # do something end end ! end
  • 10. III. THOU SHALT NOT USE NIL
  • 11. class AttendeePresenter ! def phone_number ! unless self.address.nil? unless self.address.phone_number.nil? self.address.phone_number else 'Phone number not present' end else 'Address not present' end end ! end
  • 12. class Attendee def initialize(address) if address.nil? raise ArgumentError, 'Address is required' end @address = address end ! def address @address || UnknownAddress.new end ! def phone_number Optional.new(@address). within {|address| address.phone_number} end end
  • 13. IV. THOU SHALT NOT USE IF
  • 14. class BankAccount ! def process a_transaction ! if a_transaction.type == :purchase # charge transaction fee else # assume refund end end ! end
  • 15. class BankAccount ! def process a_transaction a_transaction.process self end ! def process_purchase a_transaction # charge transaction fee end ! def process_refund a_transaction # refund transaction fee end ! end
  • 16. class Purchase < Transaction ! def process a_payment_method a_payment_method.process_purchase self end end ! class Refund < Transaction ! def process a_payment_method a_payment_method.process_refund self end end
  • 17. V. THOU SHALT NOT MOCK
  • 18. require 'spec_helper' ! describe Registration do ! it 'pays a registration' do ! attendee_id = 1 a_registration = double("Registration") an_attendee = double("Attendee", registration: a_registration) ! allow(Attendee).to receive(:find) { an_attendee } ! expect(a_registration).to receive(:paid=).with(true) expect(a_registration).to receive(:save).and_return(true) ! expect_any_instance_of(PaypalAccount).to receive(:process) ! Registration.pay(attendee_id) ! end end
  • 19. VI. THOU SHALT NOT TAKE THY TESTS IN VAIN
  • 20. VI. THOU SHALT NOT TAKE THY IN VAIN VII. REMEMBER TO REFACTOR EVERY DAY
  • 21. VI. THOU SHALT NOT TAKE THY IN VAIN VII. REMEMBER TO REFACTOR VII. THOU SHALT BEAR YOUR FELLOW PROGRAMMERS AND PAIR WITH THEM
  • 22. IX. CHALLENGE HONOUR /[RUBY|RAILS|.*]/ FATHER AND MOTHER
  • 23. X. NO GRAVEN PRACTICES
  • 25. THANKS!!! email: egutter@10pines.com twitter: @10pines site: dev.10pines.com blog: blog.10pines.com