Illustration from Am Adult by Allie Brosh
http://hyperboleandahalf.blogspot.com/2010/03/am-adult.html
Slide 4
Slide 4 text
Photo: Johanna Owen 2011
Slide 5
Slide 5 text
Illustration from U B Hatin’ by Allie Brosh
http://hyperboleandahalf.blogspot.com/2010/03/u-b-hatin.html
Slide 6
Slide 6 text
I❤
refactoring
Slide 7
Slide 7 text
Illustration from There’s a Lesson in Here Somewhere, I Think by Allie Brosh
http://hyperboleandahalf.blogspot.com/2010/01/theres-lesson-in-here-somewhere-i-
think.html
Slide 8
Slide 8 text
Illustration from There’s a Lesson in Here Somewhere, I Think by Allie Brosh
http://hyperboleandahalf.blogspot.com/2010/01/theres-lesson-in-here-somewhere-i-
think.html
Slide 9
Slide 9 text
refactoring
is not
rehacktoring
Slide 10
Slide 10 text
Inspired by true events
A Story
Slide 11
Slide 11 text
Illustration from The Scariest Story by Allie Brosh
http://hyperboleandahalf.blogspot.com/2011/02/scariest-story.html
describe XYZService do
subject { XYZService.xyz_filename(stub) }
it "works" do
end
end
Slide 28
Slide 28 text
describe XYZService do
subject { XYZService.xyz_filename(stub) }
it "works" do
end
end
Slide 29
Slide 29 text
describe XYZService do
subject { XYZService.xyz_filename(stub) }
it "works" do
end
end
Slide 30
Slide 30 text
describe XYZService do
subject { XYZService.xyz_filename(stub) }
it "works" do
subject.should eq("something")
end
end
Slide 31
Slide 31 text
subject.should eq
"something"
Slide 32
Slide 32 text
subject.should eq
"whatever"
Slide 33
Slide 33 text
subject.should eq
"freddy"
Slide 34
Slide 34 text
subject.should eq
"something"
Slide 35
Slide 35 text
Failures:
1) XYZService works
Failure/Error:
subject.should eq("something")
Stub received unexpected message :publish_on with (no args)
# ./xyz_service.rb:6:in `xyz_filename'
Slide 36
Slide 36 text
Failures:
1) XYZService works
Failure/Error:
subject.should eq("something")
Stub received unexpected message :publish_on with (no args)
# ./xyz_service.rb:6:in `xyz_filename'
Slide 37
Slide 37 text
Stub received unexpected message
:publish_on
with (no args)
Slide 38
Slide 38 text
Failures:
1) XYZService works
Failure/Error:
subject.should eq("something")
Stub received unexpected message :publish_on with (no args)
# ./xyz_service.rb:6:in `xyz_filename'
describe XYZService do
subject { XYZService.xyz_filename(stub) }
it "works" do
end
end
Slide 45
Slide 45 text
describe XYZService do
subject { XYZService.xyz_filename(target) }
it "works" do
end
end
Slide 46
Slide 46 text
describe XYZService do
let(:target) do
stub(:target)
end
subject { XYZService.xyz_filename(target) }
it "works" do
subject.should eq("something")
end
end
Slide 47
Slide 47 text
describe XYZService do
let(:target) do
messages = {
}
stub(:target, messages)
end
subject { XYZService.xyz_filename(target) }
it "works" do
subject.should eq("something")
end
end
Slide 48
Slide 48 text
describe XYZService do
let(:target) do
messages = {
:publish_on => ?
}
stub(:target, messages)
end
subject { XYZService.xyz_filename(target) }
it "works" do
subject.should eq("something")
end
end
Slide 49
Slide 49 text
describe XYZService do
let(:target) do
messages = {
:publish_on => Date.new(2012, 3, 14)
}
stub(:target, messages)
end
subject { XYZService.xyz_filename(target) }
it "works" do
subject.should eq("something")
end
end
Slide 50
Slide 50 text
Stub received unexpected message
:xyz_category_prefix
with (no args)
Slide 51
Slide 51 text
...
:xyz_category_prefix => ?,
...
Slide 52
Slide 52 text
...
:xyz_category_prefix => 'abc',
...
Slide 53
Slide 53 text
Stub received unexpected message
:kind
with (no args)
Slide 54
Slide 54 text
...
:kind => ?
...
Slide 55
Slide 55 text
...
:kind => 'unicorn'
...
Slide 56
Slide 56 text
Stub received unexpected message
:personal?
with (no args)
Slide 57
Slide 57 text
...
:personal? => ?
...
Slide 58
Slide 58 text
...
:personal? => false
...
Slide 59
Slide 59 text
Stub received unexpected message
:id
with (no args)
Slide 60
Slide 60 text
...
:id => ?
...
Slide 61
Slide 61 text
...
:id => 1337
...
Slide 62
Slide 62 text
Stub received unexpected message
:title
with (no args)
Slide 63
Slide 63 text
...
:title => ?
...
Slide 64
Slide 64 text
...
:title => 'magic & superglue'
...
Slide 65
Slide 65 text
Failures:
1) XYZService works
Failure/Error:
subject.should eq("something")
expected: "something"
got: "14abcunicorn_1337_3f4894ca_magicsuper.jpg"
(compared using ==)
# ./xyz_file_spec.rb:18:in `block (2 levels) in
Slide 66
Slide 66 text
Failures:
1) XYZService works
Failure/Error:
subject.should eq("something")
expected: "something"
got: "14abcunicorn_42_3f4894ca_magicsuper.jpg"
(compared using ==)
# ./xyz_file_spec.rb:18:in `block (2 levels) in
#WIN
class XYZFile
...
def truncated_title
truncated_title = target.title.downcase.gsub(/[^\[a-z\]]/, '')
truncated_title[0..truncate_to]
end
end
Slide 172
Slide 172 text
class XYZFile
...
def truncated_title
truncated_title = target.title.downcase.gsub(/[^\[a-z\]]/, '')
truncated_title[0..truncate_to]
end
end
Slide 173
Slide 173 text
class XYZFile
...
def truncated_title
target.title.downcase.
gsub(/[^\[a-z\]]/, '')[0..9]
end
end
Slide 174
Slide 174 text
class XYZFile
...
def name
filename = "#{target.publish_on.strftime("%d")}"
filename << "#{target.xyz_category_prefix}"
filename << "#{target.kind.gsub("_", "")}"
filename << "_%03d" % (target.age || 0) if target.personal?
filename << "_#{target.id.to_s}"
filename << "_#{Digest::SHA1.hexdigest(rand(10000).to_s)[0,8]}"
filename << "_#{truncated_title}"
filename << ".jpg"
return filename
end
def truncated_title...
end
Slide 175
Slide 175 text
class XYZFile
...
def name
filename = "#{target.publish_on.strftime("%d")}"
filename << "#{target.xyz_category_prefix}"
filename << "#{target.kind.gsub("_", "")}"
filename << "_%03d" % (target.age || 0) if target.personal?
filename << "_#{target.id.to_s}"
filename << "_#{Digest::SHA1.hexdigest(rand(10000).to_s)[0,8]}"
filename << "_#{truncated_title}"
filename << ".jpg"
return filename
end
def truncated_title...
end
Slide 176
Slide 176 text
class XYZFile
...
def name
...
filename << "_#{Digest::SHA1.hexdigest(rand(10000).to_s)[0,8]}"
...
end
def truncated_title...
end
Slide 177
Slide 177 text
class XYZFile
...
def name
...
filename << "_#{Digest::SHA1.hexdigest(rand(10000).to_s)[0,8]}"
...
end
def noise
end
def truncated_title...
end
Slide 178
Slide 178 text
class XYZFile
...
def name
...
filename << "_#{Digest::SHA1.hexdigest(rand(10000).to_s)[0,8]}"
...
end
def noise
Digest::SHA1.hexdigest(rand(10000).to_s)[0,8]
end
def truncated_title...
end
Slide 179
Slide 179 text
class XYZFile
...
def name
...
filename << "_#{noise}"
...
end
def noise
Digest::SHA1.hexdigest(rand(10000).to_s)[0,8]
end
def truncated_title...
end
Slide 180
Slide 180 text
class XYZFile
...
def name
filename = "#{target.publish_on.strftime("%d")}"
filename << "#{target.xyz_category_prefix}"
filename << "#{target.kind.gsub("_", "")}"
filename << "_%03d" % (target.age || 0) if target.personal?
filename << "_#{target.id.to_s}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
filename << ".jpg"
return filename
end
def noise...
def truncated_title...
end
Slide 181
Slide 181 text
class XYZFile
...
def name
filename = "#{target.publish_on.strftime("%d")}"
filename << "#{target.xyz_category_prefix}"
filename << "#{target.kind.gsub("_", "")}"
filename << "_%03d" % (target.age || 0) if target.personal?
filename << "_#{target.id}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
filename << ".jpg"
return filename
end
def noise...
def truncated_title...
end
Slide 182
Slide 182 text
class XYZFile
...
def name
filename = "#{target.publish_on.strftime("%d")}"
filename << "#{target.xyz_category_prefix}"
filename << "#{target.kind.gsub("_", "")}"
filename << "_#{age}" if target.personal?
filename << "_#{target.id.to_s}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
filename << ".jpg"
return filename
end
def age
"%03d" % (target.age || 0)
end
def noise...
def truncated_title...
end
Slide 183
Slide 183 text
class XYZFile
...
def name
filename = "#{target.publish_on.strftime("%d")}"
filename << "#{target.xyz_category_prefix}"
filename << "#{target.kind.gsub("_", "")}"
filename << "_#{age}" if target.personal?
filename << "_#{target.id.to_s}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
filename << ".jpg"
return filename
end
def age...
def noise...
def truncated_title...
end
Slide 184
Slide 184 text
class XYZFile
...
def name
filename = "#{target.publish_on.strftime("%d")}"
filename << "#{target.xyz_category_prefix}"
filename << "#{target.kind.gsub("_", "")}"
filename << "_#{age}" if target.personal?
filename << "_#{target.id.to_s}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
filename << ".jpg"
return filename
end
def age...
def noise...
def truncated_title...
end
Slide 185
Slide 185 text
class XYZFile
...
def name
filename = "#{publication_day}"
filename << "#{target.xyz_category_prefix}"
filename << "#{target.kind.gsub("_", "")}"
filename << "_#{age}" if target.personal?
filename << "_#{target.id.to_s}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
filename << ".jpg"
return filename
end
def publication_day
target.publish_on.strftime("%d")
end
def age...
def noise...
def truncated_title...
end
Slide 186
Slide 186 text
class XYZFile
...
def name
filename = "#{publication_day}"
filename << "#{target.xyz_category_prefix}"
filename << "#{target.kind.gsub("_", "")}"
filename << "_#{age}" if target.personal?
filename << "_#{target.id.to_s}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
filename << ".jpg"
return filename
end
def publication_day...
def age...
def noise...
def truncated_title...
end
Slide 187
Slide 187 text
class XYZFile
...
def name
filename = "#{publication_day}"
filename << "#{target.xyz_category_prefix}"
filename << "#{target.kind.gsub("_", "")}"
filename << "_#{age}" if target.personal?
filename << "_#{target.id.to_s}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
filename << ".jpg"
return filename
end
def publication_day...
def age...
def noise...
def truncated_title...
end
Slide 188
Slide 188 text
class XYZFile
...
def name
filename = "#{publication_day}"
filename << "#{category}"
filename << "#{target.kind.gsub("_", "")}"
filename << "_#{age}" if target.personal?
filename << "_#{target.id.to_s}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
filename << ".jpg"
return filename
end
def category
target.xyz_category_prefix
end
def publication_day...
def age...
def noise...
def truncated_title...
Slide 189
Slide 189 text
class XYZFile
...
def name
filename = "#{publication_day}"
filename << "#{category}"
filename << "#{target.kind.gsub("_", "")}"
filename << "_#{age}" if target.personal?
filename << "_#{target.id.to_s}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
filename << ".jpg"
return filename
end
def publication_day...
def category...
def age...
def noise...
def truncated_title...
end
Slide 190
Slide 190 text
class XYZFile
...
def name
filename = "#{publication_day}"
filename << "#{category}"
filename << "#{kind}"
filename << "_#{age}" if target.personal?
filename << "_#{target.id.to_s}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
filename << ".jpg"
return filename
end
def kind
target.kind.gsub("_", "")
end
def publication_day...
def category...
def age...
def noise...
Slide 191
Slide 191 text
class XYZFile
...
def name
filename = "#{publication_day}"
filename << "#{category}"
filename << "#{kind}"
filename << "_#{age}" if target.personal?
filename << "_#{target.id.to_s}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
filename << ".jpg"
return filename
end
def publication_day...
def category...
def kind...
def age...
def noise...
def truncated_title...
end
Slide 192
Slide 192 text
class XYZFile
...
def name
filename = "#{publication_day}"
filename << "#{category}"
filename << "#{kind}"
filename << "_#{age}" if target.personal?
filename << "_#{target.id.to_s}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
filename << ".jpg"
return filename
end
def publication_day...
def category...
def kind...
def age...
def noise...
def truncated_title...
end
Slide 193
Slide 193 text
filename = "#{publication_day}"
Slide 194
Slide 194 text
filename = "#{publication_day}"
Slide 195
Slide 195 text
filename = publication_day
Slide 196
Slide 196 text
filename << "#{category}"
Slide 197
Slide 197 text
filename << category
Slide 198
Slide 198 text
filename << "#{kind}"
Slide 199
Slide 199 text
filename << kind
Slide 200
Slide 200 text
filename << "_#{target.id.to_s}"
Slide 201
Slide 201 text
filename << "_#{target.id}"
Slide 202
Slide 202 text
class XYZFile
...
def name
filename = publication_day
filename << category
filename << kind
filename << "_#{age}" if target.personal?
filename << "_#{target.id}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
filename << ".jpg"
filename
end
...
end
Slide 203
Slide 203 text
class XYZFile
...
def name
filename = publication_day
filename << category
filename << kind
filename << "_#{age}" if target.personal?
filename << "_#{target.id}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
filename << ".jpg"
filename
end
...
end
Slide 204
Slide 204 text
class XYZFile
...
def name
filename = publication_day
filename << category
filename << kind
filename << "_#{age}" if target.personal?
filename << "_#{target.id}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
filename << ".jpg"
filename
end
...
end
Slide 205
Slide 205 text
class XYZFile
...
def name
filename = ""
filename << publication_day
filename << category
filename << kind
filename << "_#{age}" if target.personal?
filename << "_#{target.id}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
filename << ".jpg"
filename
end
...
end
Slide 206
Slide 206 text
class XYZFile
...
def name
filename = ""
filename << publication_day
filename << category
filename << kind
filename << "_#{age}" if target.personal?
filename << "_#{target.id}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
filename << ".jpg"
filename
end
...
end
Slide 207
Slide 207 text
class XYZFile
...
def name
filename = ""
filename << publication_day
filename << category
filename << kind
filename << "_#{age}" if target.personal?
filename << "_#{target.id}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
filename << ".jpg"
filename
end
...
end
Slide 208
Slide 208 text
class XYZFile
...
def name
filename = ""
filename << publication_day
filename << category
filename << kind
filename << "_#{age}" if target.personal?
filename << "_#{target.id}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
filename << ".jpg"
filename
end
...
end
Slide 209
Slide 209 text
class XYZFile
...
def name
filename = ""
filename << publication_day
filename << category
filename << kind
filename << "_#{age}" if target.personal?
filename << "_#{target.id}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
"#{filename}.jpg"
end
...
end
Slide 210
Slide 210 text
class XYZFile
...
def name
filename = ""
filename << publication_day
filename << category
filename << kind
filename << "_#{age}" if target.personal?
filename << "_#{target.id}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
"#{filename}.jpg"
end
...
end
Slide 211
Slide 211 text
class XYZFile
...
def name
filename = ""
filename << publication_day
filename << category
filename << kind
filename << "_#{age}" if target.personal?
filename << "_#{target.id}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
"#{filename}.jpg"
end
...
end
Slide 212
Slide 212 text
class XYZFile
...
def name
filename = ""
filename << publication_day
filename << category
filename << kind
filename << "_#{age}" if target.personal?
filename << "_#{target.id}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
"#{filename}.jpg"
end
...
end
Slide 213
Slide 213 text
class XYZFile
...
def name
...
filename << publication_day
filename << category
filename << kind
...
end
...
end
Slide 214
Slide 214 text
class XYZFile
...
def name
...
filename << publication_day
filename << category
filename << kind
...
end
def prefix
[publication_day, category, kind].join
end
...
end
Slide 215
Slide 215 text
class XYZFile
...
def name
...
filename << prefix
...
end
def prefix
[publication_day, category, kind].join
end
...
end
Slide 216
Slide 216 text
class XYZFile
...
def name
filename = ""
filename << prefix
filename << "_#{age}" if target.personal?
filename << "_#{target.id}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
"#{filename}.jpg"
end
...
end
Slide 217
Slide 217 text
class XYZFile
...
def name
filename = ""
filename << prefix
filename << "_#{age}" if target.personal?
filename << "_#{target.id}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
"#{filename}.jpg"
end
...
end
Slide 218
Slide 218 text
class XYZFile
...
def name
filename = []
filename << prefix
filename << "_#{age}" if target.personal?
filename << "_#{target.id}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
"#{filename}.jpg"
end
...
end
Slide 219
Slide 219 text
class XYZFile
...
def name
filename = []
filename << prefix
filename << "_#{age}" if target.personal?
filename << "_#{target.id}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
"#{filename}.jpg"
end
...
end
Slide 220
Slide 220 text
class XYZFile
...
def name
filename = ""
filename << prefix
filename << age if target.personal?
filename << "_#{target.id}"
filename << "_#{noise}"
filename << "_#{truncated_title}"
"#{filename}.jpg"
end
...
end
Slide 221
Slide 221 text
class XYZFile
...
def name
filename = []
filename << prefix
filename << age if target.personal?
filename << target.id
filename << "_#{noise}"
filename << "_#{truncated_title}"
"#{filename}.jpg"
end
...
end
Slide 222
Slide 222 text
class XYZFile
...
def name
filename = []
filename << prefix
filename << age if target.personal?
filename << target.id
filename << noise
filename << "_#{truncated_title}"
"#{filename}.jpg"
end
...
end
Slide 223
Slide 223 text
class XYZFile
...
def name
filename = []
filename << prefix
filename << age if target.personal?
filename << target.id
filename << noise
filename << truncated_title
"#{filename}.jpg"
end
...
end
Slide 224
Slide 224 text
class XYZFile
...
def name
filename = []
filename << prefix
filename << age if target.personal?
filename << target.id
filename << noise
filename << truncated_title
"#{filename.join("_")}.jpg"
end
...
end
Slide 225
Slide 225 text
class XYZFile
...
def name
filename = []
filename << prefix
filename << age if target.personal?
filename << target.id
filename << noise
filename << truncated_title
"#{filename.join("_")}.jpg"
end
def prefix...
def publication_day...
def category...
def kind...
def age...
def noise...
def truncated_title...
...
end
Slide 226
Slide 226 text
Illustration from About by Allie Brosh
http://hyperboleandahalf.blogspot.com/p/about.html
class XYZFile
...
def name
filename = []
filename << prefix
filename << age if target.personal?
filename << target.id
filename << noise
filename << truncated_title
"#{filename.join("_")}.jpg"
end
def prefix...
def publication_day...
def category...
def kind...
def age...
def noise...
def truncated_title...
...
end
Slide 229
Slide 229 text
class XYZFile
...
def prefix
[publication_day, category, kind].join
end
def publication_day
target.publish_on.strftime("%d")
end
def category
target.xyz_category_prefix
end
def kind
target.kind.gsub("_", "")
end
def age
"%03d" % (target.age || 0)
end
def noise
Digest::SHA1.hexdigest(rand(10000).to_s)[0,8]
end
def truncated_title
target.title.downcase.gsub(/[^\[a-z\]]/, '')[0..9]
end
end
class XYZFile
...
def name
filename = []
filename << prefix
filename << age if target.personal?
filename << target.id
filename << noise
filename << truncated_title
"#{filename.join("_")}.jpg"
end
def prefix...
def publication_day...
def category...
def kind...
def age...
def noise...
def truncated_title...
...
end
Slide 234
Slide 234 text
Text
Slide 235
Slide 235 text
(the ending)
Codejunk
Slide 236
Slide 236 text
Illustration from Chartjunk by Viveka Weiley
http://chartjunk.karmanaut.com/?p=8
Slide 237
Slide 237 text
Illustration from Chartjunk by Viveka Weiley
http://chartjunk.karmanaut.com/test-pattern-retuned/
Slide 238
Slide 238 text
(in no particular order)
Top 10
Slide 239
Slide 239 text
Lousy Comments
#10
Slide 240
Slide 240 text
module Codejunk
# States the obvious
def state_the_obvious
"whatever"
end
end
Slide 241
Slide 241 text
module Codejunk
# Takes modulus 100
def say_it_again(number)
number % 100
end
end
Slide 242
Slide 242 text
module Codejunk
# Subtracts
def incorrect_comment
1 + 1
end
end
Slide 243
Slide 243 text
module Codejunk
# add
def fuzzy_comment
1 + 1
end
end
Slide 244
Slide 244 text
module Codejunk
# ad too numbers
def bad_comment
1 + 2
end
end
Slide 245
Slide 245 text
Trailing Whitespace
#9
Slide 246
Slide 246 text
module Codejunk
def a_method
'Use your words'
end
end
................
...
.................
......
..
..
.
..
Slide 247
Slide 247 text
Commented-Out Code
#8
Slide 248
Slide 248 text
module Codejunk
def tweaked_logic(wday)
# ((7 - wday) % 7) * 1.day
(7 - wday) % 7
end
end
Slide 249
Slide 249 text
module Codejunk
def tweaked_logic(wday)
if false
((7 - wday) % 7) * 1.day
end
(7 - wday) % 7
end
end
Slide 250
Slide 250 text
Needless Parentheses
#7
Slide 251
Slide 251 text
module Codejunk
def spurious_parentheses()
junk()
end
end
Slide 252
Slide 252 text
module Codejunk
def more_spurious_parentheses
(0..(one_method_call)).to_a
end
def one_method_call
(10 - rand(10))
end
end
Slide 253
Slide 253 text
Powerless Code
#6
Slide 254
Slide 254 text
module Codejunk
def spurious_arguments
[1, 2, 3].join('')
end
end
Slide 255
Slide 255 text
module Codejunk
def spurious_arguments
[1, 2, 3].join
end
end
Slide 256
Slide 256 text
class ObjectWrapper
attr_accessor :object
def initialize(object)
@object = object
end
end
Slide 257
Slide 257 text
module Codejunk
def extract(response)
if (200..299).include?(response.code.to_i)
response.body if response
end
end
end
Slide 258
Slide 258 text
module Codejunk
def extract(response)
if (200..299).include?(response.code.to_i)
response.body if response
end
end
end
Slide 259
Slide 259 text
module Codejunk
def extract(response)
if (200..299).include?(response.code.to_i)
response.body if response
end
end
end
Slide 260
Slide 260 text
Unnecessary Requires
#5
Slide 261
Slide 261 text
require 'active_support/all'
# Nothing uses active support
module Codejunk
...
end
Slide 262
Slide 262 text
The booleanest boolean
#4
Slide 263
Slide 263 text
module Codejunk
def truth(code)
code == 13 ? true : false
end
end
Slide 264
Slide 264 text
module Codejunk
def lie!
!true
end
end
Slide 265
Slide 265 text
Too Much Hard Work
#3
Slide 266
Slide 266 text
module Codejunk
def spurious_string_interpolation
"#{thing}"
end
def thing
"a string"
end
end
Slide 267
Slide 267 text
module Codejunk
def spurious_stringification
"I am #{age.to_s} years old"
end
def age
rand(25) + 15
end
end
Slide 268
Slide 268 text
module Codejunk
def spurious_transformations
[1, 2, 3].map(&:to_s).join
end
end
Slide 269
Slide 269 text
module Codejunk
def spurious_complexity
s = rand(2) == 0 ? "abcde" : "abc"
cutoff = s.length > 4 ? 4 : s.length
s[0..cutoff]
end
end
Slide 270
Slide 270 text
module Codejunk
def spurious_hard_work
s = "I <3 Magic!"
s.gsub(/[^a-z]/i, '').downcase
end
end
Slide 271
Slide 271 text
Duplicated Tests
#2
Slide 272
Slide 272 text
module Codejunk
def add(n1, n2)
n1 + n2
end
end
describe Codejunk do
subject { stub.extend(Codejunk) }
it "adds" do
subject.add(1, 1).should eq(2)
end
it "adds twin primes" do
subject.add(29, 31).should eq(60)
end
it "adds big numbers" do
subject.add(9238498, 2039238).should eq(11277736)
end
it "adds negative numbers" do
subject.add(100, -390).should eq(-290)
end
end
Slide 273
Slide 273 text
describe Codejunk do
subject { stub.extend(Codejunk) }
it "gets rid of spaces" do
subject.sanitize(" o m g ").should eq('omg')
end
it "gets rid of funky characters" do
subject.sanitize("omg^%#=}{?_").should eq('omg')
end
it "gets rid of numbers" do
subject.sanitize("omg123").should eq('omg')
end
it "downcases everything" do
subject.sanitize("OMG").should eq('omg')
end
end
Slide 274
Slide 274 text
Combine All The Codejunk
#1
Slide 275
Slide 275 text
module Codejunk
def junk
# Subtracts
s = rand(2) == 0 ? "abcde" : "abc"
cutoff = s.length > 4 ? 4 : s.length
s = s[0..cutoff]
s << "#{spurious_string_interpolation()}"
s << "I am #{age.to_s} years old, and "
s << "I <3 Magic!".gsub(/[^a-z]/i, '').downcase
s << "#{(0..(one_method_call)).map(&:to_s).join('')}"
return s
end
end
Slide 276
Slide 276 text
Text
Slide 277
Slide 277 text
github.com/kytrinyx
/therapeutic-refactoring
Slide 278
Slide 278 text
Refactoring by Martin Fowler et al.
http://www.goodreads.com/book/show/44936.Refactoring
Refactoring, Ruby Edition by Jay Fields et al.
http://www.goodreads.com/book/show/11560939-refactoring
Slide 279
Slide 279 text
Refactoring in Ruby by William Wake & Kevin Rutherford
http://www.goodreads.com/book/show/7214925-refactoring-in-ruby
Slide 280
Slide 280 text
Working Effectively With Legacy Code by Michael Feathers
http://www.goodreads.com/book/show/44919.Working_Effectively_with_Legacy_Code
Slide 281
Slide 281 text
Practical Object-Oriented Design in Ruby by Sandi Metz
http://www.goodreads.com/book/show/13507787-practical-object-oriented-design-in-ruby
Slide 282
Slide 282 text
(the moral)
Therapy
Slide 283
Slide 283 text
No content
Slide 284
Slide 284 text
I❤
refactoring
Slide 285
Slide 285 text
Working Memory
Science!
* Beilock & DeCaro, Department of Psychology, University of Chicago
http://www.ncbi.nlm.nih.gov/pubmed/17983308
Slide 286
Slide 286 text
Problem-Solving Strategies
Science!
Slide 287
Slide 287 text
Worry & Panic
Science!
Slide 288
Slide 288 text
makes you smarter!
Refactoring
Slide 289
Slide 289 text
Exobrain
Slide 290
Slide 290 text
counteracts panic
Exobrain
Slide 291
Slide 291 text
makes you happier!
Refactoring
Slide 292
Slide 292 text
Fast Tests
Slide 293
Slide 293 text
are awesome
Fast Tests
Slide 294
Slide 294 text
Happiness
Slide 295
Slide 295 text
leads to good design
Happiness
Slide 296
Slide 296 text
Illustration from God of Cake by Allie Brosh
http://hyperboleandahalf.blogspot.no/2010/10/god-of-cake.html
Slide 297
Slide 297 text
exobrain
Illustration from God of Cake by Allie Brosh
http://hyperboleandahalf.blogspot.no/2010/10/god-of-cake.html
Slide 298
Slide 298 text
Illustration from God of Cake by Allie Brosh
http://hyperboleandahalf.blogspot.no/2010/10/god-of-cake.html
prevents panic
Slide 299
Slide 299 text
Illustration from God of Cake by Allie Brosh
http://hyperboleandahalf.blogspot.no/2010/10/god-of-cake.html
happiness
Slide 300
Slide 300 text
Illustration from God of Cake by Allie Brosh
http://hyperboleandahalf.blogspot.no/2010/10/god-of-cake.html
decoupled code