PatternsCSharpProgramming/Patterns/5_Принцип инверсии зависимостей/Program.cs
Dvurechensky 3a28caed27 1.0
Main
2024-10-05 09:15:54 +03:00

107 lines
3.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Глава 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();
}
}