2014-09-22 3 views
13

В чем разница на практике? Почему вы используете один над другим? Кажется, что оба типа будут использоваться для решения тех же проблем.Интерфейс против записи функций

Мой вопрос если относительно только функциональный F # код. Для компонентов F #, которые подвергаются внешним сторонам, я обнаружил, что Component Design Guidelines предлагает предпочесть интерфейсный подход к записи функций.

ответ

17

Понятно, что записи функций очень похожи на интерфейсы и большую часть времени, вы можете использовать их оба для решения данной проблемы (так что это отличный вопрос &).

Если вы посмотрите только на технические аспекты, то самая большая разница в том, что интерфейсы могут иметь общие методы. Это то, что не может быть сделано с помощью записи - например, нет никакого способа определить простую запись функций, которые соответствовали бы следующее:

type IFoo<'T> = 
    abstract Bar<'R> : 'R -> 'T 

Однако, на практике, я думаю, что более важные различия связанные с совместимостью и дизайн:

  • Интерфейсы взаимодействуют хорошо с C# и других .NET компонентов
    (Построение F # запись функций из C# будет очень трудно и некрасиво)
  • Интерфейсы выражают различные намерения - это интерфейс, который может быть удовлетворен и реализован.
    С другой стороны, записи являются наборами функций, которые являются создана.
  • Записи хороши, если вам нужно использовать конструкцию { oldValue with NewFunction = newFunction } для замены одной функции.

В целом, я в основном использую записи, когда мне нужно сохранить какое-либо состояние во время, например. рекурсивная обработка некоторой структуры данных, и мне нужна конструкция with. Для публичного API я считаю, что использование интерфейсов и простых классов лучше абстракции, чем использование записей.

Смежные вопросы