Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)
-
Upload
theo-jungeblut -
Category
Documents
-
view
581 -
download
1
description
Transcript of Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)
![Page 1: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/1.jpg)
Clean CodeDesign Patterns
and Best PracticesSan Francisco, January 16th 2013
Bay.NET San Francisco
![Page 2: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/2.jpg)
Theo Jungeblut• Engineering manager & lead by day
at AppDynamics in San Francisco
• Coder & software craftsman by night
• Architects decoupled solutions tailored to business needs & crafts maintainable code to last
• Worked in healthcare and factory automation, building mission critical applications, framework & platforms
• Degree in Software Engineeringand Network Communications
• Enjoys cycling, running and [email protected]
www.designitright.net
![Page 3: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/3.jpg)
Rate Session & Win a Shirt
http://www.speakerrate.com/theoj
![Page 4: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/4.jpg)
Where to get the Slides
http://www.slideshare.net/theojungeblut
![Page 5: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/5.jpg)
Overview• Why Clean Code• Clean Code Developer Initiative • Principles and Practices• Code Comparison • Q&A
![Page 6: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/6.jpg)
Does writing Clean Code make us more efficient?
![Page 7: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/7.jpg)
The only valid Measurement of Code Quality
![Page 8: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/8.jpg)
What is Clean Code?
![Page 9: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/9.jpg)
Clean Code is maintainable
Source code must be:• readable & well structured• extensible• testable
![Page 10: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/10.jpg)
Software Engineering
&Software
Craftsmanship
![Page 11: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/11.jpg)
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.”
![Page 12: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/12.jpg)
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
![Page 13: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/13.jpg)
Clean Code Developer
Graphic by Michael Hönnig http://michael.hoennig.de/2009/08/08/clean-code-developer-ccd/
![Page 14: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/14.jpg)
Graphic by Michael Hönnig http://michael.hoennig.de/2009/08/08/clean-code-developer-ccd/
Clean Code Developer – 1st Iterationby Ralf Westphal & Stefan Lieser – http://www.clean-code-developer.de
![Page 15: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/15.jpg)
Keep it simple, stupid(KISS)
![Page 16: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/16.jpg)
KISS-Principle – “Keep It Simple Stupid”
http://blogs.smarter.com/blogs/Lego%20Brick.jpg
by Kelly Johnson
![Page 17: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/17.jpg)
The Power of Simplicity
http://www.geekalerts.com/lego-iphone/
Graphic by Nathan Sawaya courtesy of brickartist.com
Graphic by Nathan Sawaya courtesy of brickartist.com
![Page 18: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/18.jpg)
Chaos build from simplicity
Graphic by Nathan Sawaya courtesy of brickartist.com
![Page 19: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/19.jpg)
Don’t repeat yourself(DRY)
![Page 20: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/20.jpg)
Don’t repeat yourself (DRY)by Andy Hunt and Dave Thomas in their book “The Pragmatic Programmer”
// Code Copy and Paste Method public Class Person { public string FirstName { get; set;} public string LastName { get; set;} public Person(Person person) { this.FirstName = string.IsNullOrEmpty(person.FirstName)
? string.Empty : (string) person.FirstName.Clone();
this.LastName = string.IsNullOrEmpty(person.LastName) ? string.Empty : (string) person.LastName.Clone();
}
public object Clone() { return new Person(this); }}
// DRY Method public Class Person { public string FirstName { get; set;} public string LastName { get; set;} public Person(Person person) { this.FirstName = person.FirstName.CloneSecured(); this.LastName = person.LastName.CloneSecured(); }
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(); } }
![Page 21: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/21.jpg)
Graphic by Michael Hönnig http://michael.hoennig.de/2009/08/08/clean-code-developer-ccd/
Clean Code Developer – 1st Iterationby Ralf Westphal & Stefan Lieser – http://www.clean-code-developer.de
![Page 22: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/22.jpg)
Clean Code Developer – 2nd Iterationby 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/
![Page 23: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/23.jpg)
Separation of Concerns (SoC)
Single Responsibility Principle
(SRP)
![Page 24: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/24.jpg)
http://www.technicopedia.com/8865.html
The Product
![Page 25: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/25.jpg)
http://www.technicopedia.com/8865.html
Component / Service
![Page 26: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/26.jpg)
http://technicbricks.blogspot.com/2009/06/tbs-techpoll-12-results-2009-1st.html
Class, Struct, Enum etc.
![Page 27: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/27.jpg)
Separation of Concerns (SoC)
• “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. “
probably by Edsger W. Dijkstra in 1974
http://en.wikipedia.org/wiki/Separation_of_Concerns
![Page 28: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/28.jpg)
Single Responsibility Principle (SRP)
“Every object should have a single responsibility, and that responsibility should be entirely encapsulated by the class.”
by Robert C Martin
http://www.ericalbrecht.com
http://en.wikipedia.org/wiki/Single_responsibility_principle
public class Logger : ILogger{ public Logger(ILoggingSink loggingSink) {} public void Log(string message) {}}
![Page 29: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/29.jpg)
Read, Read, Read
![Page 30: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/30.jpg)
Clean Code Developer – 2nd Iterationby 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/
![Page 31: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/31.jpg)
Graphic by Michael Hönnig http://michael.hoennig.de/2009/08/08/clean-code-developer-ccd/
Clean Code Developer – 3rd Iterationby Ralf Westphal & Stefan Lieser – http://www.clean-code-developer.de
![Page 32: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/32.jpg)
Information Hiding Principle(IHP)
![Page 33: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/33.jpg)
“.. information hiding is the principle of segregation of the design decisions on a computer program that are most likely to change, ..”
Information Hiding Principle (IHP)by David Parnas (1972)
http://en.wikipedia.org/wiki/Information_hiding
![Page 34: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/34.jpg)
Interfaces / Contracts
public interface ILogger{ void Log(string message);}
• Decouple Usage and Implementation through introduction of a contract• Allows to replace implementation without changing the consumer
public class Logger : ILogger{ public Logger(ILoggingSink loggingSink) {} public void Log(string message) {}}
![Page 35: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/35.jpg)
Liskov Substitution Principle(LSP)
![Page 36: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/36.jpg)
“Liskov’s notion of a behavioral subtype defines a notion of substitutability for mutable objects”
Liskov Substitution Principle (LSP)by Barbara Liskov, Jannette Wing (1994)
http://en.wikipedia.org/wiki/Liskov_substitution_principle
![Page 37: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/37.jpg)
Dependency Inversion Principle(DIP)
![Page 38: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/38.jpg)
Dependency Inversion Principle (DIP)
• “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
by Robert C. Martin
![Page 39: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/39.jpg)
Silicon Valley Code Camp Oct. ~ 5th – 6th
http://www.siliconvalley-codecamp.com
![Page 40: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/40.jpg)
Graphic by Michael Hönnig http://michael.hoennig.de/2009/08/08/clean-code-developer-ccd/
Clean Code Developer – 3rd Iterationby Ralf Westphal & Stefan Lieser – http://www.clean-code-developer.de
![Page 41: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/41.jpg)
Graphic by Michael Hönnig http://michael.hoennig.de/2009/08/08/clean-code-developer-ccd/
Clean Code Developer – 4th Iterationby Ralf Westphal & Stefan Lieser – http://www.clean-code-developer.de
![Page 42: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/42.jpg)
Open Closed Principle(OCP)
![Page 43: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/43.jpg)
An implementation is open for extension but closed for modification
Open/Closed Principle (OCP)by Bertrand Meyer (1988)
http://en.wikipedia.org/wiki/Open/closed_principle
![Page 44: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/44.jpg)
Law of Demeter(LoD)
![Page 45: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/45.jpg)
“• 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.”
Law of Demeter (LoD)Northeastern University (1987)
http://en.wikipedia.org/wiki/Law_Of_Demeter
![Page 46: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/46.jpg)
Single Responsibility Principle
Open/Closed Principle
Liskov Substitution Principle
Interface Segregation Principle
Dependency Inversion Principle
SOLID
Robert C Martin: http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod
![Page 47: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/47.jpg)
Graphic by Michael Hönnig http://michael.hoennig.de/2009/08/08/clean-code-developer-ccd/
Clean Code Developer – 4th Iterationby Ralf Westphal & Stefan Lieser – http://www.clean-code-developer.de
![Page 48: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/48.jpg)
Graphic by Michael Hönnig http://michael.hoennig.de/2009/08/08/clean-code-developer-ccd/
Clean Code Developer – 5th Iterationby Ralf Westphal & Stefan Lieser – http://www.clean-code-developer.de
![Page 49: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/49.jpg)
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!)
![Page 50: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/50.jpg)
Downloads, Feedback & Comments:
Q & A
Graphic by Nathan Sawaya courtesy of brickartist.com
[email protected] www.speakerrate.com/theoj
![Page 51: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/51.jpg)
References… http://clean-code-developer.comhttp://michael.hoennig.de/2009/08/08/clean-code-developer-ccd/http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOodhttp://www.manning.com/seemann/http://en.wikipedia.org/wiki/Keep_it_simple_stupidhttp://picocontainer.org/patterns.htmlhttp://en.wikipedia.org/wiki/Separation_of_concernshttp://en.wikipedia.org/wiki/Single_responsibility_principlehttp://en.wikipedia.org/wiki/Information_hidinghttp://en.wikipedia.org/wiki/Liskov_substitution_principlehttp://en.wikipedia.org/wiki/Dependency_inversion_principlehttp://en.wikipedia.org/wiki/Open/closed_principlehttp://en.wikipedia.org/wiki/Law_Of_Demeterhttp://en.wikipedia.org/wiki/Don't_repeat_yourselfhttp://en.wikipedia.org/wiki/You_ain't_gonna_need_ithttp://en.wikipedia.org/wiki/Component-oriented_programminghttp://en.wikipedia.org/wiki/Service-oriented_architecturehttp://www.martinfowler.com/articles/injection.htmlhttp://www.codeproject.com/KB/aspnet/IOCDI.aspxhttp://msdn.microsoft.com/en-us/magazine/cc163739.aspxhttp://msdn.microsoft.com/en-us/library/ff650320.aspxhttp://msdn.microsoft.com/en-us/library/aa973811.aspxhttp://msdn.microsoft.com/en-us/library/ff647976.aspxhttp://msdn.microsoft.com/en-us/library/cc707845.aspxhttp://msdn.microsoft.com/en-us/library/bb833022.aspxhttp://unity.codeplex.com/http://www.idesign.net/idesign/DesktopDefault.aspx?tabindex=5&tabid=11
![Page 52: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/52.jpg)
… more ReferencesResharperhttp://www.jetbrains.com/resharper/
FxCop / Code Analysis http://msdn.microsoft.com/en-us/library/bb429476(VS.80).aspxhttp://blogs.msdn.com/b/codeanalysis/http://www.binarycoder.net/fxcop/index.html
Code Contractshttp://msdn.microsoft.com/en-us/devlabs/dd491992http://research.microsoft.com/en-us/projects/contracts/
Pex & Molehttp://research.microsoft.com/en-us/projects/pex/
StyleCophttp://stylecop.codeplex.com/
Ghostdoc http://submain.com/products/ghostdoc.aspx
Spellcheckerhttp://visualstudiogallery.msdn.microsoft.com/7c8341f1-ebac-40c8-92c2-476db8d523ce// Lego (trademarked in capitals as LEGO)
![Page 53: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/53.jpg)
Blog, Rating, Slides
http://www.DesignItRight.net
www.speakerrate.com/theoj
www.slideshare.net/theojungeblut
![Page 54: Clean Code - Design Patterns and Best Practices for Bay.NET SF User Group (01/16/2013)](https://reader033.fdocuments.us/reader033/viewer/2022052505/55520aaeb4c905421a8b544f/html5/thumbnails/54.jpg)
… thanks for you attention!
Please fill out the feedback, and…