Top Banner
Single Responsibility Principle By Eyal Golan
45
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Single Responsibility Principle @ Clean Code Alliance Meetup

Single Responsibility Principle

By Eyal Golan

Page 2: Single Responsibility Principle @ Clean Code Alliance Meetup

About Me

2

Senior Java developer and agile practitioner.Practicing TDD, clean code. Software craftsmanship advocate.

Tech lead / Scrum master @ eBayTeam lead @ StartApp, doing, among other things:● Manages the continuous integration and deployment of the system.● Leading the coding practices.

Engineering team lead @ AppLift (Berlin)

Page 3: Single Responsibility Principle @ Clean Code Alliance Meetup

Agenda

1. SOLID

2. SRP overview

3. Why SRP?

4. Recognizing SRP violation

5. Develop for SRP

6. Summarize

3

Page 4: Single Responsibility Principle @ Clean Code Alliance Meetup

4

Page 5: Single Responsibility Principle @ Clean Code Alliance Meetup

•Robert C. Martin – Uncle Bob•http://en.wikipedia.org/wiki/SOLID_(object-

oriented_design)5

Single responsibility principleOpen / closed principleLiskov substitution principleInterface segregation principleDependency inversion principle

Page 6: Single Responsibility Principle @ Clean Code Alliance Meetup

SOLID

•Single responsibility principle•A class should have only a single

responsibility

6

Page 7: Single Responsibility Principle @ Clean Code Alliance Meetup

SOLID

•Open/closed principle•Open for extension, but closed for

modification•Alistair Cockburn: “…Identify points of predicted

variation and create a stable interface around them…”

7

Page 8: Single Responsibility Principle @ Clean Code Alliance Meetup

SOLID

•Liskov substitution principle•Replace objects with instances of their

subtypes without altering the correctness of that program

8

Rectangle

Square

Page 9: Single Responsibility Principle @ Clean Code Alliance Meetup

SOLID

•Interface segregation principle•Many client-specific interfaces are better

than one general-purpose interface

9

Page 10: Single Responsibility Principle @ Clean Code Alliance Meetup

SOLID•Dependency inversion principle•Abstractions should not depend on details•Don’t depend on anything concrete

•Work with interfaces

10

Page 11: Single Responsibility Principle @ Clean Code Alliance Meetup

11

SingleResponsibilityPrinciple

Page 12: Single Responsibility Principle @ Clean Code Alliance Meetup

Single Responsibility Principle

•Wikipedia• …the single responsibility principle states that every class

should have a single responsibility, and that responsibility should be entirely encapsulated by the class. All its services should be narrowly aligned with that responsibility…

•Clean Code•A class or module should have one, and only

one, reason to change

12

Page 13: Single Responsibility Principle @ Clean Code Alliance Meetup

Which Components?

•Methods•Classes•Packages•Modules•System

13

Page 14: Single Responsibility Principle @ Clean Code Alliance Meetup

14

Why SRP ?

Page 15: Single Responsibility Principle @ Clean Code Alliance Meetup

Why SRP?

•Organize the code

15

George A. Miller

Page 16: Single Responsibility Principle @ Clean Code Alliance Meetup

Why SRP?

• A place for everything and everything in its place

16

Page 17: Single Responsibility Principle @ Clean Code Alliance Meetup

Why SRP?

•Less fragile code

•Low coupling

•High cohesion

17

Page 18: Single Responsibility Principle @ Clean Code Alliance Meetup

Why SRP?

•Easier code changes (Refactoring)

18

Page 19: Single Responsibility Principle @ Clean Code Alliance Meetup

Why SRP?

•Easier naming•The smaller and more focused class, it will

be easier to name

19

Page 20: Single Responsibility Principle @ Clean Code Alliance Meetup

Why SRP?

•Maintainability

•Testability and easier debugging

20

Page 21: Single Responsibility Principle @ Clean Code Alliance Meetup

21

RecognizingSRPViolation

Page 22: Single Responsibility Principle @ Clean Code Alliance Meetup

Recognizing By Structure

•Class / method is too long

22

Class:

LOC > 250

Bad

Page 23: Single Responsibility Principle @ Clean Code Alliance Meetup

Recognizing By Structure

