У меня есть простой интерфейс
public interface SomethingProvider
{
public Something GetSomething();
}
Чтобы "сделать" его асинхронным, я бы сделал это
public interface SomethingProvider
{
public Task<Something> GetSomethingAsync();
}
Хотя интерфейс теперь намекает, что GetSomething
является асинхронным, он позволяет синхронное выполнение, что прекрасно, если синхронный результат достаточно быстр. Если он блокируется, тогда я могу назначить вину плохой реализации интерфейса программистом-программистом.
Итак, если последний интерфейс реализуется с помощью достаточно быстрой блокирующей реализации, то последний интерфейс более гибкий, чем первый, и, следовательно, предпочтительнее.
В этом случае следует ли переписать все мои интерфейсы для возврата задач, если есть хоть малейшая вероятность, что вызов метода займет больше времени?
EDIT:
Я хотел бы подчеркнуть, что это не вопрос о том, какие задачи и как они работают, а вместо этого вопрос проектирования, связанный с присущей неизвестной реализации интерфейсов при их определении. При написании интерфейса полезно использовать синхронную и асинхронную реализацию.
Третьим "решением" может быть некоторое слияние двух предыдущих:
public interface SomethingProvider
{
public Something GetSomething();
public Task<Something> GetSomethingAsync();
}
но это нарушает принцип замещения Лискова и не добавляет ничего, кроме путаницы с разработчиком.