Writing clean code in C# and .NET

49
Writing Clean Code in C# and .NET

description

Maintaining the product is one (if not the most) expensive area of the overall product costs. Writing clean code can significantly lower these costs, making it more efficient during the initial development and results in more stable code. In this session participants will learn how to apply C# techniques in order to improve the efficiency, readability, testability and extensibility of code.

Transcript of Writing clean code in C# and .NET

Page 1: Writing clean code in C# and .NET

Writing Clean Code in C# and .NET

Page 2: Writing clean code in C# and .NET

About.ME

• Senior Consultant @CodeValue

• Developing software (Professionally) since 2002• Writing clean code since 2009

• Blogger: http://blog.drorhelper.com

Page 3: Writing clean code in C# and .NET

Let’s talk about software bugs

Page 4: Writing clean code in C# and .NET

Bugs cost around $312 Billion Per Year

Page 5: Writing clean code in C# and .NET

And it’s all a developer’s fault

Page 6: Writing clean code in C# and .NET

The cost of fixing bugs

Rquirments Design Code Dev T Acc T Operation1 2

10

20

50

150

[B. Boehm - ICSE 2006 Keynote Address]

Page 7: Writing clean code in C# and .NET

High quality code is:

• Easy to read and understand• Impossible to hide bugs• Easy to extend• Easy to change• Has unit tests

Be a proud of your code

Page 8: Writing clean code in C# and .NET

Broken windows

Page 9: Writing clean code in C# and .NET

The cost of owning a mess

0

10

20

30

40

50

60

70

80

90

100

Productivity

Prod

uctiv

ity

[Robert Martin – “Clean Code]”

Page 10: Writing clean code in C# and .NET

Quality == Agility

• Adapt to changes• Don’t be held back by bugs• Cannot be agile without high quality code

Page 11: Writing clean code in C# and .NET

How a developer spends his time

60% - 80% time spent in understanding code

So make sure your code is readable

But what is a readable code?

Page 12: Writing clean code in C# and .NET

“Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live”

Page 13: Writing clean code in C# and .NET

Megamoth

Stands for MEGA MOnolithic meTHod.

Often contained inside a God Object, and usually stretches over two screens in height.

Megamoths of greater size than 2k LOC have been sighted. Beware of the MEGAMOTH!

http://blog.codinghorror.com/new-programming-jargon/

Page 14: Writing clean code in C# and .NET

Write short methods – please!

• It’s easier to understand• Performance won’t suffer• Avoid mixing abstraction layers• Enable re-use

• Also write small classes

Page 15: Writing clean code in C# and .NET

How can we recognize bad code?

• You know it we you see it• You feel it when you write it

• You get used to it after a while

• known as Code Smells

Page 16: Writing clean code in C# and .NET

Code Smells

• Duplicate code• Long method• Large class• Too many parameters• Feature envy• Inappropriate intimacy• Refused request• Lazy class/Freeloader• Contrived complexity• Naming!• Complex Conditionals• And more…

http://en.wikipedia.org/wiki/Code_smell

Page 17: Writing clean code in C# and .NET

Comments often are used as a deodorantRefactoring, Martin Fowler

Page 18: Writing clean code in C# and .NET

Comments are a dead giveaway

• If explains how things done means that the developer felt bad about the code

• “Code title” – should be a method• Commented Old code – SCM

Good comments exist in the wild – but rare

Page 19: Writing clean code in C# and .NET

http://stackoverflow.com/questions/184618/what-is-the-best-comment-in-source-code-you-have-ever-encountered

/// <summary>/// Gets or sets the name of the first./// </summary>/// <value>The name of the first.</value>public string FirstName } get { return _firstName; } set { _firstName = value; } {

/** Logger */private Logger logger = Logger.getLogger();

/// <summary>/// The possible outcomes of an update operation (save or delete)/// </summary>public enum UpdateResult} /// <summary> /// Updated successfully /// </summary> Success = 0, /// <summary> /// Updated successfully /// </summary> Failed = 1{

//private instance variable for storing agepublic static int age;

// Always returns true.public bool isAvailable() } return false;{

Page 20: Writing clean code in C# and .NET

Regions == Comments

Page 21: Writing clean code in C# and .NET

Naming is important

d, days daysSinceLastPayment

customerPo customerPurchaseOrder

productIdString productId

genymdhms generationTimeStamp

Page 22: Writing clean code in C# and .NET

Dead Code

• Code which is never run• But still has maintenance costs

• Solution - delete

Page 23: Writing clean code in C# and .NET

Undead Code

Dead code that you’re afraid to delete

- “I might need this…”

geek-and-poke.com/

// UNUSED// Separate into p_slidoor.c?#if 0 // ABANDONED TO THE MISTS OF TIME!!!//// EV_SlidingDoor : slide a door horizontally// (animate midtexture, then set noblocking line)//

Page 24: Writing clean code in C# and .NET

Avoid duplicate code (DRY)

“Every piece of knowledge must have a single, unambiguous, authoritative representation within a system”

The Pragmatic Programmer: Dave Thomas, Andy Hunt

Page 25: Writing clean code in C# and .NET