•Too many dependencies (fields / parameters)

23

ClassDependency 1

Dependency 2

Dependency 3

Dependency 4

Dependency 5

Dependency 6

Page 24: Single Responsibility Principle @ Clean Code Alliance Meetup

Recognizing By Structure

•Low cohesion

24

Page 25: Single Responsibility Principle @ Clean Code Alliance Meetup

Recognizing By Structure

•Description / name needs: “AND”

•Generic name: “EmployeeManager”

25

void calculateAndSend(…)

Page 26: Single Responsibility Principle @ Clean Code Alliance Meetup

Recognizing By Structure

•A method with many levels

26

if

while

Page 27: Single Responsibility Principle @ Clean Code Alliance Meetup

Recognizing By Behavior

•Class needs to be changed for more than one behavioral change

27

Page 28: Single Responsibility Principle @ Clean Code Alliance Meetup

Recognizing By Behavior

•Complicated test

28

when(…).then(…); when(…).then(…);

when(…).then(…);

when(…).then(…);when(…).then(…);

when(…).then(…);

Page 29: Single Responsibility Principle @ Clean Code Alliance Meetup

Recognizing By Behavior

•Change here, break there

•Test may be broken elsewhere

•The “shotgun effect”

29

Page 30: Single Responsibility Principle @ Clean Code Alliance Meetup

Recognizing By Behavior

•Unable to encapsulate the module

30

Page 31: Single Responsibility Principle @ Clean Code Alliance Meetup

31

Develop ForSRP

Page 32: Single Responsibility Principle @ Clean Code Alliance Meetup

Develop for SRP

•Awareness•The state or ability to perceive, to feel, or to

be conscious of events, objects, or sensory patterns

32

Page 33: Single Responsibility Principle @ Clean Code Alliance Meetup

Develop for SRP

•Testable code

•TDD

33

Test

CodeRefactor

Page 34: Single Responsibility Principle @ Clean Code Alliance Meetup

Develop for SRP

•Code quality metrics•Coverage•SONAR

34

Page 35: Single Responsibility Principle @ Clean Code Alliance Meetup

Develop for SRP

•Use other principles•High cohesion•Decrease coupling• Interfaces•Real encapsulation

•Law of Demeter

35

Page 36: Single Responsibility Principle @ Clean Code Alliance Meetup

Develop for SRP

36

Keep it simple, stupid!

Keep it simple and short!

Keep it simple, short and specific!

Page 37: Single Responsibility Principle @ Clean Code Alliance Meetup

Develop for SRP

•Naming•Think about it•Role play your entities•Longer and more focused name

37

Page 38: Single Responsibility Principle @ Clean Code Alliance Meetup

Develop for SRP

• Extract method

• Extract class

38

Page 39: Single Responsibility Principle @ Clean Code Alliance Meetup

Develop for SRP

•Refactor mercilessly

•Use design patterns

•Keep modularization clear

39

Page 40: Single Responsibility Principle @ Clean Code Alliance Meetup

Example

40

Precise name(method, class)

Short class,35 lines

High cohesion

Page 41: Single Responsibility Principle @ Clean Code Alliance Meetup

Conclusion

•OOD

•Clean code

•Better practice

41

Do 1 thingA class should have one reason to change!

SRP

Page 42: Single Responsibility Principle @ Clean Code Alliance Meetup

Resources• http://butunclebob.com/ArticleS.UncleBob.Principles

OfOod• Uncle Bob about SRP

• http://www.codinghorror.com/blog/2007/03/curlys-law-do-one-thing.html• Coding Horror

• https://docs.google.com/file/d/0ByOwmqah_nuGNHEtcU5OekdDMkk/• PDF about SRP

• http://eyalgo.com/2014/02/01/the-single-responsibility-principle/• My blog post about SRP

42

Page 43: Single Responsibility Principle @ Clean Code Alliance Meetup

Simple, Isn’t It?

43

Page 44: Single Responsibility Principle @ Clean Code Alliance Meetup

Q & A

44

Page 45: Single Responsibility Principle @ Clean Code Alliance Meetup

45

Thank You ! Eyal Golan

[email protected]

@eyalgo_egolan

http://eyalgo.com/