optimizing for readability

103

Upload: tobias-pfeiffer

Post on 07-Jan-2017

233 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Optimizing For Readability
Page 2: Optimizing For Readability

We write code

Page 3: Optimizing For Readability

Isn't it moreabout reading?

Page 4: Optimizing For Readability

Written once – read many times

Page 5: Optimizing For Readability

„(…) when you program, you have to think about how someone will read your code, not just how a computer will interpret it.“

Kent Beck

Page 6: Optimizing For Readability

„Any fool can write code that a computer can understand. Good programmers write

code that humans can understand.“Martin Fowler

Page 7: Optimizing For Readability

Not about architecture

Page 8: Optimizing For Readability

Methods & Code

Page 9: Optimizing For Readability

Nurturing a code base

Page 10: Optimizing For Readability

Extra effort

Page 11: Optimizing For Readability

Save time!

Page 12: Optimizing For Readability

Your code base?

Page 13: Optimizing For Readability
Page 14: Optimizing For Readability

It's about joy!

Page 15: Optimizing For Readability

Optimizing for Readability

Tobias Pfeiffer@PragTob

pragtob.info

Page 16: Optimizing For Readability

Crazy?

Page 17: Optimizing For Readability

Methods & Code

Page 18: Optimizing For Readability
Page 19: Optimizing For Readability

Keep It Simple Stupid

Page 20: Optimizing For Readability

Are comments a smell?

Page 21: Optimizing For Readability

Comments are an excuse of the code that it could not be

clearer.

Page 22: Optimizing For Readability

Outdated comments are the worst

Page 23: Optimizing For Readability

The why not the what

Page 24: Optimizing For Readability

def paint_control(event) # some painting coderescue => e # Really important to rescue here. Failures that escape this method # cause odd-ball hangs with no backtraces. See #559 for an example. # puts "SWALLOWED PAINT EXCEPTION ON #{@obj} - go take care of it: " + e.to_s puts 'Unfortunately we have to swallow it because it causes odd failures :('end

Page 25: Optimizing For Readability

Also known as the smell that tries to make other smells

seem ok

Page 26: Optimizing For Readability

# do one thing...............

# do another thing............

# do something more......

Page 27: Optimizing For Readability

# do one thing...............

# do another thing............

# do something more......

Page 28: Optimizing For Readability

# do one thing...............

# do another thing............

# do something more......

Cocepts

Page 29: Optimizing For Readability

Method too long

Page 30: Optimizing For Readability

Short Methods

Page 31: Optimizing For Readability

<= 8 LOC

Page 32: Optimizing For Readability

Extract Methods

Page 33: Optimizing For Readability

do_one_thingdo_another_thingdo_something_more

Cocepts

Page 34: Optimizing For Readability

# context, outlet, times, time per step, state, datadef pattern(c, o, t, l, s, d) # ...end

Page 35: Optimizing For Readability

Incomprehensible names

Page 36: Optimizing For Readability

# context, outlet, times, time per step, state, datadef pattern(c, o, t, l, s, d) # ...end

Page 37: Optimizing For Readability

# context, outlet, times, time per step, state, datadef pattern(c, o, t, l, s, d) # ...end

Page 38: Optimizing For Readability

Explanatory names

Page 39: Optimizing For Readability

Naming is hard

Page 40: Optimizing For Readability

def pattern(context, outlet, time, time_per_step, state, data) # ...end

Page 41: Optimizing For Readability

Argument order dependency

Page 42: Optimizing For Readability

Try to keep it to 2 parameters

Page 43: Optimizing For Readability

Example

Page 44: Optimizing For Readability

# allowed to drink?if customer.age >= 18 say 'Okay' drink = prepare_drink requested_drink say 'here you go' hand_drink_over drink, customerelse say 'I am sorry you are not legally allowed rather to drink here' say "Would you rather have a #{['cola', 'mate'].sample}?"end

Page 45: Optimizing For Readability

# allowed to drink?if customer.age >= 18 say 'Okay' drink = prepare_drink requested_drink say 'here you go' hand_drink_over drink, customerelse say 'I am sorry you are not legally allowed rather to drink here' say "Would you rather have a #{['cola', 'mate'].sample}?"end

Page 46: Optimizing For Readability

