49
En introduktion till SOLID principerna Hur uncle Bob förändrade mitt liv @joelabrahams son

En introduktion till SOLID-principerna

Embed Size (px)

DESCRIPTION

An introduction to the SOLID principles in Swedish that I gave at the EPiServer developers meetup in june 2010. You probably need to read the comments to understand some of the slides.

Citation preview

Page 1: En introduktion till SOLID-principerna

En introduktion till SOLID principerna

Hur uncle Bob förändrade mitt liv

@joelabrahamsson

Page 2: En introduktion till SOLID-principerna
Page 3: En introduktion till SOLID-principerna
Page 4: En introduktion till SOLID-principerna

Agile Principles, Patterns and Practices in C#

• UML (as a sketch)• Patterns • Agila arbetssätt som XP, TDD och

Refactoring• Designprinciper för klasser och

paket/assemblies

Page 5: En introduktion till SOLID-principerna
Page 6: En introduktion till SOLID-principerna
Page 7: En introduktion till SOLID-principerna
Page 8: En introduktion till SOLID-principerna
Page 9: En introduktion till SOLID-principerna

Single Responsibility Principle

Open/Closed Principle

Liskov Substitution Principle

Interface Segregation Principle

Dependency Inversion Principle

Page 10: En introduktion till SOLID-principerna

SOLID

• Fem priciper för objektorienterad utveckling• Hantera beroenden mellan klasser och

reducera onödig komplexitet• Underlättar testning• Principer, inte lagar• Kräver att studeras

Page 11: En introduktion till SOLID-principerna

Single Responsibility Principle

En klass bör ha en, och endast en, anledning att ändras.

Page 12: En introduktion till SOLID-principerna

Med andra ord...

En klass ska bara göra en sak.

Page 13: En introduktion till SOLID-principerna

Exempel

public class Customer{ public IEnumerable<Order> Orders { get {...} }

public bool IsValid() {...}

public void Save() {...}}

Page 14: En introduktion till SOLID-principerna

Single Responsibility Principle

• Är även applicerbar på metoder, paket/assemblies etc.

• Ligger till grund för många av de andra principerna

Page 15: En introduktion till SOLID-principerna
Page 16: En introduktion till SOLID-principerna

Open/Closed Principle

Klasser ska vara öppna för utökning men stängda för modifiering.

Page 17: En introduktion till SOLID-principerna

Med andra ord...

Vi bör använda arv och polymorfism för att skriva kod som inte behöver ändras när kraven gör det.

Page 18: En introduktion till SOLID-principerna

Exempel

Vi behöver en klass som beräknar arean för ett antal rektanglar.

public class Rectangle{ public double Width { get; set; } public double Height { get; set; }}

Page 19: En introduktion till SOLID-principerna

Let’s do it!public class AreaCalculator{ public double Area(Rectangle[] shapes) { double area = 0; foreach (var shape in shapes) { area += shape.Width*shape.Height; }

return area; }}

Page 20: En introduktion till SOLID-principerna

Ett nytt krav

Vi glömde att det finns cirklar. Vi behöver beräkna arean för både cirklar och rektanglar.

Page 21: En introduktion till SOLID-principerna

En basklass och en if-sats -> Done!public abstract class Shape { }

public class AreaCalculator{ public double Area(Shape[] shapes) { double area = 0; foreach (var shape in shapes) { if (shape is Rectangle) area += RectangleArea((Rectangle)shape); else area += CircleArea((Circle) shape); }

return area; }}

Page 22: En introduktion till SOLID-principerna

En bättre lösningpublic abstract class Shape{ public abstract double Area();}

public class AreaCalculator{ public double Area(Shape[] shapes) { double area = 0; foreach (var shape in shapes) { area += shape.Area(); }

return area; }}

Page 23: En introduktion till SOLID-principerna

• Den viktigaste av principerna• Kraven ändras ständigt…• …men vi behöver ändå skriva kod som är

stabil• Med OO kan vi skapa abstraktioner med stabil

design men flexibelt beteende• När ska vi applicera principen?

Open/Closed Principle

Page 24: En introduktion till SOLID-principerna
Page 25: En introduktion till SOLID-principerna

