improving the quality of existing software - devintersection april 2016
TRANSCRIPT
![Page 1: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/1.jpg)
Improving the Quality of Existing Software
Steve SmithArdalis Services
@ardalis | ardalis.com
![Page 2: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/2.jpg)
Tweet Away
• Live Tweeting and Photos are encouraged• Questions and Feedback are welcome• Use #DevIntersection and/or #ImproveSoftware• Or #DevIntersectionImprovingTheQualityOfExistingSoftware
![Page 3: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/3.jpg)
Pluralsight
I have some 1-month free passes; see me after if you’d like one
![Page 4: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/4.jpg)
Software Rots
![Page 5: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/5.jpg)
![Page 6: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/6.jpg)
Technical Debt
• Low quality code and shortcuts in our applications
• Technical debt, like real debt, has direct cost to pay off as well as interest
![Page 7: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/7.jpg)
http://www.jimhighsmith.com/
![Page 8: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/8.jpg)
Preventive Maintenance
• Refactoring• Eliminate Duplication• Simplify Design
• Automated Tests• Verify correctness• Avoid regressions• Increase Confidence
![Page 9: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/9.jpg)
When should you refactor?
• While delivering value
![Page 10: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/10.jpg)
“”
You don’t need permission to practice basic hygiene when you write software.
http://ardalis.com/when-should-you-refactor/
Make cleaning up your code something you do as part of writing code.
![Page 11: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/11.jpg)
![Page 12: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/12.jpg)
Refactoring Should Not Change System Behavior
![Page 13: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/13.jpg)
The Refactoring Process
• Verify existing behavior• Write Characterization Tests if none exist• Find test points• Break dependencies
• Apply Refactoring• Confirm existing behavior is preserved
![Page 14: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/14.jpg)
Characterization Tests
Process1. Write a test you know will fail2. Use the output of the failing test to determine the existing
behavior to assert3. Update the test with the new value/behavior4. Run the test again – it should now pass
![Page 15: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/15.jpg)
![Page 16: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/16.jpg)
![Page 17: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/17.jpg)
S O L I D
Principleshttp://flickr.com/photos/kevinkemmerer/
2772526725/
![Page 18: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/18.jpg)
Principles of OO Design
0. Don’t Repeat Yourself (DRY)
1.Single Responsibility2.Open/Closed3.Liskov Substitution4.Interface Segregation5.Dependency Inversion
![Page 19: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/19.jpg)
![Page 20: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/20.jpg)
![Page 21: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/21.jpg)
Don’t RepeatRepeat Yourself
• Duplication in logic calls for abstraction
• Duplication in process calls for automation
![Page 22: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/22.jpg)
Common Refactorings
• Replace Magic Number/String• Parameterize Method• Pull Up Field• Pull Up Method• Replace Conditional With Polymorphism• Introduce Method
![Page 23: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/23.jpg)
Common Source of Repetition: Role Checks
if(user.IsInRole(“Admins”){ // allow access to resource}
// favor privileges over role checks// ardalis.com/Favor-Privileges-over-Role-Checks
var priv = new ContentPrivilege(user, article);if(priv.CanEdit()){ // allow access}
![Page 24: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/24.jpg)
Visual Studio Code Clones
• Find similar blocks of code in your projects/solution
• Can detect matches that are similar but vary in small ways (like variable names)
• Available in VS2015 Premium and Ultimate
![Page 25: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/25.jpg)
![Page 26: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/26.jpg)
Single Responsibility Principle
The Single Responsibility Principle states that every object should have a single responsibility, and that responsibility should be entirely encapsulated by the class.
Wikipedia
There should never be more than one reason for a class to change.Robert C. “Uncle Bob” Martin
![Page 27: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/27.jpg)
What is a responsibility?
“My CustomerManager class is only responsible for anything to do with a Customer. That follows SRP, right?”
![Page 28: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/28.jpg)
Examples of Responsibilities• Persistence• Validation• Notification• Error Handling• Logging• Class Selection / Construction• Formatting• Parsing• Mapping
![Page 29: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/29.jpg)
Dependency and Coupling
• Excessive coupling makes changing legacy software difficult
• Breaking apart responsibilities and dependencies is a large part of working with existing code
![Page 30: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/30.jpg)
Common Refactorings
• Extract Class• Extract Method• Move Method
![Page 31: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/31.jpg)
Heuristics and Code Smells
• Visual Studio Metrics
![Page 32: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/32.jpg)
Cyclomatic Complexity
https://en.wikipedia.org/wiki/Cyclomatic_complexity
![Page 33: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/33.jpg)
![Page 34: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/34.jpg)
Code Smell: Regions
?More on Regions: http://ardalis.com/regional-differences
![Page 35: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/35.jpg)
![Page 36: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/36.jpg)
Open / Closed Principle
The Open / Closed Principle states that software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification.
Wikipedia
![Page 37: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/37.jpg)
Open / Closed Principle
Open to ExtensionNew behavior can be added in the future
Closed to ModificationChanges to source or binary code are not required
Dr. Bertrand Meyer originated the OCP term in his 1988 book, Object Oriented Software Construction
![Page 38: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/38.jpg)
Common Refactorings
• Extract Interface / Apply Strategy Pattern• Parameterize Method• Form Template Method
![Page 39: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/39.jpg)
OCP Fail
![Page 40: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/40.jpg)
OCP OK
![Page 41: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/41.jpg)
OCP Failpublic bool IsSpecialCustomer(Customer c){ if(c.Country == “US” && c.Balance < 50) return false; if(c.Country == “DE” && c.Balance < 25) return false; if(c.Country == “UK” && c.Balance < 35) return false; if(c.Country == “FR” && c.Balance < 27) return false; if(c.Country == “BG” && c.Balance < 29) return false;
if(c.Age < 18 || c.Age > 65) return false; if(c.Income < 50000 && c.Age < 30) return false; return true;}
![Page 42: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/42.jpg)
OCP OK
private IEnumerable<ICustomerRule> _rules;
public bool IsSpecialCustomer(Customer customer){ foreach(var rule in _rules) { if(rule.Evaluate(customer) == false) return false; } return true;}
![Page 43: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/43.jpg)
![Page 44: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/44.jpg)
Liskov Substitution Principle
The Liskov Substitution Principle states that Subtypes must be substitutable for their base types.
Agile Principles, Patterns, and Practices in C#
Named for Barbara Liskov, who first described the principle in 1988.
![Page 45: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/45.jpg)
Common Refactorings
• Collapse Hierarchy• Pull Up / Push Down Field• Pull Up / Push Down Method
![Page 46: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/46.jpg)
Liskov Substitution Fail
foreach(var employee in employees){ if(employee is Manager) { Helpers.PrintManager(employee as Manager); break; } Helpers.PrintEmployee(employee);}
![Page 47: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/47.jpg)
Liskov Substitution OK
foreach(var employee in employees){ employee.Print(); // or Helpers.PrintEmployee(employee);}
![Page 48: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/48.jpg)
Nulls Break Polymorphism
foreach(var employee in employees){ if(employee == null) { // print not found message break; } Helpers.PrintEmployee(employee);} http://ardalis.com/nulls-break-
polymorphism
![Page 49: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/49.jpg)
![Page 50: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/50.jpg)
Interface Segregation Principle
The Interface Segregation Principle states that Clients should not be forced to depend on methods they do not use.
Agile Principles, Patterns, and Practices in C#
Corollary:Prefer small, cohesive interfaces to “fat” interfaces
![Page 51: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/51.jpg)
Common Refactorings
• Extract Interface
![Page 52: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/52.jpg)
Keep Interfaces Small and Focused
![Page 53: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/53.jpg)
Membership Provider
![Page 54: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/54.jpg)
ISP Fail (sometimes)
public IRepository<T>{ T GetById(int id); IEnumerable<T> List(); void Create(T item); void Update(T item); void Delete(T item);}
![Page 55: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/55.jpg)
ISP OK (i.e. to support CQRS)public IRepository<T> : IReadRepository<T>, IWriteRepository<T>{ }public IReadRepository<T>{ T GetById(int id); IEnumerable<T> List();}public IWriteRepository<T> void Create(T item); void Update(T item); void Delete(T item);}
Existing implementations of IRepository<T> are unaffected by pulling out smaller interfaces!No existing code breaks!
![Page 56: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/56.jpg)
![Page 57: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/57.jpg)
Dependency Inversion Principle
High-level modules should not depend on low-level modules. Both should depend on abstractions.
Abstractions should not depend on details. Details should depend on abstractions.
Agile Principles, Patterns, and Practices in C#
![Page 58: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/58.jpg)
Dependency Inversion Principle
• Depend on Abstractions• Interfaces, not concrete types
• Inject Dependencies into Classes
• Structure Solution so Dependencies Flow Toward Core• Onion Architecture (a.k.a. Ports and Adapters, a.k.a. Hexagonal Architecture)
![Page 59: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/59.jpg)
Application Layers
![Page 60: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/60.jpg)
Data Access Evolution
No separation of concerns:
Data access logic baked directly into UIASP.NET Data Source ControlsClassic ASP scripts
Data access logic in UI layer via codebehindASP.NET Page_Load eventASP.NET Button_Click event
User Interface
Database
Compile Time
Runtime
![Page 61: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/61.jpg)
Data Access : Helper Classes
Calls to data made through a utility
Example: Data Access Application Block (SqlHelper)
Logic may still live in UI layer
Or a Business Logic Layer may make calls to a Data Access Layer which might then call the helper
User Interface
Database
Compile Time
Runtime
Helper Class
![Page 62: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/62.jpg)
What’s Missing? Abstraction!
No way to abstract away data access
Tight coupling
Leads to Big Ball of Mud system
Solution:Depend on interfaces, not
concrete implementationsWhat should we call such
interfaces? Repositories!
User Interface
Database
Compile Time
Runtime
CoreIFooRepository
InfrastructureSqlFooRepository
![Page 63: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/63.jpg)
DIP Architecture (aka Ports and Adapters)
![Page 64: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/64.jpg)
Common Dependencies• Framework• Third Party Libraries• Database• File System• Email• Web Services• System Resources (Clock)• Configuration• The new Keyword• Static methods• Thread.Sleep• Random
See also responsibilities:• Persistence• Validation• Notification• Error Handling• Logging• Class Selection /
Construction• Formatting• Parsing• Mapping
![Page 65: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/65.jpg)
Common Refactorings
• Extract Class• Extract Interface / Apply Strategy Pattern• Extract Method• Introduce Service Locator / Container
![Page 66: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/66.jpg)
DIP Fail
![Page 67: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/67.jpg)
Hidden Dependencies
• Checkout Depends on an available SMTP server, but the class doesn’t reflect this
• Follow the Explicit Dependencies Principle• http://deviq.com/explicit-dependencies-principle/
![Page 68: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/68.jpg)
Some Improvement (Façade)
![Page 69: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/69.jpg)
DIP OK (Strategy Pattern / DI)
![Page 70: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/70.jpg)
DIP OK (Strategy Pattern / DI)
![Page 71: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/71.jpg)
Improving Quality Across the Industry
![Page 72: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/72.jpg)
Self-Improvement and Quality
• How fast can you produce:• Code you believe to be of high quality• Code that maybe gets the job done, but you believe to be of low
quality
• Which one can you produce more quickly?• Why?• How can we develop our skills and our tools so that
building quality is natural and easier than not doing so?
![Page 73: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/73.jpg)
Week 1 Week 2 Week 3 Week 4 Week 5 Week 6 Week 7 Week 8 Week 90
2
4
6
8
10
12
14
16
User Stories Completed
High Quality Low Quality
![Page 74: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/74.jpg)
Week 1 Week 2 Week 3 Week 4 Week 5 Week 6 Week 7 Week 8 Week 90
2
4
6
8
10
12
14
16
18
20
User Stories Completed
High Quality Low Quality
![Page 75: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/75.jpg)
Summary•Maintain / Improve Application Code• Follow DRY/SOLID Principles•Use Characterization Tests to “fix”
behavior•Apply Common Refactorings•Re-run Tests After (and during)
Refactorings•Be Explicit About Class Dependencies• Train and Practice to Write Better Code
Faster
![Page 76: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/76.jpg)
Learn More• DevIQ.com – Take Pride in Your Code• Ardalis.com• @ardalis• Pluralsight:• SOLID Principles of OO Design• N-Tier Architecture in C#• Refactoring Fundamentals• Domain-Driven Design Fundamentals• Design Pattern Library• Pair Programming
![Page 77: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/77.jpg)
Books
Refactoring http://amzn.to/110tscA
Refactoring to Patterns http://amzn.to/Vq5Rj2
Working Effectively with Legacy Code http://amzn.to/VFFYbn
Code Complete http://amzn.to/Vq5YLv
Clean Code http://amzn.to/YjUDI0
![Page 78: Improving the Quality of Existing Software - DevIntersection April 2016](https://reader031.vdocuments.site/reader031/viewer/2022030303/587ac59a1a28abc0478b7cdb/html5/thumbnails/78.jpg)
© DEVintersection. All rights reserved.http://www.DEVintersection.com
Please use Event Board to fill out a session evaluation.
Questions?
Thank you!