Я думаю, что одним из четких функциональных подходов было бы определение типа данных, представляющих различные (более сложные ситуации), с которыми вам нужно справиться. Вы упомянули, что значение может быть необязательным, и вам необходимо различать числовые и текстовые значения (для кодирования в SQL).
Вы можете определить дискриминационное объединение (если есть другие случаи, которые вы хотели бы обработать, определение может быть немного более сложным):
type SqlValue =
| Missing
| Numeric of string
| Textual of string
Обратите внимание, что в случае Textual
также содержится string
, потому что я предполагаю, что клиент, который производит значение, заботится о преобразовании его в строку - это только информация для вашего генератора SQL-запросов (чтобы он знал, является ли он нужно добавить цитаты).
Ваш элемент ToSqlValuesList
вернет список значений string & SqlValue
, поэтому, например, образец продукта может быть представлен в следующем списке:
columns = [ "Name"; "Price"; "Description" ]
values = [ Textual("Tea"); Numeric(10); Missing ]
В коде, который генерирует запрос SQL, вы будете использовать сопоставление с шаблоном для обработки всех различных случаев (что наиболее важно, кодируйте строку, чтобы избежать внедрения SQL в случае, если значение равно Textual
: -)).
РЕДАКТИРОВАТЬ Вам потребуется реализовать преобразование из определенных типов данных в представление SqlValue
в каждом клиенте. Однако это можно упростить, написав тип утилиты (используя тот факт, что члены могут быть перегружены):
type SqlValue with
static member From(a:int) = Numeric(a.ToString())
static member From(a:int option) =
match a with None -> Missing | Some(n) -> SqlValue.From(n)
// ... similarly for other types
В реализации ToSqlValuesList
вы должны написать SqlValue.From(description)
, и он будет автоматически обрабатывать детали.
Более сложным подходом было бы аннотировать открытые члены типов, представляющих ваши сущности данных, с помощью атрибутов .NET и использовать Reflection для извлечения значений (и их типов) во время выполнения. Это более продвинутый, но довольно элегантный (хороший пример этой техники в книге F # Дона Сайма «Эксперт»)