rubyconf2014

25
THE TEN COMMANDMENTS of the ruby programmer

Upload: egutter

Post on 20-Aug-2015

318 views

Category:

Software


0 download

TRANSCRIPT

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: [email protected]: @10pinessite: dev.10pines.comblog: blog.10pines.com