2014-09-22 16 views
13

Uygulamadaki fark nedir? Neden birini diğeriyle kullanırsın? Aynı sorunları çözmek için her iki tipin de kullanılacağı anlaşılıyor.Arabirim vs işlevlerin kaydı

Sorum sadece fonksiyonel F # kodu ile ilgili ise. Harici partilere maruz kalan F # bileşenleri için, Component Design Guidelines'un, işlevlerin kaydı üzerinden arabirim yaklaşımını tercih etmeyi önerdiğini buldum.

cevap

17

Kavramsal olarak, kayıtların kayıtları arayüzlere çok benzer ve çoğu zaman, belirli bir sorunu çözmek için her ikisini de kullanabilirsiniz (yani bu harika bir & geçerli soru).

Teknik yönlerden sadece bakarsanız, o zaman en büyük fark, arayüzlerin genel yöntemlere sahip olabilmesidir.

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

Ancak uygulamada, daha önemli farklar olduğunu düşünüyorum: örneğin, aşağıdaki karşılık gelir fonksiyonların basit bir kayıt tanımlamak için bir yolu yoktur - Bu kayıtları kullanılarak yapılamaz şeydir birlikte çalışma ve tasarımı ile ilgili:

  • Arayüzler C# ve diğer NET bileşenleri
    (çok zor olurdu C# gelen fonksiyonların bir F # kaydını inşası ve çirkin) ile güzel birlikte çalışan
  • Arayüzler farklı bir niyeti ifade - Bunlar tatmin edilebilecek ve uygulanabilecek arayüz. Öte yandan
    , kayıtları oluşturulan işlevlere topluluklarıdır. Bir işlevi yerine { oldValue with NewFunction = newFunction } inşaat kullanmanız gerekiyorsa
  • Kayıtlar güzel.

Genelde, örneğin, örn. yinelemeli bir veri yapısının işleme ve with yapı gerekir. kamu API için, ben arabirimleri ve basit sınıfları kullanarak kayıtları kullanılarak daha iyi soyutlama olduğuna inanıyoruz.