public bool HasGroup(List<Token> tokenList){for(Token token : tokemList){

if(token.get_group() != null) {return true;

{{return false;

{

public Group GetValidGroup(List<Customer> customers){for(Customer customer : customers){

Group group = customer.get_group();if(group != null) {

return group;{

{return null;

{

Page 26: Writing clean code in C# and .NET

Good code start with good design

Bad Design Good design

Rigid Loosely coupled

Fragile Highly cohesive

Immobile Easily composable

Viscous Context independent

It’s all about dependencies• In .NET Reference == dependency• Change in dependency change in code

Page 27: Writing clean code in C# and .NET

This is not OOP!!!

public class Record_Base

{

public DateTime RecordDateTime

{

get { return _recordDateTime; }

set

{

if (this.GetType().Name == "Record_PartRegister")_recordDateTime = value;

else

throw new Exception("Cannot call set on RecordDateTime for table " + this.GetType().Name);

}

}

}

http://thedailywtf.com/Articles/Making-Off-With-Your-Inheritance.aspx

Page 28: Writing clean code in C# and .NET

Design stamina hypothesis

http://martinfowler.com/bliki/DesignStaminaHypothesis.html

Page 29: Writing clean code in C# and .NET

Principles of Object Oriented Design

Single responsibility

Open/closed

Liskov substitution

Interface segregation Dependency inversion

www.butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

Page 30: Writing clean code in C# and .NET

Single responsibility

A class should have one, and only one, reason to change.

http://www.amazon.com/Wenger-16999-Swiss-Knife-Giant/dp/B001DZTJRQ/

Page 31: Writing clean code in C# and .NET

Naming as code smell

Having difficulties naming your class/method?

You might be violating SRP

Page 32: Writing clean code in C# and .NET

public interface ITimerService{ IDisposable SetTimout(long durationMilliSeconds, Action callback); Task Delay(TimeSpan delay, CancellationToken token); void KillLastSetTimer();}

public interface IDispacherTimerService : ITimerService{ long GetMilisecondsFromLastStart();}

public interface IElapsedTimerService : ITimerService{ void SetTimout(long durationMilliSeconds, Action<TimeSpan> callback);}

Page 33: Writing clean code in C# and .NET

Open closed principle

software entities should be

open for extension,

but

closed for modification

Page 34: Writing clean code in C# and .NET
Page 35: Writing clean code in C# and .NET

Liskov subtitution

objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program

Page 36: Writing clean code in C# and .NET

LSP smell - look for type checking

void ArrangeBirdInPattern(IBird aBird)}

var aPenguin = aBird as Pinguin;if (aPenguin != null)}

ArrangeBirdOnGround(aPenguin);{else}

ArrangeBirdInSky(aBird);{

// What about Emu?{

Page 37: Writing clean code in C# and .NET

Interface segregation

Many client specific interfaces are better than one general purpose interface.

http://en.wikipedia.org/wiki/Cockpit

Page 38: Writing clean code in C# and .NET

Dependency Inversion

Depend upon abstractions.

Do not depend upon concretions.

Page 39: Writing clean code in C# and .NET

Your code will change!

• Requirements change• Bugs are found• New feature requests

Your design will change

Page 40: Writing clean code in C# and .NET

In the beginning…

Application was beautiful - then came change…

• Software Rot– Duplication– Excess coupling– Quick fixes– Hacks

Page 41: Writing clean code in C# and .NET

public override void HandleActionRejected(User from, reason reason)} Logger.Info("HandleActionRejected - user:{0}", from.Id); /*foreach (var user in UserRepository.GetAllUsers)

}Client.SendInfo(user, from, reason);

{*/

//2.2 Events.Users.Value = new UserData } SessionId = CurrentSession.Id, HaveIInitiated = true, OtherUser = from, StartCallStatus = Events.ConvertToCallStatus(answer){ ; UserRepository.Remove(from, reason);

if(UserRepository.IsEmpty()) }

Exit(); {{

Page 42: Writing clean code in C# and .NET

Refactoring

Page 43: Writing clean code in C# and .NET

Refactoring

“a disciplined technique for restructuring an existing body of code, altering its internal structure without changing its external behavior”- Martin Fowler

http://refactoring.com/catalog/

Page 44: Writing clean code in C# and .NET

Refactoring with Visual Studio

Page 45: Writing clean code in C# and .NET

Code reviews

Can catch up to 60% of defects

Effective code reviews are:• Short – don’t waste time• Constructive• Avoid emotionally draining arguments

Everybody reviews and everybody is reviewed

Page 46: Writing clean code in C# and .NET

No quality has very high cost

Never have time to do it,

but always have time to re-do it.

Explain why this feature takes so much time

“You rush a miracle man, you get rotten miracles.”

Page 47: Writing clean code in C# and .NET

Don’t expect your company to force you

Be a professional

Care about your code

48

Page 48: Writing clean code in C# and .NET

Improve your code

• Start as soon as you can• Don’t compromise

Schedule time for quality–Improve existing code–Make it work, then make it better

49

Page 49: Writing clean code in C# and .NET