Clean Code at Silicon Valley Code Camp 2011 (02/17/2012)
- 1. Silicon Valley
Code Camp
Clean Code
Why Clean Code matters
Foothill College, October 9nd 2011
- 2. Theo Jungeblut
• Senior Software Developer at
Omnicell Inc. in Mountain View
• Has been designing and
implementing .NET based
applications , components and
frameworks for more than 8 years
• Previously worked in factory
automation with focus on
component based software and
framework development for 3 ½
years
theo@csharp-lighthouse.com
• Degree in Software Engineering
and Network Communications www.csharp-lighthouse.com
- 3. Overview
• Why Clean Code
• Tools
• Resharper
• FxCop, StyleCop & StyleCop plugin for Resharper
• GhostDoc & Spell Checker
• Code Contracts, Pex & Moles
• Clean Code Developer Initiative
• Principles and Practices
• Code Comparison
• Q&A
- 7. Clean Code is maintainable
Source code must be:
• readable & well structured
• extensible
• testable
- 9. The “Must Read”-Book(s)
by Robert C Martin
A Handbook of Agile
Software
Craftsmanship
“Even bad code can
function. But if code
isn’t clean, it can bring a
development
organization to its
knees.”
- 10. Code Maintainability *
Principles Patterns Containers
Why? How? What?
Extensibility Clean Code Tool reuse
* from: Mark Seemann’s “Dependency Injection in .NET” presentation Bay.NET 05/2011
- 11. .NET Tools and their Impact
Tool name Positive Impact Negative Impact
Resharper compiling ++++ VS responsiveness --
FxCop code quality ++ compiling time -
StyleCop code consistency +++ compiling time -
StyleCop plugin compiling time +++ VS responsiveness --
for Resharper
Ghost Doc automated docs potentially worse doc
Spell Checker fewer spelling errors ++ performance --
Code Contracts testability, quality ++ compiling time --
Pex & Moles automated test ++ compiling time --
- 12. Resharper
“The single most impacting development
addition to Visual Studio”
Features:
– Code Analysis
– Quick Fixes
– Code Templates
– Code Generation
– Code Cleanup
– Many, many more…
http://www.jetbrains.com/resharper/
- 13. FxCop / Static Code Analysis
Code Analysis:
– Correctness
– Library design
– Internationalization and localization
– Naming conventions
– Performance
– Security
http://msdn.microsoft.com/en-us/library/3z0aeatx.aspx
- 14. Style Cop with R# Integration
Code Consistency & Readability:
– Automated check of C# coding
standard
– Enforceable at check-in with TFS
check-in Policy
– Full Integration in Resharper with
Style Cop plugin:
– Code Analysis
– Quick Fixes
– Code Cleanup
- 15. Ghost Doc
• Save keystrokes and time
• Simplify documenting your code
• Benefit of the base class documentation
http://submain.com/products/ghostdoc.aspx
- 16. Spell Checker
• Spelll chicking for literals and comments in VS
http://visualstudiogallery.msdn.microsoft.com/7c8341f1-ebac-40c8-92c2-476db8d523ce/
- 17. • Design-by-Contract programming
• Improved testability
• Static verification
• API documentation integration with
Sandcastle
http://msdn.microsoft.com/en-us/devlabs/dd491992
- 18. Microsoft Pex & Moles
• Pex automatically generates test suites with
high code coverage.
• Moles allows to replace any .NET method with
a delegate.
http://research.microsoft.com/en-us/projects/pex/
- 19. Graphic by Michael Hönnig http://michael.hoennig.de/2009/08/08/clean-code-developer-ccd/
- 20. Clean Code Developer – 1st Iteration
by Ralf Westphal & Stefan Lieser – http://www.clean-code-developer.de
Graphic by Michael Hönnig http://michael.hoennig.de/2009/08/08/clean-code-developer-ccd/
- 23. The Power of Simplicity
Graphic by Nathan Sawaya courtesy of brickartist.com
Graphic by Nathan Sawaya courtesy of brickartist.com
http://www.geekalerts.com/lego-iphone/
- 26. Don’t repeat yourself (DRY)
by Andy Hunt and Dave Thomas in their book “The Pragmatic Programmer”
// Code Copy and Paste Method // DRY Method
public Class Person public Class Person
{ {
public string FirstName { get; set;} public string FirstName { get; set;}
public string LastName { get; set;} public string LastName { get; set;}
public Person(Person person) public Person(Person person)
{ {
this.FirstName = string.IsNullOrEmpty(person.FirstName) this.FirstName = person.FirstName.CloneSecured();
? string.Empty : (string) person.FirstName.Clone(); this.LastName = person.LastName.CloneSecured();
}
this.LastName = string.IsNullOrEmpty(person.LastName)
? string.Empty : (string) person.LastName.Clone(); public object Clone()
} {
return new Person(this);
public object Clone() }
{ }
return new Person(this);
}
} public static class StringExtension
{
public static string CloneSecured(this string original)
{
return string.IsNullOrEmpty(original) ? string.Empty : (string)original.Clone();
}
}
- 27. Clean Code Developer – 2nd Iteration
by Ralf Westphal & Stefan Lieser – http://www.clean-code-developer.de
Graphic by Michael Hönnig http://michael.hoennig.de/2009/08/08/clean-code-developer-ccd/
- 31. Class, Struct, Enum etc.
http://technicbricks.blogspot.com/2009/06/tbs-techpoll-12-results-2009-1st.html
- 32. Separation of Concerns (SoC)
probably by Edsger W. Dijkstra in 1974
• “In computer science,
separation of concerns (SoC) is
the process of separating a
computer program into distinct
features that overlap in
functionality as little as possible.
•A concern is any piece of
interest or focus in a program.
Typically, concerns are
synonymous with features or
behaviors. “
http://en.wikipedia.org/wiki/Separati
on_of_Concerns
- 33. Single Responsibility Principle (SRP)
by Robert C Martin
“Every object should have a single responsibility, and that
responsibility should be entirely encapsulated by the class.”
http://en.wikipedia.org/wiki/Single_responsibility_principle
public class Logger : ILogger
{
public Logger(ILoggingSink loggingSink)
{}
public void Log(string message)
{}
}
http://www.ericalbrecht.com
- 35. “Clean Code” –Guidelines *
by Robert C. Martin
• use meaningful, pronounceable, searchable Names
• write code readable top to bottom (Journal Style)
• prefer Exceptions over returning Error Codes
• explain yourself in Code
• avoid redundant, misleading and noise Comments
• don’t use a Comment when you can use a Method or Variable
• Avoid commented-out code and Javadocs in NonPublic Code
• Don’t Return or Pass Null
• Keep Tests Clean and have only One Assert per Test
• Classes and Methods should be small
• Limit the scope of Data and use Copies of Data
• Builds and Tests should only require 1 Step
* Chapter extract: Robert C. Martin –” Clean Code”, Parson Education, Inc. 2008
- 36. The “Must Read”-Book(s)
by Robert C Martin
A Handbook of Agile
Software
Craftsmanship
“Even bad code can
function. But if code
isn’t clean, it can bring a
development
organization to its
knees.”
- 37. TheKrzysztof Cwalina,Read”-Book(s)
by
“Must Brad Abrams
Framework Design
Guidelines
“teaches
developers the
best practices for
designing reusable
libraries for the
Microsoft .NET
Framework.”
- 38. Clean Code Developer – 3rd Iteration
by Ralf Westphal & Stefan Lieser – http://www.clean-code-developer.de
Graphic by Michael Hönnig http://michael.hoennig.de/2009/08/08/clean-code-developer-ccd/
- 40. Information Hiding Principle (IHP)
by David Parnas (1972)
“.. information hiding is the principle of
segregation of the design decisions on a
computer program that are most likely to
change, ..”
http://en.wikipedia.org/wiki/Information_hiding
- 42. Liskov Substitution Principle (LSP)
by Barbara Liskov, Jannette Wing (1994)
“Liskov’s notion of a behavioral subtype
defines a notion of substitutability for
mutable objects”
http://en.wikipedia.org/wiki/Liskov_substitution_principle
- 43. Interfaces / Contracts
• Decouple Usage and Implementation through introduction of a contract
• Allows to replace implementation without changing the consumer
public interface ILogger public class Logger : ILogger
{ {
void Log(string message); public Logger(ILoggingSink loggingSink)
} {}
public void Log(string message)
{}
}
- 45. Dependency Inversion Principle (DIP)
by Robert C. Martin
• “High-level modules should not depend on
low-level modules. Both should depend on
abstractions.
• Abstractions should not depend upon details.
Details should depend upon abstractions.”
http://en.wikipedia.org/wiki/Dependency_inversion_principle
- 46. Clean Code Developer – 4th Iteration
by Ralf Westphal & Stefan Lieser – http://www.clean-code-developer.de
Graphic by Michael Hönnig http://michael.hoennig.de/2009/08/08/clean-code-developer-ccd/
- 48. Open/Closed Principle (OCP)
by Bertrand Meyer (1988)
An implementation is open for extension
but closed for modification
http://en.wikipedia.org/wiki/Open/closed_principle
- 50. Law of Demeter (LoD)
Northeastern University (1987)
“
• Each unit should have only limited knowledge
about other units: only units “closely” related
to the current unit.
• Each unit should only talk to its friends;
don’t talk to strangers
• Only talk to your immediate friends.”
http://en.wikipedia.org/wiki/Law_Of_Demeter
- 51. S Single Responsibility Principle
O Open/Closed Principle
L Liskov Substitution Principle
I Interface Segregation Principle
D Dependency Inversion Principle
Robert C Martin: http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod
- 52. Clean Code Developer – 5th Iteration
by Ralf Westphal & Stefan Lieser – http://www.clean-code-developer.de
Graphic by Michael Hönnig http://michael.hoennig.de/2009/08/08/clean-code-developer-ccd/
- 54. Different Ways of doing something similar
http://www.ericalbrecht.com
http://www.julianaheng.com/transformers-rotf-bumblebee-
and-sam-action-figures/
http://www.ericalbrecht.com
- 59. Inversion of Control –
Constructor Injection
http://www.martinfowler.com/articles/injection.html
public class ContactManager : IContactManager
{
public ContactManager(ILogger logger,
IContactPersistence contactPersistence)
{
this.logger = logger;
if (logger == null)
{
throw new ArgumentNullException("logger");
}
…
}
}
- 60. Dependency Injection Container & more
• Typically support all types of Inversion of Control mechanisms
• Constructor Injection
• Property (Setter) Injection
• Interface Injection
• Service Locator
•.NET based DI-Container
• Unity
• Castle Windsor
• StructureMap
Related Technology:
• Spring.NET • Managed Extensibility Framework (MEF)
• Autofac • Windows Communication Foundation (WCF)
• Puzzle.Nfactory
• Ninject
• PicoContainer.NET
• and more
- 61. The “Must Read”-Book(s)
by Mark Seemann
Dependency
Injection is a set of
software design
principles and
patterns that
enable us to
develop loosely
coupled code.
http://www.manning.com/seemann/
- 62. Summary Clean Code
Maintainability is achieved through:
• Readability (Coding Guidelines)
• Simplification and Specialization
(KISS, SoC, SRP, OCP, )
• Decoupling (LSP, DIP, IHP, Contracts,
LoD, CoP, IoC or SOA)
• Avoiding Code Bloat (DRY, YAGNI)
• Quality through Testability
(all of them!)
- 63. Q&A
Downloads,
Feedback & Comments:
theo@csharp-lighthouse.com
www.csharp-lightouse.com
www.speakerrate.com/theoj
Graphic by Nathan Sawaya courtesy of brickartist.com
- 64. http://clean-code-developer.com
References…
http://michael.hoennig.de/2009/08/08/clean-code-developer-ccd/
http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod
http://www.manning.com/seemann/
http://en.wikipedia.org/wiki/Keep_it_simple_stupid
http://picocontainer.org/patterns.html
http://en.wikipedia.org/wiki/Separation_of_concerns
http://en.wikipedia.org/wiki/Single_responsibility_principle
http://en.wikipedia.org/wiki/Information_hiding
http://en.wikipedia.org/wiki/Liskov_substitution_principle
http://en.wikipedia.org/wiki/Dependency_inversion_principle
http://en.wikipedia.org/wiki/Open/closed_principle
http://en.wikipedia.org/wiki/Law_Of_Demeter
http://en.wikipedia.org/wiki/Don't_repeat_yourself
http://en.wikipedia.org/wiki/You_ain't_gonna_need_it
http://en.wikipedia.org/wiki/Component-oriented_programming
http://en.wikipedia.org/wiki/Service-oriented_architecture
http://www.martinfowler.com/articles/injection.html
http://www.codeproject.com/KB/aspnet/IOCDI.aspx
http://msdn.microsoft.com/en-us/magazine/cc163739.aspx
http://msdn.microsoft.com/en-us/library/ff650320.aspx
http://msdn.microsoft.com/en-us/library/aa973811.aspx
http://msdn.microsoft.com/en-us/library/ff647976.aspx
http://msdn.microsoft.com/en-us/library/cc707845.aspx
http://msdn.microsoft.com/en-us/library/bb833022.aspx
http://unity.codeplex.com/
http://www.idesign.net/idesign/DesktopDefault.aspx?tabindex=5&tabid=11
- 65. … more References
Resharper
http://www.jetbrains.com/resharper/
FxCop / Code Analysis
http://msdn.microsoft.com/en-us/library/bb429476(VS.80).aspx
http://blogs.msdn.com/b/codeanalysis/
http://www.binarycoder.net/fxcop/index.html
Code Contracts
http://msdn.microsoft.com/en-us/devlabs/dd491992
http://research.microsoft.com/en-us/projects/contracts/
Pex & Mole
http://research.microsoft.com/en-us/projects/pex/
StyleCop
http://stylecop.codeplex.com/
Ghostdoc
http://submain.com/products/ghostdoc.aspx
Spellchecker
http://visualstudiogallery.msdn.microsoft.com/
7c8341f1-ebac-40c8-92c2-476db8d523ce//
Lego (trademarked in capitals as LEGO)
- 66. Please fill out the
online feedback, and…
… thanks for you attention!
And visit and support the
Bay.net User Group
http://baynetug.org