Solid Principles
(Seminar)
1
Reference
o [Link]
OLID-Architecture-Principles-Using-Simple-Csharp
o [Link]
[Link]/UploadFile/damubetha/solid-
principles-in-C-Sharp/
What is SOLID?
SOLID are five basic principles which help to create good
software architecture. SOLID is an acronym where:-
S stands for SRP (Single responsibility principle
O stands for OCP (Open closed principle)
L stands for LSP (Liskov substitution principle)
I stands for ISP ( Interface segregation principle)
D stands for DIP ( Dependency inversion principle)
3
“S”- SRP (Single responsibility principle)
class Customer
{
public void Add()
{
try
{
// Database code goes here
}
catch (Exception ex)
{
[Link](@"c:\[Link]", [Link]());
}
}
}
4
“S”- SRP (Single responsibility principle)
5
“S”- SRP (Single responsibility principle)
6
“S”- SRP (Single responsibility principle)
class FileLogger
{
public void Handle(string error)
{
[Link](@"c:\[Link]", error);
}
}
7
“S”- SRP (Single responsibility principle)
class Customer
{
private FileLogger obj = new FileLogger();
publicvirtual void Add()
{
try
{
// Database code goes here
}
catch (Exception ex)
{
[Link]([Link]());
}
}
}
8
“O” - Open closed principle
9
“O” - Open closed principle
class Customer
{
private int _CustType;
public int CustType
{
get { return _CustType; }
set { _CustType = value; }
}
public double getDiscount(double TotalSales)
{
if (_CustType == 1)
{
return TotalSales - 100;
}
else
{
return TotalSales - 50;
}
}
}
10
“O” - Open closed principle
class Customer
{
public virtual double getDiscount(double
TotalSales)
{
return TotalSales;
}
}
11
“O” - Open closed principle
class SilverCustomer : Customer
{
public override double getDiscount(double TotalSales)
{
return [Link](TotalSales) - 50;
}
}
class goldCustomer : SilverCustomer
{
public override double getDiscount(double TotalSales)
{
return [Link](TotalSales) - 100;
}
}
12
“L”- LSP (Liskov substitution principle)
13
“L”- LSP (Liskov substitution principle)
class Enquiry : Customer
{
public override double getDiscount(double TotalSales)
{
return [Link](TotalSales) - 5;
}
public override void Add()
{
throw new Exception("Not allowed");
}
}
14
“L”- LSP (Liskov substitution principle)
interface IDiscount
{
double getDiscount(double TotalSales);
}
interface IDatabase
{
void Add();
}
15
“L”- LSP (Liskov substitution principle)
class Enquiry : IDiscount
{
public double getDiscount(double TotalSales)
{
return TotalSales - 5;
}
}
16
“L”- LSP (Liskov substitution principle)
class Customer : IDiscount, IDatabase
{
private MyException obj = new MyException();
public virtual void Add()
{
try
{
// Database code goes here
}
catch (Exception ex)
{
[Link]([Link]());
}
}
public virtual double getDiscount(double TotalSales)
{
return TotalSales;
}
}
17
“I” - ISP (Interface Segregation principle)
18
“I” - ISP (Interface Segregation principle)
interface IDatabase
{
void Add(); // old client are happy with these.
void Read(); // Added for new clients.
}
19
“I” - ISP (Interface Segregation principle)
interface IDatabaseV1 : IDatabase // Gets the Add method
{
void Read();
}
class CustomerwithRead : IDatabase, IDatabaseV1
{
public void Add()
{
Customer obj = new Customer();
[Link]();
}
public void Read()
{
// Implements logic for read
}
}
20
“I” - ISP (Interface Segregation principle)
IDatabase i = new Customer(); // 1000 happy old
clients not touched
[Link]();
IDatabaseV1 iv1 = new CustomerWithread(); // new
clients
[Link]();
21
“D”- Dependency inversion principle
class Customer
{
private FileLogger obj = new FileLogger();
public virtual void Add()
{
try
{
// Database code goes here
}
catch (Exception ex)
{
[Link]([Link]());
}
}
}
22
“D”- Dependency inversion principle
interface ILogger
{
void Handle(string error);
}
class FileLogger : ILogger
{
public void Handle(string error)
{
[Link](@"c:\[Link]", error);
}
}
23
“D”- Dependency inversion principle
class EverViewerLogger : ILogger
{
public void Handle(string error)
{
// log errors to event viewer
}
}
class EmailLogger : ILogger
{
public void Handle(string error)
{
// send errors in email
}
}
24
“D”- Dependency inversion principle
class Customer : IDiscount, IDatabase
{
private Ilogger obj;
public Customer(ILogger i)
{
obj = i;
}
}
IDatabase i = new Customer(new EmailLogger());
25