Comments 3

В статье не хватает подсветки синтаксиса — так текст будет восприниматься легче.


Несколько замечаний по коду:


Не нужно заранее делать массив больше, но зарезервировать память действительно хорошая практика.
Для этого есть метод reserve:


res.reserve(count);

Ещё есть статические массивы. Для них не нужны аллокации в кучи. Если размер массива известен на этапе компиляции, то использование такого массива может сделать программу эффективнее.


По коду, обратил внимание, что вы используете словари там, где достаточно было бы кортежей (tuple) или структур.

Спасибо за замечания.


На этапе компиляции пользовательские запросы неизвестны. Поэтому динамические массивы необходимы.


Под словарями вы имеете в виду ассоциативные массивы?


Полагаю, вместо


ubyte[string] result;

result["learn"] = (raw[0] & 0x80) >> 7;
result["number"] = raw[0] | 0x7f;

return result;

лучше делать следующим образом:


alias Dpt18Decoded = Tuple!(ubyte, "learn", ubyte, "number");
// ...

Dpt18Decoded result;
result.learn = (raw[0] & 0x80) >> 7;
result.number = raw[0] | 0x7f;

return result;

Ага. Ассоциативные массивы часто используют в динамически типизированных языках.
В D, как правило, можно обойтись более эффективным контейнером.
Структура вместо ассоциативного массива будет существенно эффективнее. Она аллоцируется на стеке. Кроме того, компилятор может делать проверки, которые не доступны при использовании словаря. Например в случае опечаток.
Ещё код можно сделать нагляднее и читабельнее, если используемые структуры данных заранее определить:


struct Dpt18Decoded
{
    ubyte learn;
    ubyte number;
}
// ...
Dpt18Decoded foo()
{
    return Dpt18Decoded( (raw[0] & 0x80) >> 7, raw[0] | 0x7f );
}
Only those users with full accounts are able to leave comments. Log in, please.