2009-10-06 13 views
7

Niedawno próbowałem nauczyć się zorientowanych obiektowo aspektów języka F # i zacząłem się zastanawiać, jak ograniczyć dostęp do typów/modułów w tym języku.Pliki sygnatur i modyfikatory dostępu w języku F #

Dokładniej, chcę znać różnicę między piśmie to:

Example.fsi

module Stack = 
    val foo : string 

Example.fs

module Stack = 
    let foo = "foo" 
    let bar = "bar" 

i alternatywnie to:

Czy nie osiągają dokładnie tego samego w końcu? Pochodzę z tła C#, jestem skłonny po prostu użyć modyfikatorów dostępu do plików sygnatur (FSI). Wydaje się, że są bardziej uniwersalne (mogą na przykład dotyczyć modułów/typów w przestrzeniach nazw), podczas gdy ja nie mam żadnej sytuacji, w której pliki sygnatur oferują coś, czego nie mają modyfikatory dostępu.

+0

Twój przykład i tak nie powinien działać ;-) (let foo _ = "bar") – Dario

+0

Dlaczego nie powinien działać? Przykład kompiluje się dobrze dla mnie. – Noldorin

+0

.fsi deklaruje foo jako funkcję, ale potem .fs definiuje ją jako wartość. – Brian

Odpowiedz

9

Osiągają prawie to samo. (Zauważ, że możesz użyć pliku .fsi dla typów w przestrzeniach nazw też był pewien, co Twój komentarz o które chodzi.)

Plik podpis ma kilka zalet:

  • można dokonać podmiotom public dla czas trwania pliku, a następnie private do kolejnych plików projektu.
  • Możesz mieć tylko krótkie podsumowanie w pliku podpisu, więc interfejs publiczny jest łatwy do odczytania bez konieczności skanowania ton kodu.

Nie można lekceważyć pierwszej kuli - hermetyzacja wewnątrz zespołu, tak jak w rzeczywistości jest bardzo dużą cechą bardzo dużych projektów. Możliwość zdefiniowania kilku typów, które są sobie nawzajem w pliku File1.fs, ale mają tylko podzbiór tych typów/metod, są jawne dla reszty (File2.fs, File3.fs, itp.) Jest całkiem przydatna (trochę jak "przyjaciel" w C++).

+1

@Brian: Dzięki za odpowiedź. Miałem na myśli dno tej strony - http://en.wikibooks.org/wiki/F_Sharp_Programming/Modules_and_Namespaces - nie mogąc korzystać z FSI w przestrzeniach nazw. Czy możesz wyjaśnić, co masz na myśli przez "kontynuację" projektu? – Noldorin

+1

Widzę, że ten dokument jest błędny; @ Juliet, jeśli to czytasz, czy zaktualizowałbyś to? Zauważ, że możesz użyć fsc --sig do pliku .fs zawierającego przestrzenie nazw, aby zobaczyć składnię dla kodu .fsi dla przestrzeni nazw. – Brian

+1

@Brian: Ach, sprawiedliwie. Przydatne małe przykazanie. Dziękuję również za wyjaśnienia. – Noldorin

Powiązane problemy