Это вопрос о том, как я должен организовать свой код F#. Надеюсь, это не нарушение SO
правил.
У меня есть десятки исходных файлов (имена, оканчивающиеся на .fs
) в моем проекте. Каждый файл содержит модуль. В некоторых из этих файлов/модулей я определяю только функции. В других я определяю функции и другие значения (не функции).
Последний файл в Solution Explorer
(Visual Studio
) — это Program.fs
, который на самом деле содержит очень мало кода. Большинство расчетов было сделано «над» ним.
Я рассматриваю возможность перемещения нефункциональных значений, объявленных в других модулях, в Program.fs
. Вот преимущества и недостатки, которые я вижу в этом изменении:
Преимущества:
1) Лучшее представление о потоке программы.
2) Проще выделить весь код выше определенной строки и отправить на исполнение в FSI.
3) Немного проще искать эти значения в редакторе.
4) Возможно, проще отладить, поставив точки останова на строки, где объявлены значения.
Недостатки:
1) Program.fs
мог стать большим и громоздким.
2) Потеря модульности.
3) После внесения изменений, если вычисление значения y
в модуле B
зависит от значения x
в модуле A
"над" ним, то я больше не могу иметь y
в качестве значения, оно должно быть объявлено как функция x
. Точно так же, если объявление функции в модуле B
зависит от значения в модуле A
, я должен добавить параметр в определение функции.
Ниже приведены два примера одной и той же небольшой программы, созданной двумя альтернативными методами. Какой из двух лучше вообще?
// ///////////////// Values in modules \\\\\\\\\\\\\\\\\\\\
// File A.fs
module A
let i = 1
let add x y : float = x + y
// File B.fs
module B
let sqr z = z * z + float i
let x = sqr 99.9
// File Program.fs
open A
open B
let y =
add (float i) x
|> sqr
printfn "%f" y
[<EntryPoint>]
let main argv =
printfn "%A" argv
0 // return an integer exit code
// This is the calculated value for y: 99640524.640100
// ///////////////// Values in Program.fs \\\\\\\\\\\\\\\\\\\\
// File A.fs
module A
let add x y : float = x + y
// File B.fs
module B
open A
let sqr i z = z * z + float i // notice the additional parameter
//File Program.fs
open A
open B
let i = 1
let x = sqr i 99.9
let y =
add (float i) x
|> sqr i
printfn "%f" y
[<EntryPoint>]
let main argv =
printfn "%A" argv
0 // return an integer exit code
// This is the calculated value for y: 99640524.640100