No magic numbers

Page 47: Optimizing For Readability

NON_ALCOHOLIC_DRINKS = ['cola', 'mate']MIN_DRINKING_AGE = 18

Page 48: Optimizing For Readability

# allowed to drink?if customer.age >= MIN_DRINKING_AGE say 'Okay' drink = prepare_drink requested_drink say 'here you go' hand_drink_over drink, customerelse say 'I am sorry you are not legally allowed rather to drink here' say "Would you rather have a #{NON_ALCOHOLIC_DRINKS.sample}?"end

Page 49: Optimizing For Readability

# allowed to drink?if customer.age >= MIN_DRINKING_AGE say 'Okay' drink = prepare_drink requested_drink say 'here you go' hand_drink_over drink, customerelse say 'I am sorry you are not legally allowed rather to drink here' say "Would you rather have a #{NON_ALCOHOLIC_DRINKS.sample}?"end

Page 50: Optimizing For Readability

# allowed to drink?if customer.age >= MIN_DRINKING_AGE say 'Okay' drink = prepare_drink requested_drink say 'here you go' hand_drink_over drink, customerelse say 'I am sorry you are not legally allowed rather to drink here' say "Would you rather have a #{NON_ALCOHOLIC_DRINKS.sample}?"end

Page 51: Optimizing For Readability

Query method

Page 52: Optimizing For Readability

Intention revealing method

Page 53: Optimizing For Readability

# ...text.color = red# ...

Page 54: Optimizing For Readability

# ...text.color = red# ...

Page 55: Optimizing For Readability

# ...highlight(text)# ...

Page 56: Optimizing For Readability

def highlight(text) text.color = redend

Page 57: Optimizing For Readability

def highlight(text) text.color = red text.underline = true update_highlightsend

Page 58: Optimizing For Readability

# ...text.color = redtext.underline = trueupdate_highlights# ...

Page 59: Optimizing For Readability

# ...highlight(text)# ...

Page 60: Optimizing For Readability

# allowed to drink?if customer.age >= MIN_DRINKING_AGE say 'Okay' drink = prepare_drink requested_drink say 'here you go' hand_drink_over drink, customerelse say 'I am sorry you are not legally allowed rather to drink here' say "Would you rather have a #{NON_ALCOHOLIC_DRINKS.sample}?"end

Page 61: Optimizing For Readability

# allowed to drink?if customer.age >= MIN_DRINKING_AGE say 'Okay' drink = prepare_drink requested_drink say 'here you go' hand_drink_over drink, customerelse say 'I am sorry you are not legally allowed rather to drink here' say "Would you rather have a #{NON_ALCOHOLIC_DRINKS.sample}?"end

Page 62: Optimizing For Readability

# allowed to drink?if customer.age >= MIN_DRINKING_AGE say 'Okay' drink = prepare_drink requested_drink say 'here you go' hand_drink_over drink, customerelse say 'I am sorry you are not legally allowed rather to drink here' say "Would you rather have a #{NON_ALCOHOLIC_DRINKS.sample}?"end

Page 63: Optimizing For Readability

# allowed to drink?if customer.age >= MIN_DRINKING_AGE say 'Okay' drink = prepare_drink requested_drink say 'here you go' hand_drink_over drink, customerelse say 'I am sorry you are not legally allowed rather to drink here' say "Would you rather have a #{NON_ALCOHOLIC_DRINKS.sample}?"end

Page 64: Optimizing For Readability

if allowed_to_drink_alcohol?(customer) serve_drink requested_drink, customerelse propose_non_alcoholic_drinkend

Page 65: Optimizing For Readability

„If you have a good name for a method you don't need to

look at the body.“Martin Fowler

Page 66: Optimizing For Readability

„The easiest code to understand is the code you don't have to read at all.“

Tom Stuart (Berlin)

Page 67: Optimizing For Readability

prepare_drink requested_drinkprice = requested_drink.pricecheck = Check.newcheck.add_price pricesay 'That whill be ' + check.total

Page 68: Optimizing For Readability

prepare_drink requested_drinkprice = requested_drink.pricecheck = Check.newcheck.add_price pricesay 'That whill be ' + check.total

Page 69: Optimizing For Readability

