Скажем, я пишу API, и одна из моих функций принимает параметр, который представляет канал, и будет только когда-либо между значениями 0 и 15. Я мог бы написать это следующим образом:
void Func(unsigned char channel)
{
if(channel < 0 || channel > 15)
{ // throw some exception }
// do something
}
Или я использую С++, являющийся строго типизированным языком, и сделаю себе тип:
class CChannel
{
public:
CChannel(unsigned char value) : m_Value(value)
{
if(channel < 0 || channel > 15)
{ // throw some exception }
}
operator unsigned char() { return m_Value; }
private:
unsigned char m_Value;
}
Теперь моя функция становится следующей:
void Func(const CChannel &channel)
{
// No input checking required
// do something
}
Но это полный избыток? Мне нравится самодокументация и гарантия того, что она говорит, но стоит ли платить за строительство и уничтожение такого объекта, не говоря уже о дополнительном наборе текста? Пожалуйста, дайте мне знать ваши комментарии и альтернативы.