Have you ever wanted to add a new feature to your code but instead found yourself spending hours trying to understand the existing code? Or adding a new feature and then finding out you've broken something else, supposedly unrelated, that used to work?
These slides hold a few tips on how to write code that'll be easier to understand, nicer to read and more simple to maintain.
10. public static void go() throws IOException {
BufferedReader inputReader =
new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.println("Please enter one of ... sum / copycat");
String input = inputReader.readLine();
if ("copycat".equals(input)) {
System.out.print(">");
System.out.println(inputReader.readLine());
}
public static void go() throws IOException {
BufferedReader inputReader =
new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.println("Please enter one of ... sum / copycat");
String input = inputReader.readLine();
if ("copycat".equals(input)) {
System.out.print(">");
System.out.println(inputReader.readLine());
}
Second Feature - Code
else if ("sum".equals(input)) {
System.out.println("Enter numbers to sum...");
String nToSIn = inputReader.readLine();
String[] nToS = nToSIn.split(" ");
String str = "Sum of ";
int sum = 0;
for (int i = 0; i < numbersToSum.length; i++) {
str += nToS[i] + ", ";
sum += Integer.parseInt(nToS[0]);
}
str = str.substring(0, str.length() - 2);
str += "is " + sum;
System.out.println(str);
}…}
else if ("sum".equals(input)) {
System.out.println("Enter numbers to sum...");
String nToSIn = inputReader.readLine();
String[] nToS = nToSIn.split(" ");
String str = "Sum of ";
int sum = 0;
for (int i = 0; i < numbersToSum.length; i++) {
str += nToS[i] + ", ";
sum += Integer.parseInt(nToS[0]);
}
str = str.substring(0, str.length() - 2);
str += "is " + sum;
System.out.println(str);
}…}
else if ("sum".equals(input)) {
System.out.println("Enter numbers to sum...");
String nToSIn = inputReader.readLine();
String[] nToS = nToSIn.split(" ");
String str = "Sum of ";
int sum = 0;
for (int i = 0; i < numbersToSum.length; i++) {
str += nToS[i] + ", ";
sum += Integer.parseInt(nToS[0]);
}
str = str.substring(0, str.length() - 2);
str += "is " + sum;
System.out.println(str);
}…}
else if ("sum".equals(input)) {
System.out.println("Enter numbers to sum...");
String nToSIn = inputReader.readLine();
String[] nToS = nToSIn.split(" ");
String str = "Sum of ";
int sum = 0;
for (int i = 0; i < numbersToSum.length; i++) {
str += nToS[i] + ", ";
sum += Integer.parseInt(nToS[0]);
}
str = str.substring(0, str.length() - 2);
str += "is " + sum;
System.out.println(str);
}…}
else if ("sum".equals(input)) {
System.out.println("Enter numbers to sum...");
String nToSIn = inputReader.readLine();
String[] nToS = nToSIn.split(" ");
String str = "Sum of ";
int sum = 0;
for (int i = 0; i < numbersToSum.length; i++) {
str += nToS[i] + ", ";
sum += Integer.parseInt(nToS[0]);
}
str = str.substring(0, str.length() - 2);
str += "is " + sum;
System.out.println(str);
}…}
else if ("sum".equals(input)) {
System.out.println("Enter numbers to sum...");
String nToSIn = inputReader.readLine();
String[] nToS = nToSIn.split(" ");
String str = "Sum of ";
int sum = 0;
for (int i = 0; i < numbersToSum.length; i++) {
str += nToS[i] + ", ";
sum += Integer.parseInt(nToS[0]);
}
str = str.substring(0, str.length() - 2);
str += "is " + sum;
System.out.println(str);
}…}
else if ("sum".equals(input)) {
System.out.println("Enter numbers to sum...");
String nToSIn = inputReader.readLine();
String[] nToS = nToSIn.split(" ");
String str = "Sum of ";
int sum = 0;
for (int i = 0; i < numbersToSum.length; i++) {
str += nToS[i] + ", ";
sum += Integer.parseInt(nToS[0]);
}
str = str.substring(0, str.length() - 2);
str += "is " + sum;
System.out.println(str);
}…}
11. public static void go() throws IOException {
BufferedReader inputReader =
new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.println("Please enter one of … sum/copycat");
String input = inputReader.readLine();
if ("copycat".equals(input)) {
// print a line from the user
System.out.print(">");
System.out.println(inputReader.readLine());
}
else if ("sum".equals(input)) {
// read numbers separated by space and print their sum
System.out.println("Enter numbers to sum...");
String nToSIn = inputReader.readLine();
String[] nToS = nToSIn.split(" ");
String str = "Sum of ";
int sum = 0;
for (int i = 0; i < numbersToSum.length; i++) {
str += nToS[i] + ", ";
sum += Integer.parseInt(nToS[0]);
}
str = str.substring(0, str.length() - 2);
str += "is " + sum;
System.out.println(str);
}
}
}
12.
13.
14. Agenda
● What is Clean Code?
● Example
● Some Basic Rules
● Culture
19. public class NumberTest {
@Test
public void testMultiplyByTwo() {
assertThat(Number.multiplyByTwo(2),is(4));
}
}
public class Number {
public static int multiplyByTwo(int number) {
return number;
}
}
public class NumberTest {
@Test
public void testMultiplyByTwo() {
assertThat(Number.multiplyByTwo(2),is(4));
}
}
public class Number {
public static int multiplyByTwo(int number) {
return number;
}
}
public class NumberTest {
@Test
public void testMultiplyByTwo() {
assertThat(Number.multiplyByTwo(2),is(4));
}
}
public class Number {
public static int multiplyByTwo(int number) {
return number;
}
}
20. public class NumberTest {
@Test
public void testMultiplyByTwo() {
assertThat(Number.multiplyByTwo(2),is(4));
}
}
public class Number {
public static int multiplyByTwo(int number) {
return number * 2;
}
}
public class NumberTest {
@Test
public void testMultiplyByTwo() {
assertThat(Number.multiplyByTwo(2),is(4));
}
}
public class Number {
public static int multiplyByTwo(int number) {
return number * 2;
}
}
23. public static void go() throws IOException {
BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.println("Please enter one of the following actions: sum / copycat");
String input = inputReader.readLine();
if ("copycat".equals(input)) {
System.out.print(">");
System.out.println(inputReader.readLine());
} else if ("sum".equals(input)) {
System.out.println("Enter numbers to sum, separated by space. For example: '233 67 8 456086'");
String nToSIn = inputReader.readLine();
String[] nToS = nToSIn.split(" ");
String str = "Sum of ";
int sum = 0;
for (int i = 0; i < nToS.length; i++) {
str += nToS[i] + ", ";
sum += Integer.parseInt(nToS[0]);
}
str = str.substring(0, str.length() - 2);
str += "is " + sum;
System.out.println(str);
}
}
}
public static void go() throws IOException {
BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.println("Please enter one of the following actions: sum / copycat");
String input = inputReader.readLine();
if ("copycat".equals(input)) {
System.out.print(">");
System.out.println(inputReader.readLine());
} else if ("sum".equals(input)) {
System.out.println("Enter numbers to sum, separated by space. For example: '233 67 8 456086'");
String nToSIn = inputReader.readLine();
String[] nToS = nToSIn.split(" ");
String str = "Sum of ";
int sum = 0;
for (int i = 0; i < nToS.length; i++) {
str += nToS[i] + ", ";
sum += Integer.parseInt(nToS[0]);
}
str = str.substring(0, str.length() - 2);
str += "is " + sum;
System.out.println(str);
}
}
}
public static void go() throws IOException {
BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.println("Please enter one of the following actions: sum / copycat");
String input = inputReader.readLine();
if ("copycat".equals(input)) {
// print a line from the user
System.out.print(">");
System.out.println(inputReader.readLine());
} else if ("sum".equals(input)) {
// read numbers separated by space and print their sum
System.out.println("Enter numbers to sum, separated by space. For example: '233 67 8 456086'");
String nToSIn = inputReader.readLine();
String[] nToS = nToSIn.split(" ");
String str = "Sum of ";
int sum = 0;
for (int i = 0; i < nToS.length; i++) {
str += nToS[i] + ", ";
sum += Integer.parseInt(nToS[0]);
}
str = str.substring(0, str.length() - 2);
str += "is " + sum;
System.out.println(str);
}
}
}
30. else if ("sum".equals(input)) {
// read numbers separated by space and print their sum
System.out.println("Enter numbers to sum...");
String nToSIn = inputReader.readLine();
String[] nToS = nToSIn.split(" ");
String str = "Sum of ";
int sum = 0;
for (int i = 0; i < nToS.length; i++) {
str += nToS[i] + ", ";
sum += Integer.parseInt(nToS[0]);
}
str = str.substring(0, str.length() - 2);
str += "is " + sum;
System.out.println(str);
}
else if ("sum".equals(input)) {
// read numbers separated by space and print their sum
System.out.println("Enter numbers to sum...");
String nToSIn = inputReader.readLine();
String str = NumbersToSum.getOutputString(nToSIn);
System.out.println(str);
}
31. public class NumbersToSum {
public static String getOutputString(String … nToSIn) {
String[] nToS = nToSIn.split(" ");
String str = "Sum of ";
int sum = 0;
for (int i = 0; i < nToS.length; i++) {
str += nToS[i] + ", ";
sum += Integer.parseInt(nToS[0]);
}
str = str.substring(0, str.length() - 2);
str += "is " + sum;
return str;
}}
else if ("sum".equals(input)) {
System.out.println("Enter numbers to sum...");
String nToSIn = inputReader.readLine();
String str = NumbersToSum.getOutputString(nToSIn);
System.out.println(str);
}
42. public class NumbersToSum {
public static String getOutputString(String … numbersToSumInput) {
String[] numbersToSum = numbersToSumInput.split(" ");
String str = "Sum of ";
int sum = 0;
for (int i = 0; i < numbersToSum.length; i++) {
str += numbersToSum[i] + ", ";
sum += Integer.parseInt(numbersToSum[0]);
}
str = str.substring(0, str.length() - 2);
str += " is " + sum;
return str;
}
}
43. @Test
public void testGetOutputString() {
assertThat(NumbersToSumPrinter.getOutputString("3 231"),
is("Sum of 3, 231 is 234"));
}
@Test
public void testSumOfMoreThanOneNumber() {
assertThat(NumbersToSum.sum(3, 231),
is(234));
}
44. public class NumbersToSum {
public static String getOutputString(String … numbersToSumInput) {
String[] numbersToSum = numbersToSumInput.split(" ");
String str = "Sum of ";
int sum = 0;
for (int i = 0; i < numbersToSum.length; i++) {
str += numbersToSum[i] + ", ";
sum += Integer.parseInt(numbersToSum[0]);
}
str = str.substring(0, str.length() - 2);
str += " is " + sum;
return str;
}
}
45. public class NumbersToSumPrinter {
public static String getOutputString(String numbersToSumInput) {
String[] numbersToSum = numbersToSumInput.split(" ");
String str = "Sum of ";
for (int i = 0; i < numbersToSum.length; i++) {
str += numbersToSum[i] + ", ";
}
str = str.substring(0, str.length() - 2);
int sum = NumbersToSum.sum(intArrayFromStrings(numbersToSum));
str += " is " + sum;
return str;
}
}
46. public class NumbersToSumPrinter {
public static String getOutputString(String numbersToSumInput) {
String[] numbersToSum = numbersToSumInput.split(" ");
String str = "Sum of ";
for (int i = 0; i < numbersToSum.length; i++) {
str += numbersToSum[i] + ", ";
}
str = str.substring(0, str.length() - 2);
int sum = NumbersToSum.sum(intArrayFromStrings(numbersToSum));
str += " is " + sum;
return str;
}
}
47. public class NumbersToSum {
public static int sum(int ... numbersToSum) {
int sum = 0;
for (int i = 0; i < numbersToSum.length; i++) {
sum += numbersToSum[0];
}
return sum;
}
}
48.
49. public class NumbersToSum {
public static int sum(int ... numbersToSum) {
int sum = 0;
for (int i = 0; i < numbersToSum.length; i++) {
sum += numbersToSum[0];
}
return sum;
}
}
50. public class NumbersToSum {
public static int sum(int ... numbersToSum) {
int sum = 0;
for (int i = 0; i < numbersToSum.length; i++) {
sum += numbersToSum[i];
}
return sum;
}
}
54. public static void go() throws IOException {
BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.println("Please enter one of the following actions: sum / copycat");
String input = inputReader.readLine();
if ("copycat".equals(input)) {
// print a line from the user
System.out.print(">");
System.out.println(inputReader.readLine());
} else if ("sum".equals(input)) {
// read numbers separated by space and print their sum
System.out.println("Enter numbers to sum ...");
String nToSIn = inputReader.readLine();
String[] nToS = nToSIn.split(" ");
String str = "Sum of ";
int sum = 0;
for (int i = 0; i < nToS.length; i++) {
str += nToS[i] + ", ";
sum += Integer.parseInt(nToS[0]);
}
str = str.substring(0, str.length() - 2);
str += "is " + sum;
System.out.println(str);
}
}
}
55. public class MyConsole {
public void go() throws IOException {
BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.println("Please enter one … sum / copycat");
String input = inputReader.readLine();
if ("copycat".equals(input)) {
// print a line from the user
System.out.print(">");
System.out.println(inputReader.readLine());
} else if ("sum".equals(input)) {
// read numbers separated by space and print their sum
System.out.println("Enter numbers to sum ...");
String numbersToSumInput = inputReader.readLine();
String str = NumbersToSumPrinter.getOutputString(numbersToSumInput);
System.out.println(str);
}
}
}
}
56. public class MyConsole {
public void go() throws IOException {
BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.println("Please enter one … sum / copycat");
String input = inputReader.readLine();
if ("copycat".equals(input)) {
// print a line from the user
System.out.print(">");
System.out.println(inputReader.readLine());
} else if ("sum".equals(input)) {
// read numbers separated by space and print their sum
System.out.println("Enter numbers to sum ...");
String numbersToSumInput = inputReader.readLine();
String str = NumbersToSumPrinter.getOutputString(numbersToSumInput);
System.out.println(str);
}
}
}
}
57. public class MyConsole {
public void go() throws IOException {
BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.println("Please enter one … sum / copycat");
String input = inputReader.readLine();
if ("copycat".equals(input)) {
// print a line from the user
System.out.print(">");
System.out.println(inputReader.readLine());
} else if ("sum".equals(input)) {
// read numbers separated by space and print their sum
System.out.println("Enter numbers to sum ...");
String numbersToSumInput = inputReader.readLine();
String str = NumbersToSumPrinter.getOutputString(numbersToSumInput);
System.out.println(str);
}
}
}
}
public class MyConsole {
public void go() throws IOException {
BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.println("Please enter one … sum / copycat");
String input = inputReader.readLine();
if ("copycat".equals(input)) {
// print a line from the user
System.out.print(">");
System.out.println(inputReader.readLine());
} else if ("sum".equals(input)) {
// read numbers separated by space and print their sum
System.out.println("Enter numbers to sum ...");
String numbersToSumInput = inputReader.readLine();
String str = NumbersToSumPrinter.getOutputString(numbersToSumInput);
System.out.println(str);
}
}
}
}
58. public class MyConsole {
public void go() throws IOException {
BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.println("Please enter one of the following actions: sum / copycat");
String input = inputReader.readLine();
if ("copycat".equals(input)) {
waitForInputAndCopy(inputReader);
} else if ("sum".equals(input)) {
// read numbers separated by space and print their sum
System.out.println("Enter numbers to sum ...");
String numbersToSumInput = inputReader.readLine();
String str = NumbersToSumPrinter.getOutputString(numbersToSumInput);
System.out.println(str);
}
}
}
private void waitForInputAndCopy(BufferedReader inputReader) throws IOException {
System.out.print(">");
System.out.println(inputReader.readLine());
}
}
59. public class MyConsole {
public void go() throws IOException {
BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.println("Please enter one of the following actions: sum / copycat");
String input = inputReader.readLine();
if ("copycat".equals(input)) {
waitForInputAndCopy(inputReader);
} else if ("sum".equals(input)) {
waitForInputAndSumNumbers(inputReader);
}
}
}
private void waitForInputAndSumNumbers(BufferedReader inputReader) throws IOException {
System.out.println("Enter numbers to sum, separated by space. For example: '233 67 8 456086'");
String numbersToSumInput = inputReader.readLine();
String str = NumbersToSumPrinter.getOutputString(numbersToSumInput);
System.out.println(str);
}
private void waitForInputAndCopy(BufferedReader inputReader) throws IOException {
System.out.print(">");
System.out.println(inputReader.readLine());
}
}
61. Use Pronounceable, Meaningful Names
String numbersToSumInput = inputReader.readLine();
String[] nToS = numbersToSumInput.split(" ");
String str = "Sum of ";
int sum = 0;
for (int i = 0; i < nToS.length; i++) {
str += nToS[i] + ", ";
sum += Integer.parseInt(nToS[0]);
}
vs.
String numbersToSumInput = inputReader.readLine();
String[] numbersToSum = numbersToSumInput.split(" ");
String str = "Sum of ";
int sum = 0;
for (int i = 0; i < numbersToSum.length; i++) {
str += numbersToSum[i] + ", ";
sum += Integer.parseInt(numbersToSum[0]);
}
62. Do Only One Thing
FUNCTIONS / CLASSES / MODULES SHOULD DO ONE THING.
THEY SHOULD DO IT WELL.
THEY SHOULD DO IT ONLY.
while (true) {
System.out.println("Please enter one … sum / copycat");
String input = inputReader.readLine();
if ("copycat".equals(input)) {
System.out.print(">");
System.out.println(inputReader.readLine());
} else if ("sum".equals(input)) {
System.out.println("Enter numbers to sum ...");
String numbersToSumInput = inputReader.readLine();
String str = NumbersToSumPrinter.getOutputString(numbersToSumInput);
System.out.println(str);
}
}
68. Refactor Until Your Code is Clean
● Hard to Get Done Right on First Try
● Reading clean code should make you smile
the way a well-crafted music box or well-designed car would
70. ● Change one variable name for the better,
● Break up one function that’s a little too large,
● Eliminate one small bit of duplication
The cleanup doesn’t have to be something big:
77. Sources
Clean Code (pdf)
GOOS style TDD by Example - Sagy Rozman
Cultural Learning of Testing - Gil Tayar
Finding Your Organization’s Code Deodorant - Ittai Zeidman