Design patterns
SOLIDNY
Szukaj…
Wprowadzenie
Co to jest SOLID?
SOLID jest akronimem mnemonicznym (pomoc pamięci). Solidne zasady powinny pomóc twórcom oprogramowania unikać „zapachów kodu” i powinny prowadzić do dobrego kodu źródłowego. Dobry kod źródłowy oznacza w tym kontekście, że kod źródłowy jest łatwy do rozszerzenia i utrzymania. Podstawowym celem zasad Solid są klasy
Czego oczekiwać:
Dlaczego powinieneś zastosować SOLID
Jak zastosować pięć zasad SOLID (przykłady)
SRP - Zasada pojedynczej odpowiedzialności
S in SOLID oznacza zasadę pojedynczej odpowiedzialności (SRP).
Odpowiedzialność oznacza w tym kontekście powody do zmiany, więc zasada mówi, że klasa powinna mieć tylko jeden powód do zmiany.
Robert C. Martin stwierdził (podczas swojego wykładu w Yale shool of management 10 września 2014) w następujący sposób
Można również powiedzieć, nie umieszczaj funkcji zmieniających się z różnych powodów w tej samej klasie.
lub
Nie mieszaj obaw w swoich klasach
Powód zastosowania SRP:
Zmiana klasy może wpłynąć na funkcjonalność związaną z innymi obowiązkami klasy. Utrzymywanie obowiązków na niskim poziomie minimalizuje ryzyko wystąpienia działań niepożądanych.
Zły przykład
Mamy interfejs IWallet i klasę Wallet, która implementuje IWallet. Portfel przechowuje nasze pieniądze i markę, a ponadto powinien wydrukować nasze pieniądze jako ciąg znaków. Z tej klasy korzysta
- usługa internetowa
- autor tekstów, który drukuje pieniądze w euro na plik tekstowy.
Naruszono tutaj SRP, ponieważ mamy dwie obawy:
- Przechowywanie pieniędzy i marki
- Reprezentacja pieniędzy.
Przykładowy kod w C #
public interface IWallet
{
void setBrand(string brand);
string getBrand();
void setMoney(decimal money);
decimal getMoney();
string printMoney();
}
public class Wallet : IWallet
{
private decimal m_Money;
private string m_Brand;
public string getBrand()
{
return m_Brand;
}
public decimal getMoney()
{
return m_Money;
}
public void setBrand(string brand)
{
m_Brand = brand;
}
public void setMoney(decimal money)
{
m_Money = money;
}
public string printMoney()
{
return m_Money.ToString();
}
}
Dobry przykład
Aby uniknąć naruszenia SRP, usunęliśmy metodę printMoney
z klasy Wallet i umieściliśmy ją w klasie Printer. Klasa Printer jest teraz odpowiedzialna za drukowanie, a Portfel jest teraz odpowiedzialny za przechowywanie wartości.
Przykładowy kod w C #
public interface IPrinter
{
void printMoney(decimal money);
}
public class EuroPrinter : IPrinter
{
public void printMoney(decimal money)
{
//print euro
}
}
public class DollarPrinter : IPrinter
{
public void printMoney(decimal money)
{
//print Dollar
}
}
public interface IWallet
{
void setBrand(string brand);
string getBrand();
void setMoney(decimal money);
decimal getMoney();
}
public class Wallet : IWallet
{
private decimal m_Money;
private string m_Brand;
public string getBrand()
{
return m_Brand;
}
public decimal getMoney()
{
return m_Money;
}
public void setBrand(string brand)
{
m_Brand = brand;
}
public void setMoney(decimal money)
{
m_Money = money;
}
}