Clean code - Agile Software Craftsmanship

43
Clean Code Yukti Kaura

description

It is a combination of multiple presentations I found on SlideShare and took up best excerpts from all

Transcript of Clean code - Agile Software Craftsmanship

Page 1: Clean code - Agile Software Craftsmanship

Clean Code

Yukti Kaura

Page 2: Clean code - Agile Software Craftsmanship
Page 3: Clean code - Agile Software Craftsmanship
Page 4: Clean code - Agile Software Craftsmanship
Page 5: Clean code - Agile Software Craftsmanship
Page 6: Clean code - Agile Software Craftsmanship
Page 7: Clean code - Agile Software Craftsmanship
Page 8: Clean code - Agile Software Craftsmanship
Page 9: Clean code - Agile Software Craftsmanship
Page 10: Clean code - Agile Software Craftsmanship
Page 11: Clean code - Agile Software Craftsmanship
Page 12: Clean code - Agile Software Craftsmanship
Page 13: Clean code - Agile Software Craftsmanship
Page 14: Clean code - Agile Software Craftsmanship

class DtaRcrd102class DtaRcrd102

Use pronounceable names

class Customerclass Customer

Page 15: Clean code - Agile Software Craftsmanship
Page 16: Clean code - Agile Software Craftsmanship
Page 17: Clean code - Agile Software Craftsmanship
Page 18: Clean code - Agile Software Craftsmanship
Page 19: Clean code - Agile Software Craftsmanship

