Я бы согласился с другими ответами до сих пор, что это, безусловно, имеет смысл большую часть времени.
Иногда вы, возможно, захотите на самом деле немного больше гибкости, определяя интерфейс и реализуя его с помощью методов экземпляра. Это дает вам возможность использовать различные методы в вашем коде в будущем.
Вот пример того, что я имею в виду. Скажем, вы используете этот formatString
ваш метод в каком-то коде, который выглядит примерно так:
public void DumpToConsole()
{
foreach (DataField field in m_fields)
{
Console.WriteLine(StringUtils.formatString(field.ToString()));
}
}
ОК, это здорово. (На самом деле, это глупо, но что угодно - только для иллюстрации!) Но вы могли бы сделать такой метод более гибким, если бы он принимал интерфейс , в котором у вас могут быть различные реализации, которые обеспечивают совершенно разные виды форматирования :
public void DumpToConsole(IFormatter<DataField> formatter = null)
{
// Perhaps you could specify a default. Up to you.
formatter = formatter ?? Formatter<DataField>.Default;
foreach (DataField field in m_fields)
{
Console.WriteLine(formatter.Format(field));
}
}
Тогда вместо StringUtils
, являющегося статическим служебным классом, это будет просто одна реализация класса, которая предлагает способ форматирования объекта определенного типа (в вашем случае, string
объектов ; в моем примере это воображаемые DataField
объекты).
Так что это очень многословный способ сказать, это зависит. Если вы стремитесь к сверхгибкости в будущем, , возможно, , вам следует рассмотреть возможность реализации интерфейса вместо использования статического вспомогательного класса.
Обратите внимание, что в моем примере выше, другим вполне приемлемым способом решения проблемы могло быть принятие делегата Func<T, string>
вместо этого гипотетического интерфейса IFormatter<T>
. На мой взгляд, это в основном стилистический выбор. Но часто интерфейсы становятся более реалистичными, когда вы хотите настроить несколько вариантов поведения; то есть определение методов, которые принимают 3, 4 или более делегатов, может быстро стать громоздким по сравнению с принятием одного интерфейса.