From data structure and object to architecture to refactoring. YouTube videos included. Summary of Clean Code: A Handbook of Agile Software Craftsmanship: by Robert C Martin
References:
Clean Code: A Handbook of Agile Software Craftsmanship: by Robert C Martin (http://www.amazon.com/Clean-Code-Handbook-
Software-Craftsmanship/dp/0132350882)
Design Patterns: ELements of Reusable Object-Oriented Software by Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
The Clean Code Talks - "Global State and Singletons"
https://www.youtube.com/watch?v=-FRm3VPhseI
6. Smart vs Professional
Smart
Great Coding Skill
Write advanced code
String r; // lowercase url
Professional
Readable code
Maintainable code
String lowercaseUrl;
Monday, 11 March, 13
Skygear.io
7. Name
Choose your names thoughtfully
If a name requires a comment, the name
does not reveal its intent
Monday, 11 March, 13
Skygear.io
8. Name
Choose your names thoughtfully
If a name requires a comment, the name
does not reveal its intent
int d;
What does it mean? Days? Diameter?
Monday, 11 March, 13
Skygear.io
9. Name
Choose your names thoughtfully
If a name requires a comment, the name
does not reveal its intent
int d;
What does it mean? Days? Diameter?
int d; //elapsed time in days
Is this any better?
Monday, 11 March, 13
Skygear.io
10. Name
Choose your names thoughtfully
If a name requires a comment, the name
does not reveal its intent
int d;
What does it mean? Days? Diameter?
int elapsedTimeInDays;
What about this?
int d; //elapsed time in days
Is this any better?
Monday, 11 March, 13
Skygear.io
11. Name
Choose part of speech well
method / function => verb
class / object => noun
def authentication
# ...
end
def authenticate
# ...
end
Monday, 11 March, 13
Skygear.io
12. Name
use Pronounceable Names
class DtaRcrd102 {
private Date genymdhms;
private Date modymdhms;
private final String pszqint = “102”;
}
class Customer {
private Date generationTimestamp;
private Date modificationTimestamp;
private final String recordId = “102”;
}
Monday, 11 March, 13
Skygear.io
13. Names...
Avoid encodings
public class Part {
private String mName;
void setName(String name) {
mName = name;
}
}
public class Part {
private String name;
void setName(String name) {
this.name = name;
}
}
Hungarian notation
bBusy: boolean
chInitial: char
cApples: count of items
fpPrice: floating-point
dbPi: double (Systems)
pFoo: pointer
Monday, 11 March, 13
Skygear.io
14. Discussion:
Android vs IOS
ListView listView = new ListView(context);
listView.setAdapter(anAdapter);
UITableView tableView =
[[UITableView alloc]
initWithFrame:aFrame
style:UITableViewStylePlain];
tableView.datasource = aDataSource;
Android:
IOS:
Which one is better?
Monday, 11 March, 13
Skygear.io
15. Adapter
The adapter pattern is adapting between
classes and objects, like a bridge between
two objects.
e.g.
SimpleCursorAdapter
ArrayAdapter
Monday, 11 March, 13
Skygear.io
16. Adapter
Title: Design Patterns: Elements of
Reusable Object-Oriented Software
Author:
John Vlissides
Richard Helm
Ralph Johnson
Erich Gamma
Monday, 11 March, 13
Skygear.io
18. Use design pattern as name
Use Solution Domain Names, e.g.
AccountVisitor
JobQueue
LabelObserver
SimpleCursorAdapter
Monday, 11 March, 13
Skygear.io
25. Deceptive API
testCharge() {
database = new Database(...);
queue = new OfflineQueue(database);
creditCardProcessor = new CreditCardProcessor(queue);
CreditCard cc;
cc = new CreditCard(“1234567890121234”,
creditCardProcessor);
cc.charge(100);
}
Dependency injection enforces the order of
initialization at compile time.
Monday, 11 March, 13
Skygear.io
30. Good Comments
Informative Comments
// format matched kk:mm:ss EEE, MMM dd, yyyy
Pattern timePattern =
Pattern.compile(
“d*:d*:d* w*, w* d*, d*”);
Todo Comments
/*
TODO: All calls to getPage should actually come
here, and be relative to the current page, not the
parent page. It was a gross error to have the whole
wiki know that references were relative to the
parent instead of the page.
*/
Pubic API documentation
Monday, 11 March, 13
Skygear.io
31. Bad Comments
Redundant Comments
/**
* The processor delay for this component.
*/
protected int backgroundProcessorDelay = -1;
/**
* The container event listeners for this Container.
*/
protected ArrayList listeners = new ArrayList();
Monday, 11 March, 13
Skygear.io
32. Bad Comments
Attribution Comments
/* Added by Gary */
Big Banner Comments
// **********************
// * Instance Variables *
// *********************
private int myVariable;
// ***********************
// * Default Constructor *
// ***********************
public MyClass() {}
Monday, 11 March, 13
Skygear.io
33. Mumbling
/* For bug FS-13005, we had to add this. The bug
was that the Now Playing screen was somehow being
launched, in that viewDidAppear was being called, but the view
was not being shown on the screen. The Now Playing screen then
when on to do all it's stuff and the user was left looking at an
incomplete Mode screen. So the "fix" is to kill off any residual Now
Playing screen that is under the Mode tab whenever we start a
new connection to a radio. */
What is
FS-13005?
Sorry! I have
no idea what you are talking about.
Monday, 11 March, 13
Skygear.io
35. Function
should be Small
does one thing
the ideal number of arguments for a
function is .... 0
the less arguments, the better
try not to more than 3 arguments
Monday, 11 March, 13
Skygear.io
36. Function
No Side effects
// do something or answer something, but not both
public boolean set(String attribute, String value);
if (attributeExists(“username”)) {
setAttribute(“username”, “Ben”);
}
Monday, 11 March, 13
Skygear.io
37. Class
Avoid God Class
In OO, God Class is a class that does lots
of things
example: UITableViewController
Monday, 11 March, 13
Skygear.io
38. Data Structure and Object
public class Square {
public Point topLeft;
public double side;
}
public class Geometry {
public double calculateArea(Object shape)
throws noSuchShapeException {
if (shape instanceof Square) {
Square square = (Square)shape;
return square.side * square.side;
} else if (shape instanceof Rectangle) {
Rectangle rectangle = (Rectangle)shape;
return rectangle.height * rectangle.width;
}
throw new NoSuchShapeException();
}
}
public class Rectangle {
public Point topLeft;
public double height;
public double width;
}
Monday, 11 March, 13
Skygear.io
39. Data Structure and Object
public class Square implements Shape {
public Point topLeft;
public double side;
public double area() {
return side*side;
}
}
public class Rectangle implements Shape{
public Point topLeft;
public double height;
public double width;
public double area() {
return height * width;
}
}
Monday, 11 March, 13
Skygear.io
40. Data Structure and Object
Procedural Code (code using data structure)
Pros: easy to add new functions without
changing existing data structure
Cons: hard to add new data structure all
the functions must change
OO code
Pros: easy to add new classes without
changing existing function
Cons: hard to a new function as all classes
must change
Monday, 11 March, 13
Skygear.io
41. Data Structure and Object
Procedural Code (code using data structure)
Pros: easy to add new functions without
changing existing data structure
Cons: hard to add new data structure all
the functions must change
OO code
Pros: easy to add new classes without
changing existing function
Cons: hard to a new function as all classes
must change
Avoid Hybrids
Monday, 11 March, 13
Skygear.io
52. Test - a real scenario
...
client server
workerss3
1. upload a video
2. store in s3
3. start worker and
send request to worker
4. dedicated worker pulls the file
from s3 and do transcoding
Monday, 11 March, 13
Skygear.io
53. Test
Remove FEAR during Development
You know you break something during
testing.
For example:
Rugby - ~178 tests
Refer to Ben’s presentation
https://speakerdeck.com/oursky/testing
Monday, 11 March, 13
Skygear.io
56. Familiar With your Tools
try to familiar with your tools before coding,
don’t create messy stuffs by your first
impression
do testing before adopting to the real code
read the API, doc and Google
ask others ...
Monday, 11 March, 13
Skygear.io
57. Quiz (javascript)
The expected output of the following
javascript is alert count down from 5 to 0.
Explain why it doesn’t work and fix the bug.
function count (num) {
for (var i = 0; i <= num; i += 1) {
setTimeout(function () {
alert(num - i);
}, i * 1000);
}
}
count(5);
Monday, 11 March, 13
Skygear.io
58. Quiz (javascript)
function count (num) {
for (var i = 0; i <= num; i += 1) {
(function (time) {
setTimeout(function () {
alert(num - time);
}, time * 1000);
}(i));
}
}
count(5);
Monday, 11 March, 13
Skygear.ioSkygear.io
59. Quiz (javascript) cont.
function changeAnchorsToLightBox(anchors) {
var length = anchors.length;
for (var i = 0; i < length; i++) {
anchors[i].onclick = function () {
lightBox.open(anchors[i]);
return false;
};
}
}
Monday, 11 March, 13
Skygear.io
60. Quiz (javascript) cont.
function changeAnchorsToLightBox(anchors) {
var length = anchors.length;
for (var i = 0; i < length; i++) {
(function (anchor) {
anchor.onclick = function () {
lightBox.open(anchor);
return false;
};
}(anchors[i]));
}
}
Monday, 11 March, 13
Skygear.io
61. Quiz (javascript) cont.
function changeAnchorsToLightBox(anchors) {
var length = anchors.length;
for (var i = 0; i < length; i++) {
(function (anchor) {
anchor.onclick = function () {
lightBox.open(anchor);
return false;
};
}(anchors[i]));
}
}
Monday, 11 March, 13
Skygear.io
62. Reference
Clean Code: A Handbook of Agile Software
Craftsmanship
http://www.amazon.com/Clean-Code-Handbook-
Software-Craftsmanship/dp/0132350882
The Clean Code Talks - "Global State and
Singletons"
https://www.youtube.com/watch?v=-FRm3VPhseI
Monday, 11 March, 13
Skygear.io
63. Q & A and ...
“Any fool can write code that a computer can understand.
Good programmers write code that humans can understand.”
Martin Fowler:
Monday, 11 March, 13
Skygear.io
64. Brought to you by Oursky
Build your mobile app fast
skygear.io (open source)