prepare_drink requested_drinkprice = requested_drink.pricecheck = Check.newcheck.add_price pricesay 'That whill be ' + check.total

Page 70: Optimizing For Readability

Same level of abstraction in a method

Page 71: Optimizing For Readability

prepare_drink requested_drinkprepare_check requested_drink

Page 72: Optimizing For Readability

Nice code formatting

Page 73: Optimizing For Readability

@left ||= 0@top ||= 0@width ||= 1.0@height ||= 0

Page 74: Optimizing For Readability

double character: 'something weird', stateMask: CTRL | modifier, KeyCode: character.downcase.ord

Page 75: Optimizing For Readability

80 character width limit

Page 76: Optimizing For Readability

80 character width limit

Page 77: Optimizing For Readability

80 character width limit

Page 78: Optimizing For Readability

80 character width limit

Page 79: Optimizing For Readability

80 character width limit

Page 80: Optimizing For Readability

Identify concepts

Page 81: Optimizing For Readability

One language

Page 82: Optimizing For Readability

Don't Repeat Yourself

Page 83: Optimizing For Readability

Nurturing a code base

Page 84: Optimizing For Readability

Code bases detoriate

Page 85: Optimizing For Readability

No broken windows!

Page 86: Optimizing For Readability
Page 87: Optimizing For Readability
Page 88: Optimizing For Readability

Magical time?

Page 89: Optimizing For Readability

The boyscout rule

Page 90: Optimizing For Readability
Page 91: Optimizing For Readability

Opportunistic Refactoring

Page 92: Optimizing For Readability

TDD

Page 93: Optimizing For Readability

80% Code Coverage

Page 94: Optimizing For Readability

20% is never executed

Page 95: Optimizing For Readability

Code Review Culture

Page 96: Optimizing For Readability

„Brown Bag“ lunches

Page 97: Optimizing For Readability

Pair Programming

Page 98: Optimizing For Readability

Reaping the benefits

Page 99: Optimizing For Readability

Know when to break the rules

Page 100: Optimizing For Readability

If you still like your code from two years ago,

then you are not learning fast enough.

Page 101: Optimizing For Readability

Enjoy writing readable code!

Tobias Pfeiffer@PragTob

pragtob.info

Page 103: Optimizing For Readability

Photo Credit● http://officeimg.vo.msecnd.net/en-us/images/MP900439313.jpg

● http://officeimg.vo.msecnd.net/en-us/images/MC900021328.wmf

● http://www.osnews.com/story/19266/WTFs_m

● (CC BY-SA 2.0)

– http://www.flickr.com/photos/83633410@N07/7658272558/in/photostream/

– http://www.flickr.com/photos/83633410@N07/7658165122/

– https://www.flickr.com/photos/93425126@N00/313056379/

● (CC BY-NC-ND 2.0)

– http://www.flickr.com/photos/andih/86577529/

– http://www.flickr.com/photos/12584908@N08/3293117576/

– http://www.flickr.com/photos/jasonlparks/4525188865/

– http://www.flickr.com/photos/20714221@N04/2293045156/

– https://www.flickr.com/photos/eyewash/2603717864/

– https://www.flickr.com/photos/stevie_gill/3950697539/

– https://www.flickr.com/photos/randar/15787696685/

● http://www.flickr.com/photos/47833351@N02/5488791911/(CC BY-ND 2.0)

● (CC BY 2.0)

– http://www.flickr.com/photos/barry_b/76055201/

– http://www.flickr.com/photos/25165196@N08/7725273678/

– http://www.flickr.com/photos/29254399@N08/3187186308/

– https://www.flickr.com/photos/garryknight/5650367750/

– https://www.flickr.com/photos/alper/10742816123/

● (CC BY-NC-SA 2.0)

– http://www.flickr.com/photos/dolescum/7380616658/

– http://www.flickr.com/photos/antonkovalyov/5795281215/

– http://www.flickr.com/photos/doug88888/2792209612/

– https://www.flickr.com/photos/denverjeffrey/4392418334/

● (CC BY-NC 2.0)

– http://www.flickr.com/photos/37996583811@N01/5757983532/

– http://www.flickr.com/photos/sevendead/5650065458/

– https://www.flickr.com/photos/whitecatsg/3146092196/