SRP-Single Responsibility Principle

C# Design Patterns and SOLID Principles SOLID Principles With Code Sample
11 minutes
Share the link to this page
Copied
  Completed
You need to have access to the item to view this lesson.
One-time Fee
$69.99
List Price:  $99.99
You save:  $30
€66.45
List Price:  €94.93
You save:  €28.48
£55.32
List Price:  £79.03
You save:  £23.71
CA$98.04
List Price:  CA$140.06
You save:  CA$42.02
A$107.72
List Price:  A$153.89
You save:  A$46.17
S$94.09
List Price:  S$134.42
You save:  S$40.33
HK$544.68
List Price:  HK$778.15
You save:  HK$233.46
CHF 61.92
List Price:  CHF 88.46
You save:  CHF 26.54
NOK kr774.79
List Price:  NOK kr1,106.89
You save:  NOK kr332.10
DKK kr495.67
List Price:  DKK kr708.13
You save:  DKK kr212.46
NZ$118.82
List Price:  NZ$169.76
You save:  NZ$50.93
د.إ257.07
List Price:  د.إ367.26
You save:  د.إ110.19
৳8,339.40
List Price:  ৳11,913.94
You save:  ৳3,574.54
₹5,914.23
List Price:  ₹8,449.26
You save:  ₹2,535.03
RM311.24
List Price:  RM444.65
You save:  RM133.41
₦118,083.62
List Price:  ₦168,698.12
You save:  ₦50,614.50
₨19,391.36
List Price:  ₨27,703.14
You save:  ₨8,311.77
฿2,410.17
List Price:  ฿3,443.25
You save:  ฿1,033.08
₺2,423.71
List Price:  ₺3,462.60
You save:  ₺1,038.88
B$418.75
List Price:  B$598.25
You save:  B$179.49
R1,273.04
List Price:  R1,818.71
You save:  R545.66
Лв129.87
List Price:  Лв185.54
You save:  Лв55.66
₩97,732.12
List Price:  ₩139,623.30
You save:  ₩41,891.18
₪255.55
List Price:  ₪365.09
You save:  ₪109.53
₱4,110.61
List Price:  ₱5,872.56
You save:  ₱1,761.94
¥10,630.43
List Price:  ¥15,186.98
You save:  ¥4,556.55
MX$1,418.07
List Price:  MX$2,025.91
You save:  MX$607.83
QR254.36
List Price:  QR363.39
You save:  QR109.02
P953.37
List Price:  P1,362.02
You save:  P408.64
KSh9,063.70
List Price:  KSh12,948.70
You save:  KSh3,885
E£3,478.89
List Price:  E£4,970.06
You save:  E£1,491.16
ብር8,820.94
List Price:  ብር12,601.88
You save:  ብር3,780.94
Kz63,759.63
List Price:  Kz91,089.09
You save:  Kz27,329.46
CLP$68,404.72
List Price:  CLP$97,725.22
You save:  CLP$29,320.50
CN¥507.53
List Price:  CN¥725.08
You save:  CN¥217.54
RD$4,206.74
List Price:  RD$6,009.89
You save:  RD$1,803.14
DA9,351.13
List Price:  DA13,359.34
You save:  DA4,008.20
FJ$158.85
List Price:  FJ$226.94
You save:  FJ$68.09
Q538.41
List Price:  Q769.20
You save:  Q230.78
GY$14,600.65
List Price:  GY$20,858.96
You save:  GY$6,258.31
ISK kr9,615.92
List Price:  ISK kr13,737.62
You save:  ISK kr4,121.70
DH699.24
List Price:  DH998.96
You save:  DH299.72
L1,281.52
List Price:  L1,830.82
You save:  L549.30
ден4,084.06
List Price:  ден5,834.63
You save:  ден1,750.56
MOP$559.24
List Price:  MOP$798.95
You save:  MOP$239.71
N$1,266.15
List Price:  N$1,808.86
You save:  N$542.71
C$2,568.06
List Price:  C$3,668.81
You save:  C$1,100.75
रु9,427.87
List Price:  रु13,468.97
You save:  रु4,041.09
S/262.66
List Price:  S/375.25
You save:  S/112.58
K281.39
List Price:  K402.01
You save:  K120.61
SAR262.91
List Price:  SAR375.60
You save:  SAR112.69
ZK1,903.42
List Price:  ZK2,719.29
You save:  ZK815.86
L330.70
List Price:  L472.45
You save:  L141.75
Kč1,679.39
List Price:  Kč2,399.23
You save:  Kč719.84
Ft27,552.80
List Price:  Ft39,362.83
You save:  Ft11,810.03
SEK kr765.72
List Price:  SEK kr1,093.94
You save:  SEK kr328.21
ARS$70,549.59
List Price:  ARS$100,789.45
You save:  ARS$30,239.85
Bs482.26
List Price:  Bs688.98
You save:  Bs206.71
COP$307,907.55
List Price:  COP$439,886.78
You save:  COP$131,979.23
₡35,643.95
List Price:  ₡50,922.11
You save:  ₡15,278.16
L1,765.02
List Price:  L2,521.57
You save:  L756.54
₲545,488.80
List Price:  ₲779,303.12
You save:  ₲233,814.31
$U2,997.83
List Price:  $U4,282.79
You save:  $U1,284.96
zł286.31
List Price:  zł409.03
You save:  zł122.72
Already have an account? Log In

