Файлы подписи и модификаторы доступа в F # - PullRequest
8 голосов
/ 06 октября 2009

Недавно я пытался изучить объектно-ориентированные аспекты F #, и мне стало любопытно, как ограничить доступ к типам / модулям в языке.

Более конкретно, я хочу знать разницу между написанием этого:

Example.fsi

module Stack =
    val foo : string

Example.fs

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

и, альтернативно, это:

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

Разве они не достигают в точности одного и того же? Исходя из C # фона, я очень склонен просто использовать модификаторы доступа к файлам подписи (FSI). Они кажутся более универсальными (например, могут применяться к модулям / типам в пространствах имен), тогда как у меня нет ситуации, когда файлы сигнатур предлагают что-то, чего нет у модификаторов доступа.

1 Ответ

11 голосов
/ 06 октября 2009

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

Файл подписи имеет пару преимуществ:

  • Вы можете сделать сущности public на время файла, а затем private для последующих файлов проекта.
  • В файле сигнатуры может быть только ваше краткое резюме, поэтому открытый интерфейс легко читается без необходимости сканировать тонны кода.

С первым маркером нельзя шутить - инкапсуляция в сборке, как это на самом деле довольно большая функция для очень больших проектов. Возможность определить несколько типов, которые являются открытыми друг для друга в File1.fs, но при этом иметь подмножество этих типов / методов, быть общедоступными для остальных (File2.fs, File3.fs и т. Д.) Весьма полезна ( немного похоже на «друга» в C ++).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...