У меня есть такие части кода в проекте, и я понимаю, что это не так
написано функционально:
let data = Array.zeroCreate(3 + (int)firmwareVersions.Count * 27)
data.[0] <- 0x09uy //drcode
data.[1..2] <- firmwareVersionBytes //Number of firmware versions
let mutable index = 0
let loops = firmwareVersions.Count - 1
for i = 0 to loops do
let nameBytes = ASCIIEncoding.ASCII.GetBytes(firmwareVersions.[i].Name)
let timestampBytes = this.getTimeStampBytes firmwareVersions.[i].Timestamp
let sizeBytes = BitConverter.GetBytes(firmwareVersions.[i].Size) |> Array.rev
data.[index + 3 .. index + 10] <- nameBytes
data.[index + 11 .. index + 24] <- timestampBytes
data.[index + 25 .. index + 28] <- sizeBytes
data.[index + 29] <- firmwareVersions.[i].Status
index <- index + 27
firmwareVersions - это список, который является частью библиотеки csharp.
Он имеет (и не должен) знать, как он будет преобразован в
массив байтов. Я понимаю, что приведенный выше код не работает, поэтому я попытался
меняя это так:
let headerData = Array.zeroCreate(3)
headerData.[0] <- 0x09uy
headerData.[1..2] <- firmwareVersionBytes
let getFirmwareVersionBytes (firmware : FirmwareVersion) =
let nameBytes = ASCIIEncoding.ASCII.GetBytes(firmware.Name)
let timestampBytes = this.getTimeStampBytes firmware.Timestamp
let sizeBytes = BitConverter.GetBytes(firmware.Size) |> Array.rev
Array.concat [nameBytes; timestampBytes; sizeBytes]
let data =
firmwareVersions.ToArray()
|> Array.map (fun f -> getFirmwareVersionBytes f)
|> Array.reduce (fun acc b -> Array.concat [acc; b])
let fullData = Array.concat [headerData;data]
Так что теперь мне интересно, если это лучший (более функциональный) способ
написать код. Если так ... почему и какие улучшения я должен сделать,
если нет, почему бы и нет, и что мне делать вместо этого?
Предложения, отзывы, замечания?
Спасибо
Обновление
Просто хотел добавить еще немного информации.
Это часть некоторой библиотеки, которая обрабатывает данные для двоичного сообщения
протокол. Единственный плюс, который я вижу в первой версии кода, заключается в том, что
люди, реализующие протокол на другом языке (что имеет место
в нашей ситуации также) может получить лучшее представление о том, сколько байтов каждый
часть занимает и где именно они находятся в потоке байтов ... просто замечание.
(Поскольку не все понимают английский, но все наши партнеры могут читать код)