The Art Of Readable Code

89
The Art of Readable Code Simple and Practical Techniques for Writing Better Code

Transcript of The Art Of Readable Code

Page 1: The Art Of Readable Code

The Art of Readable CodeSimple and Practical Techniques for Writing Better Code

Page 2: The Art Of Readable Code
Page 3: The Art Of Readable Code

Code Should Be Easy to Understand

Page 4: The Art Of Readable Code

for (Node* node = list->head; node != NULL; node = node->next) { Print(node->data); }

Node* node = list->head;if (node == NULL) return;while (node->next != NULL) { Print(node->data); node = node->next;}if (node != NULL) { Print(node->data);}

Page 5: The Art Of Readable Code

(_=[_=[]][(_+!![])[$=(!!_/!!_)]+(!!$+_)[-~-~$]+'v'+(!(_/_)+[])[-~-~$]+(!([]/($))+[])[$]+([]+!_)[-~-~$]+(!!{}+[])[-~-~$]])()[(!({}+_)+_)[$]+(!({}+[])+[])[-~$]+((''+!![]+''))[-~-~$]+(!![]+'')[$]+((!!_+[]))[$-$]]($/$);

alert(1)

Page 6: The Art Of Readable Code

Key Idea

• Code should be easy to understand.

• Minimize the time it would take for someone else to understand it.

Page 7: The Art Of Readable Code

Is Smaller Always Better?

Page 8: The Art Of Readable Code

Conflict with Other Goals?

Code EfficientWell-Architected

Easy to Test

Highly Maintainable…

Page 9: The Art Of Readable Code

Three Levels

• Surface Level

• Loops & Logic

• Reorganizing

Page 10: The Art Of Readable Code

Surface-Level

Page 11: The Art Of Readable Code

Packing Information into Names

Page 12: The Art Of Readable Code

• Specific

• Avoid Generic Names

• Prefer Concrete Names

• Extra Information

• Length vs Meaning

• Formatting

Page 13: The Art Of Readable Code
Page 14: The Art Of Readable Code

Word Alternative

send deliver, dispatch, announce, distribute, route

find search, extract, locate, recover

start launch, create, begin, open

make create, set up, build, generate, compose, add, new

Page 15: The Art Of Readable Code
Page 16: The Art Of Readable Code

Naming Conventions

• Noun for variable name, object name, class name, property name, arguments name

• Verb for function name, method name

Page 17: The Art Of Readable Code
Page 18: The Art Of Readable Code

CasemaptypeCtrl.streetMapMgr(true);

maptypeCtrl.showStreetMap();

A Better One

Page 19: The Art Of Readable Code
Page 20: The Art Of Readable Code

Length

• Shorter names for shorter scopes

• Longer names for larger scopes

Page 21: The Art Of Readable Code

Names That Can’t Be Misconstrued

Page 22: The Art Of Readable Code

Key Idea

• Asking yourself, “What other meanings could someone interpret from this name?”

Page 23: The Art Of Readable Code

• Prefer min and max for(inclusive) limits

• Naming booleans

• Matching expectations of Users

Page 24: The Art Of Readable Code

Casevar read_password = true;

var need_password = true;

var user_authenticated = true;

A Better One

Page 25: The Art Of Readable Code

Casemap.getBestMap(points);

map.setViewport(points);

A Better One

Page 26: The Art Of Readable Code

Aesthetic

Page 27: The Art Of Readable Code

Aesthetic

• Use consistent layout.

• Make similar code look similar.

• Group related lines of code into blocks.

Page 28: The Art Of Readable Code
Page 29: The Art Of Readable Code
Page 30: The Art Of Readable Code

Knowing What to Comment

Page 31: The Art Of Readable Code

Key Idea

• The purpose of commenting is to help the reader know as much as the writer did.

Page 32: The Art Of Readable Code

What NOT to Comment

• KEY IDEA:Don’t comment on the facts that can be derived quickly from the code itself

Page 33: The Art Of Readable Code
Page 34: The Art Of Readable Code

