107 lines
3.3 KiB
C#
107 lines
3.3 KiB
C#
/*
|
||
* Глава 21: Принцип инверсии зависимостей (SOLID SRP)
|
||
*
|
||
* Автор: Роберт Мартин (Дядя Боб)
|
||
*
|
||
* Сам принцип:
|
||
*
|
||
* - Модули верхних уровней не должны зависеть от модулей нижних уровней
|
||
* (Оба типа должны зависеть от абстракций)
|
||
*
|
||
* - Абстракции не должны зависеть от деталей
|
||
* (Детали должны зависеть от абстракций)
|
||
*
|
||
* Принципы:
|
||
* 1. Single responsibility - принцип единственной ответственности
|
||
* 2. Open-closed - принцип открытости/закрытости
|
||
* 3. Liskov substitution - принцип подстановки Барбары Лисков (самый сложный)
|
||
* 4. Interface Segregation - принцип разделения интерфейса
|
||
* 5. Dependency inversion - принцип инверсии зависисмостей
|
||
*/
|
||
public class Person
|
||
{
|
||
public string FirstName { get; set; }
|
||
public string LastName { get; set; }
|
||
public int Age { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// Поведение поиска в хранилищах информации
|
||
/// </summary>
|
||
public interface IFindStorage
|
||
{
|
||
List<Person> FindAll(Predicate<Person> predicate);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Шаблон списка пользователей
|
||
/// </summary>
|
||
public class ListStorage : IFindStorage
|
||
{
|
||
private List<Person> storage;
|
||
public ListStorage()
|
||
{
|
||
storage = new List<Person>();
|
||
}
|
||
|
||
public List<Person> GetPersons() => storage;
|
||
|
||
public void Add(Person p) => storage.Add(p);
|
||
|
||
public List<Person> FindAll(Predicate<Person> predicate)
|
||
{
|
||
return storage.Where(e => predicate(e)).ToList();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Шаблон словаря пользователей
|
||
/// </summary>
|
||
public class DictionaryStorage : IFindStorage
|
||
{
|
||
private Dictionary<string, Person> storage;
|
||
public DictionaryStorage()
|
||
{
|
||
storage = new Dictionary<string, Person>();
|
||
}
|
||
|
||
public Dictionary<string, Person> GetPersons() => storage;
|
||
|
||
public void Add(string key, Person p) => storage.Add(key, p);
|
||
|
||
public List<Person> FindAll(Predicate<Person> predicate)
|
||
{
|
||
return storage.Where(e => predicate(e.Value)).Select(e => e.Value).ToList();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Щаблон поисковика
|
||
/// </summary>
|
||
public class SearchByAge
|
||
{
|
||
IFindStorage storage;
|
||
public SearchByAge(IFindStorage storage) => this.storage = storage;
|
||
public void Search()
|
||
{
|
||
foreach (var p in storage.FindAll(e => e.Age > 45))
|
||
{
|
||
Console.WriteLine($"{p.FirstName} {p.Age}");
|
||
}
|
||
}
|
||
}
|
||
|
||
public class Program
|
||
{
|
||
public static void Main(string[] argv)
|
||
{
|
||
Console.WriteLine("DictionaryStorage: ");
|
||
var storageDict = new DictionaryStorage();
|
||
storageDict.Add("1", new Person() { Age = 90 });
|
||
new SearchByAge(storageDict).Search();
|
||
Console.WriteLine("ListStorage: ");
|
||
var storageList = new ListStorage();
|
||
storageList.Add(new Person() { Age = 43 });
|
||
new SearchByAge(storageList).Search();
|
||
}
|
||
} |