В настоящее время я выполняю exercism.io дорожку F #. Для всех, кто этого не знает, он решает небольшие проблемы с TDD-стилем, чтобы изучить или улучшить язык программирования.
Последние две задачи касались использования классов в F # (или типов, поскольку они вызывается в F #). Одна из задач использует BankAccount, который имеет баланс и статус (открытый/закрытый) и может быть изменен с помощью функций. Использование было таким (взято из тестового кода):
let test () =
let account = mkBankAccount () |> openAccount
Assert.That(getBalance account, Is.EqualTo(Some 0.0)
Я написал код, который делает тестовый проход, используя неизменный класс BankAccount, с которым можно взаимодействовать с использованием бесплатных функций:
type AccountStatus = Open | Closed
type BankAccount (balance, status) =
member acc.balance = balance
member acc.status = status
let mkBankAccount () =
BankAccount (0.0, Closed)
let getBalance (acc: BankAccount) =
match acc.status with
| Open -> Some(acc.balance)
| Closed -> None
let updateBalance balance (acc: BankAccount) =
match acc.status with
| Open -> BankAccount (acc.balance + balance, Open)
| Closed -> failwith "Account is closed!"
let openAccount (acc: BankAccount) =
BankAccount (acc.balance, Open)
let closeAccount (acc: BankAccount) =
BankAccount (acc.balance, Closed)
Сделав много OO, прежде чем начать изучать F #, мне стало интересно. Как более опытные разработчики F # используют классы? Чтобы ответить на этот вопрос более просто, вот мои основные проблемы в классах/типах в F #:
- Используется ли использование классов в типичном стиле OO в F #?
- Рекомендуются ли неизменные классы? (Я нашел их в замешательстве в приведенном выше примере).
- Каков предпочтительный способ доступа/изменения данных класса в F #? (Функции члена класса и функции get/set или free, которые позволяют создавать конвейеры? Что относительно статических элементов, которые позволяют создавать трубопроводы и предоставлять функции с подходящим пространством имен?)
Прошу прощения, если вопрос нечеткий. Я не хочу разрабатывать плохие привычки кодирования в своем функциональном коде, и мне нужна начальная точка в том, что такое хорошая практика.