/* * Глава 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; } } /// /// Поведение поиска в хранилищах информации /// public interface IFindStorage { List FindAll(Predicate predicate); } /// /// Шаблон списка пользователей /// public class ListStorage : IFindStorage { private List storage; public ListStorage() { storage = new List(); } public List GetPersons() => storage; public void Add(Person p) => storage.Add(p); public List FindAll(Predicate predicate) { return storage.Where(e => predicate(e)).ToList(); } } /// /// Шаблон словаря пользователей /// public class DictionaryStorage : IFindStorage { private Dictionary storage; public DictionaryStorage() { storage = new Dictionary(); } public Dictionary GetPersons() => storage; public void Add(string key, Person p) => storage.Add(key, p); public List FindAll(Predicate predicate) { return storage.Where(e => predicate(e.Value)).Select(e => e.Value).ToList(); } } /// /// Щаблон поисковика /// 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(); } }