1. Top 5 Ways to Improve YourCodeEric De CarufelAgile Coachhttp://blog.decarufel.nethttp://pyxis-tech.com 2. Introduction Legacy code is code without tests Michael Feather in Working effectively with legacy code Without continuous maintenance the code will degrade rapidly We need to detect and remove code smell 3. My Top 5 Improvements 1. Simplify conditionals 2. Improve code documentation 3. Improve method calls 4. Manage scope 5. Remove dead code 4. 1. Simplify conditionals Why? Reduced complexity Better readability Better maintainability Better reusability 5. 1. Simplify conditionals When? There is more than one condition (and / or) There is too much code in the body The condition is based on type There are nested if statements There are many decisions based on the same info (if else if chain / switch case) 6. 1. Simplify conditionals How? Refactor conditional statements Decompose conditional code Consolidate conditional expressions Consolidate duplicate conditional fragments Introduce null objects Flatten nested if Dont use negative conditions Keep conditional statements lean Avoid conditional statements Replace conditional code with polymorphism Replace conditional logic with strategy Replace conditional dispatchers with commands 7. Decompose Conditional Code 8. Consolidate Conditional Expressions 9. Consolidate Duplicate Conditional Fragments 10. Introduce Null Objects 11. Flatten Nested if 12. Dont Use Negative Conditions 13. Keep Conditional Statements Lean Do your best to have only one condition Use methods to combine multiple conditions Invert your conditions if most (or all) the code of your method is inside the "true" block Make sure to avoid double negation 14. Replace Conditional with Polymorphism 15. Replace Conditional Logic with Strategy 16. Replace Conditional Dispatcher with Command 17. 2. Delete comments Why? Better readability Better maintainability Fewer obsolete comments 18. 2. Delete comments When? Every time there is a comment that is not (useful) information, intention, clarification, warning, TODO or amplification. Comments are the only content of a code section Empty catch statements Your comments describe line by line what you are trying to do Example: // Getting connection string from configuration // Opening connection // Retrieving data // Closing connection 19. 2. Delete comments How? Replace comments with good naming Extract methods Use meaningful names Write useful comments Naming Conventions (MSDN: Guidelines for names) Properties Enums Events Methods 20. Extract Methods 21. Use Meaningful Names Use Intention-Revealing names Avoid disinformation Make meaningful distinctions Use pronounceable names Avoid encoding Avoid mental mapping Class names -> nouns not verbs Method names -> verbs Dont be cute. Use standard names Solution Domain Names vs Problem Domain Names 22. Properties Do use PascalCase naming Do name properties with a noun, noun phrase or an adjective Do Not use names that match Get method Do name booleans with Can, Is or Has prefix 23. Enums Consider the first element to be the default value Do use PascalCasing naming Single choice enumerations should be singular Bit fields enumerations should be plural and have Flags attibute Value of bit fields enumeration should be coherent (Read & Write == ReadWrite) 24. Events Do use PascalCase naming Do name event using a verb, present progressive for pre-event and past for post-event Do provide a virtual version of the event to override Do provide a way to cancel pre-event 25. Methods Do give methods names that are verbs or verb phrases ProcessPayment Do express the return value in method name CreateCustomer GetInvoice Use consistent naming (Get, Fetch or Retrieve but not all in same context) 26. 3. Clarify contracts Why? Better performance Better readability Better reusability 27. 3. Clarify contracts When? There are too many parameters (how many is too many?) A method does more than one thing A method uses out parameters You need default values 28. 3. Clarify contracts How? Reduce number of parameters Introduce parameter object Create overloads with less parameters Use default values Function output Return type value Use out parameters Overload methods in proper order 29. Introduce Parameter Object 30. Create Overloads with Fewer Parameters 31. Use Default Values 32. 4. Reduce scope Why? Avoid side effects Better reusability Better maintainability 33. 4. Reduce scope When? A field is used in only a few methods Public members expose class behavior 34. 4. Reduce scope How? Reduce visibility Use protected Use private Use Internal Reduce scope Move fields to method Split class Move local variable close to its use Reduce lifetime Initialize late Reduce references Free early 35. 5. Remove Dead Code Why? Because you must Better maintainability Better performance Better readability 100% test coverage 36. 5.Remove Dead Code When? You know the code is dead You think the code is dead You want that code to be dead 37. 5. Remove Dead Code How? Identify and remove dead code Delete the code Compile Run the tests What is dead code? Commented code. Any line of code that is not covered by unit tests. Tools There are tools that delete all code not covered by unit tests. 38. Next Steps Improve your conditional code Improve your documentation Improve your method calls 39. Resources Refactoring Improving the design of existing code Author: Martin Fowler Edition: Addison Wesley ISBN: 978-0-201-48567-7 Refactoring to patterns (Martin Fowler signature) Author: Joshua Kerievsky Edition: Adison Wesley ISBN: 978-0-321-21335-1 Clean code a handbook of agile software craftsmanship Author: Robert C. Martin Edition: Prentice Hall ISBN: 978-0-132-35088-4 Working effectively with legacy code Author: Michael C. Feather Edition: Prentice Hall ISBN: 978-0-13-117705-5 40. Related sessions Day 2 08h45 to 10h00 DEV373 Testing with Microsoft Visuals Studio Test Professional and the new Team Lab 2010 by Etienne Tremblay Day 2 10h30 to 11h45 ARC301 Design by Contract (DbC) and Code Contracts in Visual Studio 2010 by Joel Hebert 41. Remember To Complete Your Evaluations!You could WIN a Samsung FocusWindows Phone 7!Let us know what you liked & disliked!Remember, 1=Bad, 5=Good Please provide comments!No purchase necessary. The contest is open to residents of Canada (excluding government employees). The Toronto TechDays evaluation form contest begins on October 25th, 2011 andends on October 26th, 2011. The Vancouver TechDays evaluation form contest begins on November 15th, 2011 and ends on November 16th, 2011. The Montreal TechDays evaluationform contest begins on November 29th, 2011 and ends on November 30th, 2011. Participants can enter the contest in one of two ways: (1) complete and submit an evaluation form by thecontest close date; or (2) provide contact information by the contest close date. The draw for Toronto will take place on October 31st, 2011. The draw for Vancouver will take place onNovember 21st, 2011. The draw for Montreal will take place on December 5th, 2011. The chances of being selected depend upon the number of eligible entries. Selected participants will becontacted by phone and/or e-mail and will be required to answer correctly a time-limited skill-testing question. There are three (3) prizes available to be won. One (1) prize will be given awayfor each TechDays event in Toronto (October 25-26 2011), Vancouver (November 15-16 2011) and Montreal (November 29-30 2011). The prize consists of a Samsung Focus WindowsPhone 7 (handset only; voice and/or data plan not included) (approximate retail value of $499 CAD). The prize will be delivered to the shipping address designated by the winner within 6-8weeks. The winner may be required to sign a declaration and release form. For full contest rules, please see a Microsoft TechDays representative. You can email any additional comments directly to firstname.lastname@example.org at any time. 42. Q&A 43. 2011 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.