Вопрос про правильный выбор типа для методов и полей десериализуемого объекта

Рассмотрим следующий код:

class Packet
{
    public:
    // ...
    private:
    Header Header_;
    Payload Payload_;
};

class Header
{
    public:
    // ...
    uint16_t GetPayloadSize();
    private:
    // ...
    uint16_t PayloadSize;
};

class Payload
{
    public:
    // ...
    uint16_t GetSize();
    private:
    uint16_t Size;
    std::unique_ptr<uint8_t[]> Data;
};

Предположим, что тип Packet умеет десериализоваться из потока байтов. Также предположим, что по спецификации полезная нагрузка пакета может иметь максимальный размер в 2^16 [0; 65 535], и в потоке байтов под поле Header::PayloadSize отводится строго 2 байта.

Мой вопрос заключается в следующем.

Какой, с теоретическо-академической точки зрения, тип лучше использовать для следующих вещей:

  • Возвращаемый тип для метода Header::GetPayloadSize();
  • Возвращаемый тип для метода Payload::GetSize();
  • Тип поля Payload::Size.

С одной стороны, size_t более удобен для пользователя, потому что с размерами обычно работают через соответствующий специальный тип. То есть, при использовании типа size_t элементарно будет гораздо меньше болеть голова о всяких там неявных преобразованиях к int и возможных переполнениях в арифметических выражениях.

С другой стороны, uint16_t делает интерфейсы более явными. Когда пользователя будет запрашивать размер полезной нагрузки, он будет совершенно ясно видеть, чем ограничен верхний предел этого значения. Однако, появляется много головной, которая связана с прослеживанием того, что нигде не происходит случайного переполнения или неожиданного неявного преобразования.


Ответы (0 шт):