В нашем С# MVC-приложении у нас есть много интерфейсов, которые сопоставляют 1 к 1 с объектами, которые их реализуют. т.е.: в основном для каждого созданного объекта была выполнена операция "интерфейс экстракта".
Интерфейсы используются Moq для генерации макетных объектов для наших модульных тестов. Но это то, что время и время интерфейсов повторно используются.
Никакие конкретные объекты в нашей системе не реализуют несколько интерфейсов.
Может ли кто-нибудь сказать мне, если это вызовет проблемы в будущем? И если да, каковы они будут?
Я думал, что в нашем приложении много дублирования, например, в этих двух интерфейсах (Edit: на нашем уровне сервиса) единственное, что отличается, это имя метода и тип параметра, который они принимают, но семантически они делают то же самое с репозиториями, на которые они отправляют сообщения:
interface ICustomer
{
void AddCustomer(Customer toAdd);
void UpdateCustomer(Customer toUpdate);
Customer GetById(int customerId);
}
interface IEmployee
{
void AddEmployee(Employee toBeAdded);
void UpdateEmployee(Employee toUpdate);
Employee GetById(int employeeId);
}
и что, когда я думаю, что вошел бы принцип повторной абстракции, т.е. преобразовать код в нечто вроде:
public interface IEmployee: IAdd<Employee>, IUpdate<Employee>, IFinder<Employee>
Речь идет не о шаблоне репозитория - это о интерфейсах на любом уровне, которые выглядят так, как будто они имеют семантически идентичное поведение. Стоит ли вызывать общие интерфейсы для этих операций и наследовать от них "под-интерфейсы"?
По крайней мере, это обеспечило бы согласованность сигнатур методов. Но какие другие преимущества мне это дадут? (Принцип замещения Лискова в сторону)
В настоящее время имена методов и возвращаемых типов повсюду.
Я прочитал блог Марка Сееманна о повторных абстракциях Принципа, но я не понимал этого, чтобы быть откровенным. Может быть, я просто глуп:) Я также прочитал определение Fowler интерфейсов заголовков.