class InchToPointConvertor { //convert the quantity in inches to points. static float parseInch(float inch) { return inch * 72; //one inch contains 72 points. } }

class InchToPointConvertor { //convert the quantity in inches to points. static float parseInch(float inch) { return inch * 72; //one inch contains 72 points. } }

class InchToPointConvertor {

final static int POINTS_PER_INCH=72;

static float convertToPoints(float inch) { return inch * POINTS_PER_INCH; } }

class InchToPointConvertor {

final static int POINTS_PER_INCH=72;

static float convertToPoints(float inch) { return inch * POINTS_PER_INCH; } }

Page 20: Clean code - Agile Software Craftsmanship

class Account { //check if the password is complex enough, i.e., //contains letter and digit/symbol. boolean isComplexPassword(String password) { //found a digit or symbol? boolean dg_sym_found=false; //found a letter? boolean letter_found=false; for(int i=0; i<password.length(); i++){ char c=password.charAt(i); if(Character.isLowerCase(c)||Character.isUpperCase(c)) letter_found=true; else dg_sym_found=true; } return (letter_found) && (dg_sym_found); } }

class Account { //check if the password is complex enough, i.e., //contains letter and digit/symbol. boolean isComplexPassword(String password) { //found a digit or symbol? boolean dg_sym_found=false; //found a letter? boolean letter_found=false; for(int i=0; i<password.length(); i++){ char c=password.charAt(i); if(Character.isLowerCase(c)||Character.isUpperCase(c)) letter_found=true; else dg_sym_found=true; } return (letter_found) && (dg_sym_found); } }

class Account { boolean isComplexPassword(String password){ return containsLetter(password) && (containsDigit(password) || containsSymbol(password)); } boolean containsLetter(String password) { return false; } boolean containsDigit(String password) { return false; } boolean containsSymbol(String password) { return false; }}

class Account { boolean isComplexPassword(String password){ return containsLetter(password) && (containsDigit(password) || containsSymbol(password)); } boolean containsLetter(String password) { return false; } boolean containsDigit(String password) { return false; } boolean containsSymbol(String password) { return false; }}

Page 21: Clean code - Agile Software Craftsmanship
Page 22: Clean code - Agile Software Craftsmanship
Page 23: Clean code - Agile Software Craftsmanship
Page 24: Clean code - Agile Software Craftsmanship
Page 25: Clean code - Agile Software Craftsmanship
Page 26: Clean code - Agile Software Craftsmanship
Page 27: Clean code - Agile Software Craftsmanship
Page 28: Clean code - Agile Software Craftsmanship
Page 29: Clean code - Agile Software Craftsmanship
Page 30: Clean code - Agile Software Craftsmanship
Page 31: Clean code - Agile Software Craftsmanship
Page 32: Clean code - Agile Software Craftsmanship
Page 33: Clean code - Agile Software Craftsmanship

Goal of OOAD:Identify the classes and relations between them for a given problem.

Read the problem statement carefully and identify:• Nouns (Classes)• Verbs (Behavior)• Actors (Users)

Identify relationships between classes• Is-A (Generalization / Inheritance)• Has-A (Composition) • Uses (Dependency)

Page 34: Clean code - Agile Software Craftsmanship

Slide 34

A basket contains oranges and apples.

BasketBasket

AppleApple OrangeOrange

Fruits have cost BasketBasket

AppleApple OrangeOrange

FruitFruit

11

** **

int Price;int Price;

11 **

Generalize to accommodate new requirements.Generalize to accommodate new requirements.

Page 35: Clean code - Agile Software Craftsmanship

Slide 35

A user has password. Password can be encrypted and decrypted.

UserUser PasswordPasswordpublic String encrypt();public String decrypt();public String encrypt();public String decrypt();

11 11

String userid;String userid;

Password is encrypted using a encryption service.

UserUser PasswordPasswordpublic String encrypt();public String decrypt();public String encrypt();public String decrypt();

11 11

String userid;String userid;

EncryptionServiceEncryptionServicepublic String encrypt(String);public String decrypt(String);public String encrypt(String);public String decrypt(String);

Page 36: Clean code - Agile Software Craftsmanship

Slide 36

Class should have one and only one reason to change.

RectangleRectanglepublic draw()public area()public draw()public area()

Two responsibilities:1.Mathematical model of the geometry of rectangle2.Render rectangle to a graphical user interface.

RectangleRectanglePoint topLeftCorner

Point bottomRightCornerPoint topLeftCorner

Point bottomRightCorner

Geometric RectangleGeometric Rectangle

public area()public area()

Page 37: Clean code - Agile Software Craftsmanship

Slide 37

Module should not know internal details of objects it manipulates.

A method M of an object O may only invoke the methods of the following kinds of objects:

•O itself •M's parameters •any objects created/instantiated within M •O's instance variables

Class PaperBoy { void collectPaymetents() {

float payment = 2.0; float fundsCollected = 0.0;

for (Customer customer : customerList) { float moneyInWallet = customer.getWallet().getMoney(); if (moneyInWallet >= payment) { customer.getWallet.setMoney(moneyInWallet – payment); fundsCollected += payment; } } }}

Class PaperBoy { void collectPaymetents() {

float payment = 2.0; float fundsCollected = 0.0;

for (Customer customer : customerList) { float moneyInWallet = customer.getWallet().getMoney(); if (moneyInWallet >= payment) { customer.getWallet.setMoney(moneyInWallet – payment); fundsCollected += payment; } } }}

Class PaperBoy { void collectPaymetents() {

float payment = 2.0; float fundsCollected = 0.0;

for (Customer customer : customerList) { try { fundsCollected += customer.makePayment(payment); } catch (NotEnoughMoneyComeLaterException e) { } }}

Class PaperBoy { void collectPaymetents() {

float payment = 2.0; float fundsCollected = 0.0;

for (Customer customer : customerList) { try { fundsCollected += customer.makePayment(payment); } catch (NotEnoughMoneyComeLaterException e) { } }}

Page 38: Clean code - Agile Software Craftsmanship

Slide 38

In object oriented languages, power of polymorphism comes from Liskov’s substitution principle.

“A subclass can be used as an argument where a base class is expected”

Class Mechanic {

public void repair (Car car) {

}

}

class HyundaiCar implements Car {}

class MarutiCar implements Car {}

class HyundaiSantro extends HyundaiCar {}

Class Mechanic {

public void repair (Car car) {

}

}

class HyundaiCar implements Car {}

class MarutiCar implements Car {}

class HyundaiSantro extends HyundaiCar {}

HyundaiCar faultyHyundai = new HyundaiCar();mechanic.repair (faultyHyunai);

MarutiCar faultyMaruti = new MarutiCar();mechanic.repair(faultyMaruti);

HyundaiCar faultyHyundai = new HyundaiCar();mechanic.repair (faultyHyunai);

MarutiCar faultyMaruti = new MarutiCar();mechanic.repair(faultyMaruti);

Page 39: Clean code - Agile Software Craftsmanship

Slide 39

Class Driver {

public void drive (Car car) {

}

public void drive (Truck truck) {

}}

Class Driver {

public void drive (Car car) {

}

public void drive (Truck truck) {

}}

Class Driver {

public void drive (Vehicle vehicle) {

}

}

Class Driver {

public void drive (Vehicle vehicle) {

}

}

Page 40: Clean code - Agile Software Craftsmanship

Slide 40

if ( isGoingToMovie() ) {

Vehicle vehicle = new Car();

driver.drive (vehicle )

}

else ( ifRelocatingToNewHome () ) {

Vehicle vehicle = new Truck();

driver.drive (vehicle );

}

if ( isGoingToMovie() ) {

Vehicle vehicle = new Car();

driver.drive (vehicle )

}

else ( ifRelocatingToNewHome () ) {

Vehicle vehicle = new Truck();

driver.drive (vehicle );

}

Vehicle vehicle = getVehicle(conditions);

driver.drive (vehicle );

Vehicle vehicle = getVehicle(conditions);

driver.drive (vehicle );

Class should be open for extension, but closed for modification.

Page 41: Clean code - Agile Software Craftsmanship

Extract Try/Catch BlocksError Handling Is One Thing

Page 42: Clean code - Agile Software Craftsmanship

List<Employee> employees = getEmployees(); for(Employee e : employees) { totalPay += e.getPay(); } public List<Employee> getEmployees() { if( .. there are no employees .. ) return Collections.emptyList(); }

public double xProjection(Point p1, Point p2) { return (p2.x – p1.x) * 1.5; } public double xProjection(Point p1, Point p2) { if (p1 == null || p2 == null) { throw InvalidArgumentException ("Invalid argument for MetricsCalculator.xProjection"); } return (p2.x – p1.x) * 1.5; }