際際滷

際際滷Share a Scribd company logo
Your Code Smells Too!
Time to Deodorize
Gino Marckx
cb pyroclastichawk - 鞄岳岳沿壊://敬敬敬.鍖i界一姻.界看馨/沿鞄看岳看壊/18536761葵鰻00/367669179
cb Iwan Gabovitch - https://www.鍖ickr.com/photos/qubodup/4439090296
cb Iwan Gabovitch - https://www.鍖ickr.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 identi鍖ers
 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

Your code smells too! Time to deodorize

  • 1. Your Code Smells Too! Time to Deodorize Gino Marckx
  • 2. cb pyroclastichawk - 鞄岳岳沿壊://敬敬敬.鍖i界一姻.界看馨/沿鞄看岳看壊/18536761葵鰻00/367669179
  • 3. cb Iwan Gabovitch - https://www.鍖ickr.com/photos/qubodup/4439090296
  • 4. cb Iwan Gabovitch - https://www.鍖ickr.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 identi鍖ers 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