Case!

// 延时关闭信息窗⼝口

setTimeout(function(){

map.closeInfoWindow();

}, 100);

Page 35: The Art Of Readable Code

Case!

// 添加为全局对象;window.mapSubway = me;

Page 36: The Art Of Readable Code

Recording Your Thoughts

• Include “Director Commentary”

• Comment the Flaws in Your Code

• Comment on Your Constants

Page 37: The Art Of Readable Code

Put Yourself in the Reader’s Shoes

• Anticipating Likely Questions

• Advertising Likely Pitfalls

• “Big Picture”

• Summary

Page 38: The Art Of Readable Code
Page 39: The Art Of Readable Code

Precise & Compact Comments

Page 40: The Art Of Readable Code

• Keep Comments Compact

• Describe Function Behavior Precisely

• Use Examples

• State the Intent

Page 41: The Art Of Readable Code

Case// 返回⽂文件⾏行数int CountLines(string filename) {...}

A Better One// 计算换⾏行符'\n'的个数int CountLines(string filename) {...}

Page 42: The Art Of Readable Code

Caseif (mode == "bustime") { var a = minutes % 10, b = parseInt(minutes / 10); minutes = a != 0 ? (a > 5 ? (++b * 10) : b ? (b * 10) : 5): minutes;

Need Examples!

Page 43: The Art Of Readable Code

Loops & Logic

Page 44: The Art Of Readable Code

Making Control Flow Easy to Read

Page 45: The Art Of Readable Code

KEY IDEA

• Make your logic as “natural” as possible

Page 46: The Art Of Readable Code

Case

if (length >= 10)

if (10 <= length)

while (bytes_received < bytes_expected)

while (bytes_expected > bytes_received)

Page 47: The Art Of Readable Code

Order of if/else Blocks

• Positive First

• Simpler First

• Interesting First

Page 48: The Art Of Readable Code

?: Conditional Expression

• Often Less Readable

Page 49: The Art Of Readable Code

KEY IDEA

• Minimize the time needed for someone to understand it instead of minimizing the number of lines.

Page 50: The Art Of Readable Code

ADVICE

• Use ternary ?: only for the simplest cases.

Page 51: The Art Of Readable Code

• Avoid do/while Loops

• Returning Early form a Function

• Minimize Nesting

• Flow of Execution

Page 52: The Art Of Readable Code
Page 53: The Art Of Readable Code

Breaking Down Giant Expressions

Page 54: The Art Of Readable Code

• Explaining Variables

• Summary Variables

• Use De Morgan’s Laws

• Break Down Giant Statements

Page 55: The Art Of Readable Code

Case

if (line.split(':')[0] == 'admin')

var userName = line.split(':')[0]; if (userName == 'admin')

Page 56: The Art Of Readable Code

Case

if (navigator.userAgent.indexOf('UC') > -1)

if (navigator.userAgent.indexOf('UC') == -1)

var isUC = navigator.userAgent.indexOf('UC') > -1;

if (isUC)

if (!isUC)

Page 57: The Art Of Readable Code

Casevar update_highlight = function (message_num) {

if ($("#vote_value" + message_num).html() === "Up") {

$("#thumbs_up" + message_num).addClass("highlighted");

$("#thumbs_down" + message_num).removeClass("highlighted");

} else if ($("#vote_value" + message_num).html() === "Down") {

$("#thumbs_up" + message_num).removeClass("highlighted");

$("#thumbs_down" + message_num).addClass("highlighted");

} else {

$("#thumbs_up" + message_num).removeClass("highighted");

$("#thumbs_down" + message_num).removeClass("highlighted");

}

};

Page 58: The Art Of Readable Code

var update_highlight = function (message_num) {

var thumbs_up = $("#thumbs_up" + message_num);

var thumbs_down = $("#thumbs_down" + message_num);

var vote_value = $("#vote_value" + message_num).html();

var hi = "highlighted";

if (vote_value === "Up") {

thumbs_up.addClass(hi);

thumbs_down.removeClass(hi);

} else if (vote_value === "Down") {

thumbs_up.removeClass(hi);

thumbs_down.addClass(hi);

} else {

thumbs_up.removeClass(hi);

thumbs_down.removeClass(hi);

}

};

Page 59: The Art Of Readable Code

Variables

Page 60: The Art Of Readable Code

Problems

• More variables, harder to keep track of them

• Bigger variable’s scope, longer you have to keep track of them

• More often variable changes, harder to keep track of its current value

Page 61: The Art Of Readable Code

Eliminating Variables

• Useless Temporary Variables

• Eliminating Intermediate Results

• Eliminating Control Flow Variables

Page 62: The Art Of Readable Code
Page 63: The Art Of Readable Code

Casevar remove_one = function(array, value_to_remove) { var index_to_remove = null; for (var i = 0; i < array.length; i ++) { if (array[i] === value_to_remove) { index_to_remove = i; break; } } if (index_to_remove !== null) { array.slice(index_to_remove, 1); } }

Page 64: The Art Of Readable Code

Case

var remove_one = function(array, value_to_remove) { for (var i = 0; i < array.length; i ++) { if (array[i] === value_to_remove) { array.slice(i, 1); return; } } }

Page 65: The Art Of Readable Code

Shrink the Scope

• Make variable visible by as few lines of code as possible.

Page 66: The Art Of Readable Code

Prefer write-once variables

• KEY IDEA: The more places a variable is manipulated, the harder it is to reason about its current value.

Page 67: The Art Of Readable Code

Reorganizing

Page 68: The Art Of Readable Code

Extracting Unrelated Subproblems

Page 69: The Art Of Readable Code

Casefunction findClosestLocation(latLng, latLngs) { var closest; var closest_dist = Number.MAX_VALUE; for each latlng in latLngs, calculate the distance, if new distance is shorter than current, set closest to the new latlng return closest; }

Page 70: The Art Of Readable Code

What is the unrelated subproblem?

Compute the spherical distance

Page 71: The Art Of Readable Code

• Pure Utility Code

• General-Purpose Code

• Project-Specific Functionality

• Simplifying an Existing Interface

Page 72: The Art Of Readable Code

Case

setCookie(key, value);

getCookie(key);

deleteCookie(key);

hasCookie(key);

Cookie

Page 73: The Art Of Readable Code

Further Reading

Page 74: The Art Of Readable Code

One Task at a Time

Page 75: The Art Of Readable Code

KEY IDEA

• Code should be organized so that it’s doing only one task at a time.

Page 76: The Art Of Readable Code

Turning Thoughts into Code

Page 77: The Art Of Readable Code

• Describe what code needs to do, in plain English(we should use Chinese)

• Pay attention to key words and phrases

• Write your code to match description

Page 78: The Art Of Readable Code

Case$is_admin = is_admin_request(); if ($document) { if (!$is_admin && ($document['username']) != $_SESSION['username'])){ return not_authorized(); } } else { if (!$is_admin) { return not_authorized(); } } // continue rendering the page ...

Page 79: The Art Of Readable Code

Caseif (is_admin_request()) { // authorized } elseif ($document && $document['username']) != $_SESSION['username'])) { // authorized } else { return not_authorized(); } // continue rendering the page ...

Page 80: The Art Of Readable Code

Writing Less Code

Page 81: The Art Of Readable Code

KEY IDEA

• The most readable code is

NO CODE AT ALL

Page 82: The Art Of Readable Code
Page 83: The Art Of Readable Code

Case

• Calculating Distance Between Two Locations

Page 84: The Art Of Readable Code

• Don’t implement code that you won’t need

• Simplify requirements

• Keep your codebase small

• Be familiar with Libraries around you

Page 85: The Art Of Readable Code
Page 86: The Art Of Readable Code

Further Reading

Page 87: The Art Of Readable Code

Further Reading

Page 88: The Art Of Readable Code

Further Reading

Page 89: The Art Of Readable Code

Q&A