clean code bites
DESCRIPTION
Examples of applying clean code practices in O/O software developmentTRANSCRIPT
![Page 1: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/1.jpg)
Clean code Bites
Applying clean code
Roy Nitert
28-3-2012
![Page 2: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/2.jpg)
© Sioux 2012 | Confidential | 2
Agenda
Why clean code What is clean code Examples:o SRPo Small methodso Descriptive nameso Parameterso DRY
![Page 3: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/3.jpg)
© Sioux 2012 | Confidential | 3
Why clean code ?
So it is easier to understand (readability) and cheaper to modify (maintainability) software
The code you write will be read more times than it was written and by more people.
Focus on the small things that make us better programmers.
![Page 4: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/4.jpg)
© Sioux 2012 | Confidential | 4
What is clean code ?
![Page 5: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/5.jpg)
© Sioux 2012 | Confidential | 5
What is clean code ?
http://en.wiktionary.org/wiki/clean_code
Noun
clean code (plural clean codes)
(idiomatic) software code that is formatted correctly and in an organized manner so that another coder can easily read or modify it.
![Page 6: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/6.jpg)
© Sioux 2012 | Confidential | 6
What is clean code ?
Characteristics of clean code: Small methods and classes Descriptive names Not too many parameters in methods (and no flags) No obvious or irrelevant comments (code must be
self describing) No redundancy (DRY: don’t repeat yourself) No magic numbers Single responsibility principle (SRP) Uniform coding style
![Page 7: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/7.jpg)
© Sioux 2012 | Confidential | 7
SRP: Single Responsibility Principle
every object should have a single responsibility, and that responsibility should be entirelyencapsulated by the class.
a class or module should haveone, and only one, reason to change
If class names have ‘manager’ or ‘processor’ in them, they probably have multiple responsibilities
the "S" in "SOLID" stands for the single responsibility principle (“Principles Of OOD”, Robert C. Martin)
![Page 8: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/8.jpg)
© Sioux 2012 | Confidential | 8
SRP example
Public class DashboardManager {
public Component getLastFocusedComponent();
public void setLastFocused(Component lastFocused);
public int getMajorVersionNumber();
public int getMinorVersionNumber();
public int getBuildNumber();
}
![Page 9: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/9.jpg)
© Sioux 2012 | Confidential | 9
SRP example
Public class FocusedComponent {
public Component getLastFocusedComponent();
public void setLastFocused(Component lastFocused);
Public class Version {
public int getMajorVersionNumber();
public int getMinorVersionNumber();
public int getBuildNumber();
}
![Page 10: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/10.jpg)
© Sioux 2012 | Confidential | 10
Small methods
They should be very very small Should do one thing, do it well, do it only One level of abstraction Should read like a narrative Should not have sections Blocks within if, else and while
statements should be one line long
![Page 11: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/11.jpg)
© Sioux 2012 | Confidential | 11
Small methods example
public static String renderPageWithSetupsAndTeardowns(
PageData pageData, boolean isSuite
) throws Exception {
boolean isTestPage = pageData.hasAttribute(“Test”);
if (isTestPage) {
WikiPage testPage = pageData.getWikiPage();
StringBuffer newPageContent = new StringBuffer();
includeSetupPages(testPage, newPageContent, isSuite);
newPageContent.append(pageData.getContent());
includeTeardownPages(testPage, newPageContent, isSuite);
pageData.setContent(newPageContent.toString());
}
return pageData.getHTML();
}
![Page 12: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/12.jpg)
© Sioux 2012 | Confidential | 12
Small methods example
public static String renderPageWithSetupsAndTeardowns(
PageData pageData, boolean isSuite
) throws Exception {
if (isTestPage(pageData))
includeSetupAndTeardownPages(pageData, isSuite);
return pageData.getHTML();
}
![Page 13: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/13.jpg)
© Sioux 2012 | Confidential | 13
Descriptive names
Names make software readable Helps clarify the design in your mind Use long names for long scopes Avoid encodings
![Page 14: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/14.jpg)
© Sioux 2012 | Confidential | 14
Descriptive names example
Public int x() {
int q = 0;
int z = 0;
for (int kk = 0; kk < 10; kk++) {
if (l[z] == 10) {
q += 10 + (l[z + 1] + l[z + 2]);
z += 1;
} else if (l[z] + l[z + 1] == 10) {
q += 10 + l[z + 2];
z += 2;
} else {
q += l[z] + l[z + 1];
z += 2;
}
}
return q;
}
![Page 15: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/15.jpg)
© Sioux 2012 | Confidential | 15
Descriptive names example
Public int score() {
int score = 0;
int frame = 0;
for (int frameNumber = 0; frameNumber < 10; frameNumber++) {
if (isStrike(frame)) {
score += 10 + nextTwoBallsForStrike(frame);
frame += 1;
} else if (isSpare(frame)) {
score += 10 + nextBallForSpare(frame);
frame += 2;
} else {
score += TwoBallsInFrame(frame);
frame += 2;
}
}
return score;
}
![Page 16: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/16.jpg)
© Sioux 2012 | Confidential | 16
Parameters / arguments
Small number: Zero is best, followed by one, two or three
More than three is questionable Output arguments are counterintuitive Boolean arguments (flags) loudly declare than
the function does more than one thing Simpler is easy to understand and easy to test Reduce number of arguments by creating
objects out of them
![Page 17: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/17.jpg)
© Sioux 2012 | Confidential | 17
Parameters example
Circle makeCircle(double x, double y, double radius);
public void AlignTaskCanBeStopped(bool useRealXps);
AlignTaskCanBeStopped(true);
![Page 18: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/18.jpg)
© Sioux 2012 | Confidential | 18
Parameters example
Circle makeCircle(Point center, double radius);
public void AlignTaskCanBeStoppedWith RealXps();
public void AlignTaskCanBeStoppedWith SimulatedXps();
![Page 19: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/19.jpg)
© Sioux 2012 | Confidential | 19
Don’t repeat yourself
Duplication DRY principle (Dave Thomas) Once, and only once (Kent Beck) Duplication is a missed opportunity for abstraction Examples:o Identical code (copy/paste)o Switch/case (or if/else) chainso Similar algorithms
Design patterns and OO itself are strategies for eliminating duplication
![Page 20: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/20.jpg)
© Sioux 2012 | Confidential | 20
DRY example
public void scaleToOneDimension( float desiredDimension, float imageDimension) {
if (Math.abs(desiredDimension – imageDimension) < errorThreshold)
return;
float scalingFactor = desiredDimension / imageDimension;
scalingFactor = (float)(Math.floor(scalingFactor * 100) * 0.01f);
RenderOp newImage = ImageUtilities.getScaledImage( image, scalingFactor, scalingFactor);
image.dispose();
System.gc();
image = newImage;
}
public synchronized void rotate(int degrees) {
RenderOp newImage = ImageUtilities.getRotatedImage( image, degrees);
image.dispose();
System.gc();
image = newImage;
}
![Page 21: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/21.jpg)
© Sioux 2012 | Confidential | 21
DRY example
public void scaleToOneDimension( float desiredDimension, float imageDimension) {
if (Math.abs(desiredDimension – imageDimension) < errorThreshold)
return;
float scalingFactor = desiredDimension / imageDimension;
scalingFactor = (float)(Math.floor(scalingFactor * 100) * 0.01f);
replaceImage(ImageUtilities.getScaledImage( image, scalingFactor, scalingFactor));
}
public synchronized void rotate(int degrees) {
replaceImage(ImageUtilities.getRotatedImage( image, degrees));
}
private void replaceImage(RenderedOp newImage) {
image.dispose();
System.gc();
image = newImage;
}
![Page 22: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/22.jpg)
© Sioux 2012 | Confidential | 22
Applying clean code
Know how to write clean code Think about these small improvements
during:o New developmento Code reviewso Changing codeo Fixing bugs
So code will be easier to understand and cheaper to modify
![Page 23: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/23.jpg)
© Sioux 2012 | Confidential | 23
Conclusion
Write code as if the person who is going to maintain it, is a psychopath who knows
where you live.
![Page 24: Clean code bites](https://reader033.vdocument.in/reader033/viewer/2022061111/5454a749af79593f778b4da3/html5/thumbnails/24.jpg)
© Sioux 2012 | Confidential | 24
Questions?