Dependency Inversion Principle

A. Högnivåmoduler ska inte vara beroende av lågnivåmoduler. Båda ska vara beroende av abstraktioner.

B. Abstraktioner ska inte vara beroende av detaljer. Detaljer ska vara beroende av abstraktioner.

Page 26: En introduktion till SOLID-principerna

Med andra ord...

Våra klasser ska inte vara beroende av andra klasser. De ska vara beroende av abstraktioner.

Page 27: En introduktion till SOLID-principerna

• Möjliggör att en klass kan använda en annan komponent utan att känna till vilken specifik implementation det är

• Åstadkoms genom Dependency Injection eller Service Locator

Inversion of Control

Page 28: En introduktion till SOLID-principerna

Ett exempel

Page 29: En introduktion till SOLID-principerna

IoC leder till flexibel design

Page 30: En introduktion till SOLID-principerna

• Den som använder vår klass måste tillhandahålla instanser av de klasser som den behöver

• Constructor Injection• Property Injection

Dependency Injection

Page 31: En introduktion till SOLID-principerna

• The consumer retrieves the component it depends upon from a third party, a Service Locator

• Use Dependency Injection instead if you can

Service Locator

Page 32: En introduktion till SOLID-principerna
Page 33: En introduktion till SOLID-principerna

Liskov Substitution Principle

Subklasser måste vara utbytbara mot dess basklasser.

Page 34: En introduktion till SOLID-principerna

Med andra ord...

Användare av vår subklass ska inte behöva bry sig om huruvida de använder subklassen eller basklassen.

Page 35: En introduktion till SOLID-principerna

Ett enkelt exempelpublic abstract class Animal{ public abstract void MakeNoise();}

Page 36: En introduktion till SOLID-principerna

Ett enkelt exempelpublic class Cat : Animal{ public override void MakeNoise() { Console.WriteLine("Mjau"); }}

Page 37: En introduktion till SOLID-principerna

Ett enkelt exempelpublic class Snail : Animal{ public override void MakeNoise() { throw new NotImplementedException(); }}

Page 38: En introduktion till SOLID-principerna

Liskov Substitution Principle

• Det är OK att försvaga förhandsvillkor och stärka efterhands-villkor i en subklass men inte tvärtom.

• Om vi bryter mot LSP så tyder det på att vi behöver refaktorisera vår klasshierarki

• En princip, inte en lag

Page 39: En introduktion till SOLID-principerna
Page 40: En introduktion till SOLID-principerna

Interface Segregation Principle

Användare av ett interface ska inte tvingas vara beroende av metoder som de inte använder.

Page 41: En introduktion till SOLID-principerna

Med andra ord...

Skapa interface som är små och logiskt sammanhängande.

Page 42: En introduktion till SOLID-principerna

Exempel - IPageSourcepublic interface IPageSource{ PageDataCollection GetChildren(PageReference pageLink); PageData GetPage(PageReference pageLink); PageData CurrentPage { get; }}

Page 43: En introduktion till SOLID-principerna

Exempel - IPageSourcepublic class DataFactory : IPageSource{ public PageData GetPage(PageReference pageLink) { ... } public PageData GetChildren(PageReference pageLink) { ... }

public PageData CurrentPage { get { return null; } }}

Page 44: En introduktion till SOLID-principerna
Page 45: En introduktion till SOLID-principerna

Mer om SOLID-principerna

• Agile Principles, Patterns and Practices in C#• butunclebob.com• blog.objectmentor.com• Stefan Forsbergs serie på EPiServer World• www.codingefficiency.com

Page 46: En introduktion till SOLID-principerna

Mer av uncle Bob

Page 47: En introduktion till SOLID-principerna

Sammanfattning

• Uncle Bob, Robert C.Martin, är en författare vi kan lära mycket av

• Läs Agile Principles, Patterns and Practices in C#!

• Läs Clean Code!• SOLID är fem principer för objekt orienterad

utveckling som hjälper oss hantera beroenden och komplexitet

Page 48: En introduktion till SOLID-principerna
Page 49: En introduktion till SOLID-principerna

@joelabrahamssonhttp://joelabrahamsson.com