Это первая мысль, которую я получил во время чтения Interface Implementation (Interface Segregation Principle)Интерфейс реализация - Создание интерфейса для параметров
Мысль
Чтобы ввести новый интерфейс, представляющий бы параметры метода вместо передачи отдельных значений параметров. Как показано ниже:
interface IServiceProviderInput
{
string Username { get; }
string Password { get; }
string AgentId { get; } // XYZServiceProvider needs this.
// Similarly add props here to represent new parameters
// required by future service provider implementations.
}
interface IServiceProvider
{
bool Authenticate(IServiceProviderInput parameters);
}
class ABCServiceProvider : IServiceProvider
{
public bool Authenticate(IServiceProviderInput parameters)
{
return true;
}
}
class EFGServiceProvider : IServiceProvider
{
public bool Authenticate(IServiceProviderInput parameters)
{
return true;
}
}
class XYZServiceProvider : IServiceProvider
{
public bool Authenticate(IServiceProviderInput parameters)
{
return true;
}
}
Вопрос
бы это имеет смысл или каковы недостатки в этом? Есть предположения?
Редактировать
Еще одна мысль, чтобы добавить более конкретный интерфейс для поставщика XYZ:
interface IServiceProviderInput
{
string Username { get; }
string Password { get; }
}
interface IXYZServiceProviderInput : IServiceProviderInput
{
string AgentId { get; }
}
class XYZServiceProvider : IServiceProvider
{
public bool Authenticate(IXYZServiceProviderInput parameters)
{
return true;
}
}
Вполне возможно, что и мысли неправильны или есть недостатки, я не уверен, поэтому вопрос ,
Почему у входных свойств есть сеттеры? Это странно для меня. Ожидаете ли вы, что поставщик услуг сможет изменить значения свойств входа? – recursive
@recursive Services не будут устанавливать их. Как бы код вызова устанавливал значения параметра в противном случае? – niksofteng
Код вызова не требует доступа к ним исключительно через этот интерфейс. Целью интерфейса является группировка связанных операций с ответственностью. Если эта ответственность должна действовать как входной сигнал, то сеттер не нужен на интерфейсе. Но это не означает, что сеттер не может существовать в реализации или более производном интерфейсе. Чтобы использовать другой пример, вы не можете '.Add()' элемент в 'IEnumerable', даже если вы можете на 'List '. –
recursive