Интерфейсы с одним методом обычно можно избежать, когда вы работаете на языках, которые позволяют передавать функции в качестве значений первого порядка. Чтобы назвать несколько примеров:
Интерфейсы с одним методом для передачи фрагментов логики реализации:
public interface IComparable<T>
{
int CompareTo(T first, T second);
}
public static class Array<T>
{
public void Sort(T[] input)
{
if (T is IComparable) { /* sorting implementation */ }
else { Throw new Exception("Doesn't implement IComparable"); }
}
}
Может быть заменено на:
public static class Array<T>
{
public void Sort(T[] input, Func<T, T, int> compare)
{
/* sorting implementation */
}
}
Я считаю функциональный стиль выше более читабельным и многократно используемым.
Интерфейсы с одним методом для ввода-вывода зависимостей:
public interface IFailureNotifier
{
void HandleFailure(Exception ex);
}
public class TransactionProcessor
{
public IFailureNotifier FailureNotifier { get; set; }
public TransactionProcessor(IFailureNotifier failureNotifier)
{
this.FailureNotifier = failureNotifier;
}
public void ProcessItems(object[] items)
{
try
{
for(object item in items) { /* do stuff */ }
}
catch(Exception ex)
{
FailureNotifier.HandleFailure(ex);
}
}
}
Может быть переписано как:
public class TransactionProcessor
{
public Action<Exception> FailureNotifier { get; set; }
public TransactionProcessor(Action<Exception> failureNotifier)
{
this.FailureNotifier = failureNotifier;
}
public void ProcessItems(object[] items)
{
try
{
for(object item in items) { /* do stuff */ }
}
catch(Exception ex)
{
FailureNotifier(ex);
}
}
}
Преимущество этого подхода заключается в более простой библиотеке классов: мне не нужен набор мелких объектов для реализации одиночного метода IFailureNotifier, я просто вместо этого передаю реализацию напрямую.
Это не означает, что интерфейсы с одним методом плохие , вы все еще хотите заключить функцию в интерфейс, если функция зависит от основного изменяемого состояния. Однако я лично нахожу, что большинство преимуществ интерфейсов с одним методом уже обеспечены первоклассными функциями.