Transcript

Okay, so now I guess you're ready to learn solid principles. And for that, without wasting time in theory at all, I would like to cover theory with code samples. So I'm just opening up with this video. And inside that we are going to create a new application. So for certifying that, I'm going to create a console app in dotnet framework. And let's say that we are going to give a meaningful name like the name of this application will be solid underscore P. Now this P stands for solid principles.

And the moment I click on OK, I hope you guys know that console application is the simplest application of dotnet framework. And ultimately, this is nothing but one simple EFC with only one class inside that with the name program.cs or something like that. So this is going to be a very simple console application right now. But step by step in this video series, I'm going to show you How we can write a code inside this by following all the principles available in this. So now we have a solid p which is having a program.cs inside that, which makes sense. Okay, it's just an empty class with a main method inside that for me, the first thing which I'm going to do is I'm going to right click on my solid p which is a console application, and I'm going to add a new C sharp class.

Now the name of the C sharp class I'm giving right now is invoice.cs. I'm just taking a scenario that assume that we are developing a software for an organization and this software is going to take care of invoice generation invoice printing, and all the calculations which are required for the invoice and all the declarations which are required for the invoice. Now inside this class invoice, the first thing which I'm going to do is I'm going to make sure that my graphics is whatever is going to be public, so that I can access this invoice class, anywhere. In this project and then inside this class we just have a simple logic like this. So you can check that I have an invoice class, which is having first two things like subtotal and tax rate. And if you know basics of object oriented programming concepts, I hope you know that these things are known as properties or even the better bodies automatic properties, because if you check subtotal and tax rate both are having a getter and setter inside this without any values.

So this is something which is known as automatic properties. And both the properties in my case are of type decimal. After these two properties, I have total three methods. So you can check the first method is calculate tax, which is returning decimal. And in that I'm just simply having a logic to do the calculation like subtotal multiply by tax rate divided by hundred. So that's what is going to give me a tax calculations.

And then we have another method which is calculate total, which is doing subtotal whatever Getting from that plus the method which is calculate tax we are calling here. So it's something like this that calculate tax is on the top. And we are calling it inside this calculate total. Finally, we have a third method, which is sprint, and the sprint is taking one parameter, which is of type invoice. So this is my class itself. And the sprint is not returning anything, it's just returning void.

And we do not have any logic right now inside the sprint, but I'm assuming that I'm going to have some logic of printing inside that which is right now not there in this code. Now, the question is, this is a very simple class and I hope you are able to understand the logic and the code which I have written inside that. So in this simple console application, I have a very simple class. And as we know, the first rule of solid principle is single responsibility principle. And to understand this principle, first of all you need to understand or you need to be smart to understand how many responses Release are there in a particular class. Like, for example, if I ask you that this class, which I have created right now is having a name invoice.

And this invoice class is having two properties and three methods inside that. If I asked you this question, how many responsibilities I have in this class? Or how many responsibilities this class is going to follow? What will be your answer? This class is having one single responsibility, two or three. This is something which I want an answer from your side.

Because this is that one of the thing where most people make mistake sometimes, if I ask people how many sponsors out there in this class, they answer that we have three responsibilities. They answer three because most of the time they focus on three different methods, and they count the number of public methods in the class. Each public method is going to count like a one responsibility and that's why we have three responsibilities. Sometime even a few guys who are not clear with this concept, they count the properties also as a responsibility, which is not exactly true. And that's why the right answer of this particular class is we have total two responsibilities. So the answer is, it's this invoice class is having two responsibilities.

