Предположим имеется следующий класс:
public class User
{
public string FirstName {get;set;}
public string LastName {get;set;}
public bool Gender {get;set;}
public int Age {get;set;}
}
public UserService
{
readonly IRepository
public UserService(IRepository
//Функция возвращающая всех пользователей
public IEnumerable
Предположим мне необходимо наложить некие ограничения на возвращаемых пользователей, пусть будет возраст и пол, тогда я создам такую функцию:
public IEnumerable
А если понадобится фильтровать по какому либо другому набору полей, не создавать же 100500 таких методов/функций, ведь они могут с собой и пересекаться и тогда явно будет дублирование кода.
Данные User, UserService приведены для примера, все совпадения с действительностью не специальны.
Хочется узнать как необходимо создавать перегруженные методы/функции.
Ответ
Это тот момент, когда стоит задуматься, какие у вас абстракции и почему. Как у вас хранятся данные на самом деле?
Положим, на самом деле вы работаете с голым списком прямо в памяти. В этом случае достаточно принимать Func
Если требуются более сложные условия, чем проверка на равенство, нужно смотреть, фильтры какой сложности требуется поддерживать, и искать компромиссы.
Возможно, сейчас я услышу возражения: "Но мне же нужно супер-универсальное сверх-модульное архи-заменяемое решение!" Нет, оно вам не нужно. YAGNI!
Вы никогда не скроете факта, что все три варианта работают с совершенно разной скоростью, имеют разные ограничения и так далее. Нет никакого "общего случая", это миф. Поэтому не изобретайте сложности там, где они вам не нужны. А они вам не нужны практически никогда.
Скажите, зачем вам понадобился "сервис", если уже есть "репозиторий"? Вам действительно нужен лишний слой абстракций?
Комментариев нет:
Отправить комментарий