Вопрос про правильный выбор типа для методов и полей десериализуемого объекта
Рассмотрим следующий код:
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 делает интерфейсы более явными. Когда пользователя будет запрашивать размер полезной нагрузки, он будет совершенно ясно видеть, чем ограничен верхний предел этого значения. Однако, появляется много головной, которая связана с прослеживанием того, что нигде не происходит случайного переполнения или неожиданного неявного преобразования.