Изолировать разделение состояния объекта? - PullRequest
0 голосов
/ 01 октября 2018

В моем коде используется следующая общая библиотека

Module Shared
let state = new AClrClass()
let fun1 x .... = // shared function
    .... // uses state

В примерах использования общей библиотеки state совместно используется всеми функциями, даже если несколько функций main (в следующем коде)вызывается параллельно.

Module Caller
let f1 x = Shared.fun1 x .... // other code omitted 
let f2 x = Shared.fun1 x .... // many other functions uses the function in the Shared lib
let main () = // entry point of the module. Calls f1, f2, f3... 

Теперь мне нужно переключиться на другую реализацию Shared, которая определяет класс (поэтому каждый вызов Caller.main будет иметь свой собственный state)

Module Shared
type Shared () =
  let state = new AClrClass()
  member __.Fun1 x .... = // shared function
    .... // uses state

Мне нужно обновить модуль Caller.Могут быть следующие подходы

  1. Добавить еще один параметр aClrObj ко всем функциям вызова общей библиотеки

    Module Caller
    let f1 o x .... = o.Fun1 x .... // other code omitted 
    let f2 o x .... = o.Fun1 x .... // many other functions uses the function in the Shared lib
    let main () = // entry point of the module. Calls f1, f2, f3... 
        let aClrObj = new AClrClass()
        f1 aClrOjb x ....
    
  2. Определитьизменяемой переменной и установите ее в функции main.

    Module Caller
    let mutable o = new AClrClass()
    let f1 x .... = o.Fun1 x .... // other code omitted 
    let f2 x .... = o.Fun1 x .... // many other functions uses the function in the Shared lib
    let main () = // entry point of the module. Calls f1, f2, f3... 
        o <- new AClrClass()
        let aClrObj = new AClrClass()
        f1 aClrOjb x ....
    

Какой подход более идиоматичен для F #?Как должен быть построен код?

1 Ответ

0 голосов
/ 01 октября 2018

Расширение из моего комментария

Из ваших примеров кода не совсем ясно, что именно должен делать ваш модуль.Однако, как правило, вы можете передавать состояние через функции, заставляя каждую функцию принимать состояние в качестве последнего параметра и возвращать новое состояние в качестве значения.Затем ваша main функция (или любая другая функция, которая доступна публично) может инициализировать состояние и передать его через любые функции, которые она вызывает для выполнения работы, возвращая конечное состояние.

Вот простой пример:

type State = State of int

let add x (State state) =
    State (state + x)

let subtract x (State state) =
    State (state - x)

let multiply x (State state) =
    State (state * x)

let divide x (State state) =
    State (state / x)

let main () =
    State 0
    |> add 3
    |> multiply 4
    |> subtract 2
    |> divide 5
    // returns (State 2)

При этом используется объект State для передачи текущего состояния выполнения через каждую функцию.Каждая функция принимает текущее состояние и выполняет с ним свою операцию, возвращая новое состояние.Функция main использует другие функции для выполнения определенной, более сложной операции, пропуская текущее состояние через каждую функцию с помощью оператора конвейерной передачи.

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