clean code - agile software craftsmanship
DESCRIPTION
It is a combination of multiple presentations I found on SlideShare and took up best excerpts from allTRANSCRIPT
![Page 1: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/1.jpg)
Clean Code
Yukti Kaura
![Page 2: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/2.jpg)
![Page 3: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/3.jpg)
![Page 4: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/4.jpg)
![Page 5: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/5.jpg)
![Page 6: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/6.jpg)
![Page 7: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/7.jpg)
![Page 8: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/8.jpg)
![Page 9: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/9.jpg)
![Page 10: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/10.jpg)
![Page 11: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/11.jpg)
![Page 12: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/12.jpg)
![Page 13: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/13.jpg)
![Page 14: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/14.jpg)
class DtaRcrd102class DtaRcrd102
Use pronounceable names
class Customerclass Customer
![Page 15: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/15.jpg)
![Page 16: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/16.jpg)
![Page 17: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/17.jpg)
![Page 18: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/18.jpg)
![Page 19: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/19.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/20.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/21.jpg)
![Page 22: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/22.jpg)
![Page 23: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/23.jpg)
![Page 24: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/24.jpg)
![Page 25: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/25.jpg)
![Page 26: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/26.jpg)
![Page 27: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/27.jpg)
![Page 28: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/28.jpg)
![Page 29: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/29.jpg)
![Page 30: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/30.jpg)
![Page 31: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/31.jpg)
![Page 32: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/32.jpg)
![Page 33: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/33.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/34.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/35.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/36.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/37.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/38.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/39.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/40.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/41.jpg)
Extract Try/Catch BlocksError Handling Is One Thing
![Page 42: Clean code - Agile Software Craftsmanship](https://reader035.vdocument.in/reader035/viewer/2022081718/54552aabb1af9fc0638b4777/html5/thumbnails/42.jpg)
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; }