SlideShare a Scribd company logo
1 of 19
Your Code Smells Too!
Time to Deodorize
Gino Marckx
cb pyroclastichawk - https://www.flickr.com/photos/18536761@N00/367669179
cb Iwan Gabovitch - https://www.flickr.com/photos/qubodup/4439090296
cb Iwan Gabovitch - https://www.flickr.com/photos/qubodup/4438310359
CAUTION
BAD ROAD
AHEAD
CAUTION
BAD CODE
AHEAD
public class Person {
public String m_name;
public String m_street;
public String m_zip;
public String m_city;
public String m_province;
public String m_country;
public Person(String name, String country) { ... }
public Person(String name, String town, String country) { ... }
public Person(String name, String s, String z, String c, String p,
String country) { ... } 

public void add(Person person) { ... }
public final List getFriends() { ... }
public double between(Person person) { ... }
public Person closestFriend() { ... }
}
The Wallaroo Prints © 2011
public class Person {
public String name;
public Address address;
public Person(String name, Address address) { ... }
public void addFriend(Person person) { ... }
public List<Person> getFriends() { ... }
/**
* Find the friend who lives closest.
*
* @return the friend who lives closest
* @throws NoSuchElementException in case this person has no friends
*/
public Person getNearestFriend() { ... }
}
• Meaningful names
• Excessive use of literals
• Long parameter list
• Excessively short identifiers
• Feature envy
• Readability
• Maintainability
• Velocity
public class Address {
public Address(String country) { ... }
public Address(String city, String country) { ... }
public Address(String street, String postalCode, String city,
String state, String country) { ... }
public String getStreet() { ... }
public String getPostalCode() { ... }
public String getCity() { ... }
public String getState() { ... }
public String getCountry() { ... }
public Point getGeographicalLocation() { ... }
/**
* Calculate the distance in kilometres to another address.
*
* @param anotherAddress the other address to calculate the distance to
* @return the distance in kilometres between this address and the other
* address
* @throws IllegalArgumentException when location of either address is
* unknown
*/
public double distanceTo(Address anotherAddress) { ... }
}
http://www.zazzle.ca/comments_a_deodorant_to_mask_code_smells_tshirt-235182622652051339
The Wallaroo Prints © 2011
public class AddressBuilder {
public AddressBuilder(AddressLocator addressLocator) { ... }
public AddressBuilder() { ... }
public AddressBuilder withCountry(String country) { ... }
public AddressBuilder withStreet(String street) { ... }
public AddressBuilder withCity(String city) { ... }
public AddressBuilder withPostalCode(String postalCode) { ... }
public AddressBuilder withState(String state) { ... }
public Address build() throws UnknownGeographicalLocation { ... }
}
public class Address {
Address(AddressLocator locator, String street, String zipCode,
String city, String state, String country) { ... }
...
public Distance distanceTo(Address anotherAddress) { ... }
}
public class AddressTest {
public AddressLocator createMockLocatorWithPolandCentreOfTheUniverse() {
... }
@Test
public void testDistanceTo() throws Throwable {
AddressBuilder builder = new AddressBuilder(
createMockLocatorWithPolandCentreOfTheUniverse());
Address polishAddress = builder.withCountry("Poland").build(),
canadianAddress = builder.withCountry("Canada").build();
assertEquals(new Distance(1000, Distance.Unit.KILOMETRE),
polishAddress.distanceTo(canadianAddress));
}
}
• Dependency inversion
• Excessive use of literals
• Long parameter list
• Feature envy
• Testability
• Maintainability
• Velocity
Velocity
Testability
Maintainability
Build Software

The Right Way
… to be agile
Thank you!
Gino Marckx
Director, Agile Competency Center

More Related Content

More from Gino Marckx

Measuring outcomes... or how to get meaningful metrics
Measuring outcomes... or how to get meaningful metricsMeasuring outcomes... or how to get meaningful metrics
Measuring outcomes... or how to get meaningful metricsGino Marckx
 
Building powerful roadmaps
Building powerful roadmapsBuilding powerful roadmaps
Building powerful roadmapsGino Marckx
 
Increase your coaching capacity
Increase your coaching capacityIncrease your coaching capacity
Increase your coaching capacityGino Marckx
 
Don't go Agile unless you know why
Don't go Agile unless you know whyDon't go Agile unless you know why
Don't go Agile unless you know whyGino Marckx
 
Why agile doesn't work in your organization
Why agile doesn't work in your organizationWhy agile doesn't work in your organization
Why agile doesn't work in your organizationGino Marckx
 
Quadrants of Effectiveness v2.0
Quadrants of Effectiveness v2.0Quadrants of Effectiveness v2.0
Quadrants of Effectiveness v2.0Gino Marckx
 

More from Gino Marckx (8)

Measuring outcomes... or how to get meaningful metrics
Measuring outcomes... or how to get meaningful metricsMeasuring outcomes... or how to get meaningful metrics
Measuring outcomes... or how to get meaningful metrics
 
Building powerful roadmaps
Building powerful roadmapsBuilding powerful roadmaps
Building powerful roadmaps
 
