Design patterns
SOLID
Поиск…
Вступление
Что такое SOLID?
SOLID - это мнемоническая (память) акроним. Принципы Solid должны помочь разработчикам программного обеспечения избегать «запахов кода» и привести к хорошему исходному коду. Хороший исходный код означает в этом контексте, что исходный код легко расширяется и поддерживается. Основным направлением принципов Solid являются классы
Что ожидать:
Почему вы должны применять SOLID
Как применять пять принципов SOLID (примеры)
SRP - принцип единой ответственности
S в SOLID означает принцип единой ответственности (SRP).
Ответственность означает в этом контексте поводы для изменения, поэтому в принципе говорится, что у класса должна быть только одна причина для изменения.
Роберт К. Мартин заявил об этом (во время своей лекции в Yale shool of management в 10 Sep 2014) следующим образом
Вы также можете сказать, не ставьте функции, которые меняются по разным причинам в одном классе.
или же
Не смешивайте проблемы в своих классах
Причина применения СРП:
Когда вы меняете класс, вы можете повлиять на функциональность, связанную с другими обязанностями класса. Сохранение ответственности на низком уровне сводит к минимуму риск возникновения побочных эффектов.
Плохой пример
У нас есть интерфейс IWallet и класс кошелька, который реализует IWallet. Кошелек держит наши деньги и бренд, кроме того, он должен печатать наши деньги как строковое представление. Класс используется
- веб-сервис
- текстовый редактор, который печатает деньги в евро в текстовый файл.
СРП здесь нарушена, потому что у нас есть две проблемы:
- Сохранение денег и брендов
- Представление денег.
Пример кода 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();
}
}
Хороший пример
Чтобы избежать нарушения SRP, мы удалили метод printMoney
из класса «Кошелек» и поместили его в класс «Принтер». Класс принтера теперь отвечает за печать, и теперь Кошелек отвечает за сохранение значений.
Пример кода 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;
}
}