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

Your code smells too! Time to deodorize

  • 1.
    Your Code SmellsToo! 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
  • 5.
  • 6.
  • 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() { ... } }
  • 8.
  • 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) { ... } }
  • 12.
  • 13.
  • 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
  • 17.
  • 18.
    Build Software
 The RightWay … to be agile
  • 19.
    Thank you! Gino Marckx Director,Agile Competency Center