Increase your coaching capacity
Increase your coaching capacityIncrease your coaching capacity
Increase your coaching capacity
 
Don't go Agile unless you know why
Don't go Agile unless you know whyDon't go Agile unless you know why
Don't go Agile unless you know why
 
Why agile doesn't work in your organization
Why agile doesn't work in your organizationWhy agile doesn't work in your organization
Why agile doesn't work in your organization
 
Quadrants of Effectiveness v2.0
Quadrants of Effectiveness v2.0Quadrants of Effectiveness v2.0
Quadrants of Effectiveness v2.0
 
Both Sides
Both SidesBoth Sides
Both Sides
 
Pomodoro Show
Pomodoro ShowPomodoro Show
Pomodoro Show
 

Recently uploaded

EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityNeo4j
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024StefanoLambiase
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...MyIntelliSource, Inc.
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWave PLM
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEEVICTOR MAESTRE RAMIREZ
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantAxelRicardoTrocheRiq
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideChristina Lin
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsAhmed Mohamed
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxTier1 app
 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...Christina Lin
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaHanief Utama
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based projectAnoyGreter
 
Asset Management Software - Infographic
Asset Management Software - InfographicAsset Management Software - Infographic
Asset Management Software - InfographicHr365.us smith
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
The Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfThe Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfPower Karaoke
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackVICTOR MAESTRE RAMIREZ
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureDinusha Kumarasiri
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfAlina Yurenko
 
chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptkotipi9215
 

Recently uploaded (20)

EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered Sustainability
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need It
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEE
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service Consultant
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML Diagrams
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief Utama
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based project
 
Asset Management Software - Infographic
Asset Management Software - InfographicAsset Management Software - Infographic
Asset Management Software - Infographic
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
The Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfThe Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdf
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStack
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with Azure
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
 
chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.ppt
 

Your code smells too! Time to deodorize

  • 1. Your Code Smells Too! Time to Deodorize Gino Marckx
  • 2. cb pyroclastichawk - https://www.flickr.com/photos/18536761@N00/367669179
  • 3. cb Iwan Gabovitch - https://www.flickr.com/photos/qubodup/4439090296
  • 4. cb Iwan Gabovitch - https://www.flickr.com/photos/qubodup/4438310359
  • 7. public class Person { public String m_name; public String m_street; public String m_zip; public String m_city; public String m_province; public String m_country; public Person(String name, String country) { ... } public Person(String name, String town, String country) { ... } public Person(String name, String s, String z, String c, String p, String country) { ... } 
 public void add(Person person) { ... } public final List getFriends() { ... } public double between(Person person) { ... } public Person closestFriend() { ... } }
  • 9. public class Person { public String name; public Address address; public Person(String name, Address address) { ... } public void addFriend(Person person) { ... } public List<Person> getFriends() { ... } /** * Find the friend who lives closest. * * @return the friend who lives closest * @throws NoSuchElementException in case this person has no friends */ public Person getNearestFriend() { ... } }
  • 10. • Meaningful names • Excessive use of literals • Long parameter list • Excessively short identifiers • Feature envy • Readability • Maintainability • Velocity
  • 11. public class Address { public Address(String country) { ... } public Address(String city, String country) { ... } public Address(String street, String postalCode, String city, String state, String country) { ... } public String getStreet() { ... } public String getPostalCode() { ... } public String getCity() { ... } public String getState() { ... } public String getCountry() { ... } public Point getGeographicalLocation() { ... } /** * Calculate the distance in kilometres to another address. * * @param anotherAddress the other address to calculate the distance to * @return the distance in kilometres between this address and the other * address * @throws IllegalArgumentException when location of either address is * unknown */ public double distanceTo(Address anotherAddress) { ... } }
  • 14. public class AddressBuilder { public AddressBuilder(AddressLocator addressLocator) { ... } public AddressBuilder() { ... } public AddressBuilder withCountry(String country) { ... } public AddressBuilder withStreet(String street) { ... } public AddressBuilder withCity(String city) { ... } public AddressBuilder withPostalCode(String postalCode) { ... } public AddressBuilder withState(String state) { ... } public Address build() throws UnknownGeographicalLocation { ... } } public class Address { Address(AddressLocator locator, String street, String zipCode, String city, String state, String country) { ... } ... public Distance distanceTo(Address anotherAddress) { ... } }
  • 15. public class AddressTest { public AddressLocator createMockLocatorWithPolandCentreOfTheUniverse() { ... } @Test public void testDistanceTo() throws Throwable { AddressBuilder builder = new AddressBuilder( createMockLocatorWithPolandCentreOfTheUniverse()); Address polishAddress = builder.withCountry("Poland").build(), canadianAddress = builder.withCountry("Canada").build(); assertEquals(new Distance(1000, Distance.Unit.KILOMETRE), polishAddress.distanceTo(canadianAddress)); } }
  • 16. • Dependency inversion • Excessive use of literals • Long parameter list • Feature envy • Testability • Maintainability • Velocity
  • 18. Build Software
 The Right Way … to be agile
  • 19. Thank you! Gino Marckx Director, Agile Competency Center