One is this class is responsible for printing an invoice. And another one is this class responsible for calculate total. Now, I'm sure you want to ask me one question that why calculate tax is not a part of the responsibility. The reason is calculate tax is the method which is actually used inside calculate total. So this is not a separate responsibility. This is something which is a part of this.

And that's why we created that method. And we can call that thing here. Now, same way, right now, as I'm saying that this class is having two responsibilities. This is also possible that somewhere calculate total I'm going to call inside my print method. At that time, you The invoice class is only responsible for printing and all the other things are used inside that. So I just want to clarify one thing that when you try to understand this kind of class and the responsibilities do not focus only on number of public methods, please focus on the functionalities which are there in that particular class.

Or I can say the purpose which that class is solving. And that's where our single responsibility principle is going to come into the picture. Now, I asked you one question that how many responses are there in that particular class? But actually more than that question, there is one more question which is very, very, very important. The question which I want to ask you now is, what do you think, which is a better option? First, a class with only one responsibility, or a class with many responsibilities.

Now, before you answer this question, I just want to compare the scenario with one of the real life scenario like if you see online My screen, I have two different nights available. On the screen, the left side one is a Swiss knife, I'm sure you have seen a Swiss knife which has many functionalities inside that I can use the Swiss nine for different different purpose. And the right side we have a normal life which we use in our kitchen every day. And then based on that, we are going to use that knife only for one purpose which is cutting, cutting, cutting something. Now, if I ask you out of this two things, you just visualize that the right side one is a class with only one functionality, only one responsibility, which is a normal life. And the left side one is a class with many responsibilities and many functionalities inside that.

If I ask you, which is going to be more useful. I know there are a few guys who choose. So it's nice because it's having many purposes, but in real life as well as in the application also. The right answer is a thing which is only solving one focus Purpose is the one which is more useful. And if you don't agree with me just check one thing. If I asked you how many times in a month you're going to use a Swiss knife.

And if I asked you this question, I'm sure the answer is not so many times, most of us, we do not have a Swiss knife with us. And even if we have, we do not use it regularly, it's very rare to use a Swiss knife regularly. Even though it has many purposes, we never use that thing every day. While on the other hand, we have a normal life, which we use mostly everyday in our kitchen. Even though this is solving only one purpose, that is the one which is most useful. And very often we use that thing.

The same case is there in the application, also a class which is only solving one purpose, maybe going to be much more flexible and reusable inside the application in spite of the one class which is having many functionalities inside that. So the answer of this question is which is a better option. Obviously one class with only one responsibility inside that. And this is where I want to change my code a little bit now, to solve a purpose of a principle number one, let me go back to my Visual Studio. And inside this within studio as I know that I have an invoice class with FME two responsibilities. One responsibility is calculate total in which we are using this property and method.

And another responsibility is printing in which we do not have any logic right now. But now if I want to follow rule number one, which is single responsibility principle, I'm going to right click on my project, and I'm going to add a new C sharp class once again. And then maybe I'm giving a name of this class, invoice printer. The moment I given the name of this class invoice printer, this is a new class which is invoice printer, and I'm making sure that this class is also going to be public so that I can use it Anywhere. And then from this invoice class, I'm just going to do Ctrl x. For the sprint logic, I don't want that this logic is going to go inside that.

And inside of that, I'm going to put this sprint logic inside this. Now if you focus, I have two different C sharp classes in my project invoice.cs and invoice printer.cs invoice.cs is the class which is only dealing with the invoice calculation and the total, while the invoice printer is only focusing on the printer. And this is where we are satisfying rule number one, which is single responsibility principle. So now we have two different classes which only concerned about their own area of expertise, or I can say a domain logic. This one is also going to help us in the test driven development. I hope you know that nowadays most of the applications write unit test cases for the logic.

And if you have classes with the single responsibility that's also going to help you in TDD approach. And that's what the single responsivity principle is trying to tell you that you should be concerned about a single focus purpose for each class. And your class is going to only focus on one particular purpose. And that's why we are going to have only one responsibility. I hope you're able to understand Principle number one, and the do's and don'ts associated with this. It's time to move on to Principle number two now.

Thank you

Sign Up

Share

Share with friends, get 20% off
Invite your friends to LearnDesk learning marketplace. For each purchase they make, you get 20% off (upto $10) on your next purchase.